2026-05-28T09:00:22.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-28T09:00:22.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:00:22.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:00:22.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:00:22.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:00:22.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:00:22.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:00:22.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:00:22.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:00:22.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:00:22.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:00:22.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:00:22.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:00:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:00:22.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:00:22.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:00:22.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:00:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:00:22.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:00:22.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:00:22.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:00:22.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:00:22.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:00:22.764 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:00:22.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:00:22
2026-05-28T09:00:22.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68568, datetime.datetime(2026, 5, 28, 9, 0, 22), datetime.datetime(2026, 5, 28, 9, 0, 21), 'salt', 9.1, 52.86, None, 10.91, 270.26, 9.1, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:00:22.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:00:22.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:00:22.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:21, diff=1.827526s, valid=True
2026-05-28T09:00:22.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:00:22.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:00:22.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:12, diff=10.830447s, valid=True
2026-05-28T09:00:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:00:22.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:19, diff=3.837233s, valid=True
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:00:22.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:00:22.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:12, diff=10.840256s, valid=True
2026-05-28T09:00:22.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:00:22.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:00:22.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:00:22.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884264.841384s, valid=True
2026-05-28T09:00:22.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:00:22.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:00:22.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:00:22.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:00:22.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:00:22.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:00:22.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:00:22.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:00:22.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:00:22.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:00:23.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:00:23.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:00:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:00:23.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:00:23.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:00:23.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:00:23.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:00:23.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:00:23.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-28T09:00:23.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-28T09:00:24.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:00:24.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:00:54.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:00:54.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:00:54.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:00:54.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:00:54.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:00:54.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:00:54.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-28T09:00:54.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:00:54.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-28T09:00:54.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:00:54.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:00:54.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:00:54.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-28T09:00: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-28T09:00:57.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:00:57.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:00:57.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:00:57.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:00:57.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:00:57.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:00:57.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:00:57.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:00:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:00:57.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:00:57.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:00:57.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:00:57.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:00:57.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:00:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:00:57.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:00:57.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:00:57.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:00:57.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:00:57.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:00:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:00:57.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:00:57.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:00:57.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:00:53
2026-05-28T09:00:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68569, datetime.datetime(2026, 5, 28, 9, 0, 53), datetime.datetime(2026, 5, 28, 9, 0, 52), 'salt', 9.14, 50.97, None, 10.41, 266.91, 9.61, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:00:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:00:57.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:00:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:52, diff=5.706518s, valid=True
2026-05-28T09:00:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:00:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:00:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:12, diff=-14.290638s, valid=True
2026-05-28T09:00:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:00:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:00:57.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:00:50, diff=7.715928s, valid=True
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:00:57.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:00:57.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:12, diff=-14.281051s, valid=True
2026-05-28T09:00:57.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:00:57.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:00:57.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:00:57.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884299.719591s, valid=True
2026-05-28T09:00:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:00:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:00:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:00:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:00:57.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:00:57.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:00:57.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:00:57.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:00:57.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:00:57.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:00:57.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:00:58.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:00:58.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:00:58.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:00:58.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:00:58.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:00:58.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:00:58.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:00:58.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-28T09:00:58.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-28T09:00:58.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:00:58.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:01:28.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:01:28.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:01:28.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:01:29.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:01:29.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:01:29.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:01:29.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-28T09:01:29.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:01:29.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-28T09:01:29.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:01:29.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:01:29.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:01: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-28T09:01:32.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-28T09:01:32.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:01:32.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:01:32.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:01:32.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:01:32.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:01:32.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:01:32.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:01:32.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:01:32.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:01:32.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:01:32.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:01:32.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:01:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:01:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:01:32.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:01:32.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:01:32.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:01:32.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:01:32.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:01:32.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:01:32.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:01:32.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:01:32.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:01:32.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:01:23
2026-05-28T09:01:32.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68570, datetime.datetime(2026, 5, 28, 9, 1, 23), datetime.datetime(2026, 5, 28, 9, 1, 23), 'salt', 9.07, 50.38, None, 11.12, 274.56, 9.76, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:01:32.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:01:32.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:01:32.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:23, diff=9.450768s, valid=True
2026-05-28T09:01:32.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:01:32.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:01:32.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:12, diff=20.453785s, valid=True
2026-05-28T09:01:32.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:01:32.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:22, diff=10.4605s, valid=True
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:01:32.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:01:32.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:12, diff=20.463541s, valid=True
2026-05-28T09:01:32.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:01:32.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:01:32.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:01:32.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884334.46421s, valid=True
2026-05-28T09:01:32.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:01:32.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:01:32.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:01:32.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:01:32.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:01:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:01:32.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:01:32.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:01:32.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:01:32.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:01:32.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:01:32.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:01:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:01:32.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:01:32.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:01:33.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:01:33.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:01:33.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:01:33.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-28T09:01:33.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-28T09:01:33.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:01:33.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:02:03.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:02:03.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:02:03.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:02:04.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:02:04.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:02:04.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:02:04.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-28T09:02:04.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:02:04.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-28T09:02:04.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:02:04.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:02:04.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:02:04.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-28T09:02:06.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-28T09:02:06.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:02:06.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:02:06.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:02:06.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:02:06.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:02:06.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:02:06.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:02:06.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:02:06.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:02:06.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:02:06.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:02:06.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:02:06.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:02:06.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:02:06.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:02:06.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:02:07.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:02:07.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:02:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:02:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:02:07.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:02:07.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:02:07.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:02:07.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:01:54
2026-05-28T09:02:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68571, datetime.datetime(2026, 5, 28, 9, 1, 54), datetime.datetime(2026, 5, 28, 9, 1, 54), 'salt', 9.1, 50.77, None, 10.59, 271.01, 9.66, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:02:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:02:07.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:02:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:54, diff=13.139051s, valid=True
2026-05-28T09:02:07.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:02:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:02:07.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:12, diff=-4.858056s, valid=True
2026-05-28T09:02:07.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:02:07.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:01:53, diff=14.148559s, valid=True
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:02:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:02:07.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:02:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:12, diff=-4.848399s, valid=True
2026-05-28T09:02:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:02:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:02:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:02:07.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884369.152256s, valid=True
2026-05-28T09:02:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:02:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:02:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:02:07.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:02:07.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:02:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:02:07.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:02:07.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:02:07.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:02:07.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:02:07.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:02:07.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:02:07.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:02:07.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:02:07.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:02:08.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:02:08.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:02:08.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:02:08.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-28T09:02:08.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-28T09:02:08.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:02:08.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:02:38.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:02:38.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:02:38.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:02:38.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:02:38.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:02:38.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:02:38.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-28T09:02:38.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:02:38.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-28T09:02:38.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:02:38.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:02:38.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:02:38.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-28T09:02:41.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-28T09:02:41.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:02:41.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:02:41.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:02:41.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:02:41.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:02:41.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:02:41.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:02:41.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:02:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:02:41.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:02:41.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:02:41.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:02:41.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:02:41.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:02:41.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:02:41.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:02:41.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:02:41.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:02:41.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:02:41.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:02:41.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:02:41.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:02:41.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:02:41.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:02:24
2026-05-28T09:02:41.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68572, datetime.datetime(2026, 5, 28, 9, 2, 24), datetime.datetime(2026, 5, 28, 9, 2, 24), 'salt', 9.17, 51.37, None, 10.41, 266.86, 9.5, 829.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:02:41.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:02:41.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:02:41.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:24, diff=17.591642s, valid=True
2026-05-28T09:02:41.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:02:41.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:02:41.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:12, diff=29.594571s, valid=True
2026-05-28T09:02:41.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:02:41.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:20, diff=21.601333s, valid=True
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:02:41.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:02:41.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:12, diff=29.604384s, valid=True
2026-05-28T09:02:41.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:02:41.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:02:41.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:02:41.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884403.60505s, valid=True
2026-05-28T09:02:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:02:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:02:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:02:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:02:41.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:02:41.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:02:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:02:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:02:41.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:02:41.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:02:41.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:02:41.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:02:41.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:02:41.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:02:42.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:02:42.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:02:42.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:02:42.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:02:42.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-28T09:02:42.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-28T09:02:42.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:02:42.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:03:12.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:03:12.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:03:12.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:03:13.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:03:13.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:03:13.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:03:13.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-28T09:03:13.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:03:13.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-28T09:03:13.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:03:13.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:03:13.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:03:13.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-28T09:03:15.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:03:15.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:03:15.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:03:15.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:03:15.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:03:15.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:03:15.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:03:15.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:03:15.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:03:15.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:03:15.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:03:15.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:03:15.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:03:16.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:03:16.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:03:16.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:03:16.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:03:16.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:03:16.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:03:16.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:03:16.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:03:16.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:03:16.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:03:16.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:03:16.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:02:54
2026-05-28T09:03:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68573, datetime.datetime(2026, 5, 28, 9, 2, 54), datetime.datetime(2026, 5, 28, 9, 2, 54), 'salt', 9.14, 51.7, None, 10.59, 268.52, 9.42, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:03:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:03:16.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:03:16.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:54, diff=22.24971s, valid=True
2026-05-28T09:03:16.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:03:16.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:03:16.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:12, diff=4.252501s, valid=True
2026-05-28T09:03:16.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:03:16.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:02:50, diff=26.259216s, valid=True
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:03:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:03:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:12, diff=4.262218s, valid=True
2026-05-28T09:03:16.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:03:16.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:03:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:03:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884438.262892s, valid=True
2026-05-28T09:03:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:03:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:03:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:03:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:03:16.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:03:16.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:03:16.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:03:16.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:03:16.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:03:16.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:03:16.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:03:16.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:03:16.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:03:16.581 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:03:16.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:03:17.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:03:17.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:03:17.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:03:17.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-28T09:03:17.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-28T09:03:17.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:03:17.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:03:47.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:03:47.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:03:47.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:03:48.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:03:48.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:03:48.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:03:48.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-28T09:03:48.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:03:48.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-28T09:03:48.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:03:48.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:03:48.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:03:48.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-28T09:03:50.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-28T09:03:50.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:03:50.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:03:50.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:03:50.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:03:50.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:03:50.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:03:50.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:03:50.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:03:50.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:03:50.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:03:50.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:03:50.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:03:50.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:03:50.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:03:50.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:03:50.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:03:50.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:03:50.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:03:50.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:03:50.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:03:50.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:03:50.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:03:50.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:03:51.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:03:25
2026-05-28T09:03:51.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68574, datetime.datetime(2026, 5, 28, 9, 3, 25), datetime.datetime(2026, 5, 28, 9, 3, 24), 'salt', 9.14, 51.97, None, 11.54, 269.74, 9.35, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:03:51.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:03:51.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:03:51.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:24, diff=27.034021s, valid=True
2026-05-28T09:03:51.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:03:51.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:03:51.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:12, diff=39.036881s, valid=True
2026-05-28T09:03:51.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:03:51.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:21, diff=30.043445s, valid=True
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:03:51.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:03:51.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:03:12, diff=39.046461s, valid=True
2026-05-28T09:03:51.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:03:51.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:03:51.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:03:51.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884473.047124s, valid=True
2026-05-28T09:03:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:03:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:03:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:03:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:03:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:03:51.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:03:51.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:03:51.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:03:51.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:03:51.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:03:51.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:03:51.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:03:51.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:03:51.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:03:51.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:03:51.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:03:52.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:03:52.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:03:52.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-28T09:03:52.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-28T09:03:52.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:03:52.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:04:22.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:04:22.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:04:22.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:04:22.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:04:23.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:04:23.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:04:23.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-28T09:04:23.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:04:23.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-28T09:04:23.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:04:23.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:04:23.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:04:23.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-28T09:04:25.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-28T09:04:25.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:04:25.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:04:25.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:04:25.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:04:25.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:04:25.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:04:25.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:04:25.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:04:25.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:04:25.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:04:25.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:04:25.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:04:25.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:04:25.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:04:25.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:04:25.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:04:25.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:04:25.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:04:25.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:04:25.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:04:25.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:04:25.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:04:25.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:04:26.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:04:25
2026-05-28T09:04:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68576, datetime.datetime(2026, 5, 28, 9, 4, 25), datetime.datetime(2026, 5, 28, 9, 4, 25), 'salt', 9.2, 52.8, None, 10.48, 260.35, 9.13, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:04:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:04:26.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:04:26.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:25, diff=1.035316s, valid=True
2026-05-28T09:04:26.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:04:26.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:04:26.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:12, diff=14.038184s, valid=True
2026-05-28T09:04:26.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:04:26.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:04:26.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:21, diff=5.044844s, valid=True
2026-05-28T09:04:26.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:04:26.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:04:26.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:04:26.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:04:26.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:04:26.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:04:26.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:12, diff=14.047882s, valid=True
2026-05-28T09:04:26.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:04:26.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:04:26.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:04:26.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884508.048531s, valid=True
2026-05-28T09:04:26.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:04:26.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:04:26.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:04:26.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:04:26.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:04:26.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:04:26.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:04:26.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:04:26.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:04:26.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:04:26.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:04:26.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:04:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:04:26.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:04:26.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:04:26.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:04:27.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:04:27.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:04:27.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-28T09:04:27.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-28T09:04:27.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:04:27.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:04:57.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:04:57.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:04:57.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:04:57.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:04:57.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:04:57.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:04:57.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-28T09:04:57.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:04:57.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-28T09:04:57.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:04:57.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:04:57.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:04:57.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-28T09:05:00.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-28T09:05:00.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:05:00.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:05:00.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:05:00.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:05:00.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:05:00.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:05:00.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:05:00.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:05:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:05:00.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:05:00.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:05:00.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:05:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:05:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:05:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:05:00.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:05:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:05:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:05:00.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:05:00.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:05:00.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:05:00.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:05:00.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:05:00.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:04:55
2026-05-28T09:05:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68577, datetime.datetime(2026, 5, 28, 9, 4, 55), datetime.datetime(2026, 5, 28, 9, 4, 55), 'salt', 9.27, 53.83, None, 10.31, 261.33, 8.87, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:05:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:05:00.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:05:00.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:55, diff=5.449808s, valid=True
2026-05-28T09:05:00.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:05:00.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:05:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:12, diff=-11.547343s, valid=True
2026-05-28T09:05:00.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:05:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:04:51, diff=9.459326s, valid=True
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:05:00.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:05:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:12, diff=-11.537666s, valid=True
2026-05-28T09:05:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:05:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:05:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:05:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884542.463007s, valid=True
2026-05-28T09:05:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:05:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:05:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:05:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:05:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:05:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:05:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:05:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:05:00.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:05:00.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:05:00.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:05:00.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:05:00.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:05:00.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:05:01.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:05:01.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:05:01.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:05:01.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:05:01.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-28T09:05:01.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-28T09:05:01.783 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:05:01.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:05:31.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:05:31.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:05:31.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:05:32.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:05:32.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:05:32.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:05:32.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-28T09:05:32.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:05:32.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:05:32.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:05:32.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:05:32.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:05:32.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-28T09:05:34.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:05:34.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:05:34.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:05:34.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:05:34.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:05:34.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:05:34.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:05:34.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:05:34.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:05:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:05:34.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:05:34.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:05:34.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:05:34.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:05:34.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:05:34.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:05:34.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:05:34.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:05:34.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:05:34.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:05:34.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:05:34.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:05:34.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:05:34.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:05:34.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:05:26
2026-05-28T09:05:34.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68578, datetime.datetime(2026, 5, 28, 9, 5, 26), datetime.datetime(2026, 5, 28, 9, 5, 25), 'salt', 9.17, 54.16, None, 9.92, 261.19, 8.78, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:05:34.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:05:34.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:05:34.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:25, diff=9.996166s, valid=True
2026-05-28T09:05:34.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:05:34.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:05:34.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:12, diff=22.999024s, valid=True
2026-05-28T09:05:34.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:05:34.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:05:35.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:23, diff=12.005755s, valid=True
2026-05-28T09:05:35.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:05:35.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:05:35.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:05:35.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:05:35.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:05:35.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:05:35.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:12, diff=23.008813s, valid=True
2026-05-28T09:05:35.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:05:35.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:05:35.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:05:35.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884577.009469s, valid=True
2026-05-28T09:05:35.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:05:35.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:05:35.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:05:35.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:05:35.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:05:35.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:05:35.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:05:35.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:05:35.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:05:35.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:05:35.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:05:35.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:05:35.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:05:35.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:05:35.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:05:35.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:05:35.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:05:35.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:05:35.979 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:05:35.979 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:05:36.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:05:36.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:06:06.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:06:06.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:06:06.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:06:06.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:06:06.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:06:07.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:06:07.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-28T09:06:07.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:06:07.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:06:07.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:06:07.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:06:07.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:06:07.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:06:09.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:06:09.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:06:09.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:06:09.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:06:09.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:06:09.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:06:09.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:06:09.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:06:09.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:06:09.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:06:09.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:06:09.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:06:09.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:06:09.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:06:09.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:06:09.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:06:09.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:06:09.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:06:09.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:06:09.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:06:09.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:06:09.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:06:09.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:06:09.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:06:09.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:05:56
2026-05-28T09:06:09.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68579, datetime.datetime(2026, 5, 28, 9, 5, 56), datetime.datetime(2026, 5, 28, 9, 5, 55), 'salt', 9.23, 53.63, None, 9.99, 256.99, 8.91, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:06:09.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:06:09.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:06:09.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:55, diff=14.857436s, valid=True
2026-05-28T09:06:09.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:06:09.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:06:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:12, diff=-2.139597s, valid=True
2026-05-28T09:06:09.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:06:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:05:54, diff=15.867235s, valid=True
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:06:09.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:06:09.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:12, diff=-2.129537s, valid=True
2026-05-28T09:06:09.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:06:09.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:06:09.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:06:09.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884611.871173s, valid=True
2026-05-28T09:06:09.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:06:09.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:06:09.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:06:09.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:06:09.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:06:09.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:06:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:06:09.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:06:09.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:06:10.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:06:10.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:06:10.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:06:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:06:10.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:06:10.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:06:10.860 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:06:10.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:06:10.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:06:10.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-28T09:06:10.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-28T09:06:11.199 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:06:11.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:06:41.229 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:06:41.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:06:41.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:06:41.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:06:41.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:06:41.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:06:41.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-28T09:06:41.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:06:41.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-28T09:06:41.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:06:41.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:06:41.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:06:41.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-28T09:06:44.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-28T09:06:44.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:06:44.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:06:44.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:06:44.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:06:44.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:06:44.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:06:44.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:06:44.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:06:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:06:44.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:06:44.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:06:44.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:06:44.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:06:44.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:06:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:06:44.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:06:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:06:44.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:06:44.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:06:44.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:06:44.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:06:44.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:06:44.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:06:44.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:06:26
2026-05-28T09:06:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68580, datetime.datetime(2026, 5, 28, 9, 6, 26), datetime.datetime(2026, 5, 28, 9, 6, 26), 'salt', 9.07, 54.32, None, 12.81, 261.99, 8.73, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:06:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:06:44.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:06:44.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:26, diff=18.461269s, valid=True
2026-05-28T09:06:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:06:44.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:06:44.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:12, diff=32.465312s, valid=True
2026-05-28T09:06:44.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:06:44.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:06:44.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:25, diff=19.472783s, valid=True
2026-05-28T09:06:44.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:06:44.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:06:44.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:06:44.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:06:44.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:06:44.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:06:44.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:12, diff=32.476499s, valid=True
2026-05-28T09:06:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:06:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:06:44.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:06:44.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884646.477253s, valid=True
2026-05-28T09:06:44.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:06:44.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:06:44.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:06:44.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:06:44.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:06:44.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:06:44.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:06:44.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:06:44.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:06:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:06:44.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:06:44.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:06:44.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:06:44.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:06:45.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:06:45.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:06:45.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:06:45.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:06:45.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-28T09:06:45.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-28T09:06:45.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:06:45.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:07:15.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:07:15.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:07:15.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:07:15.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:07:15.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:07:16.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:07:16.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-28T09:07:16.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:07:16.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-28T09:07:16.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:07:16.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:07:16.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:07:16.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-28T09:07:19.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-28T09:07:19.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:07:19.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:07:19.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:07:19.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:07:19.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:07:19.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:07:19.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:07:19.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:07:19.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:07:19.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:07:19.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:07:19.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:07:19.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:07:19.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:07:19.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:07:19.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:07:19.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:07:19.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:07:19.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:07:19.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:07:19.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:07:19.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:07:19.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:07:19.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:06:56
2026-05-28T09:07:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68581, datetime.datetime(2026, 5, 28, 9, 6, 56), datetime.datetime(2026, 5, 28, 9, 6, 56), 'salt', 9.1, 54.66, None, 12.63, 265.33, 8.64, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:07:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:07:19.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:07:19.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:56, diff=23.438934s, valid=True
2026-05-28T09:07:19.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:07:19.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:07:19.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:12, diff=7.44225s, valid=True
2026-05-28T09:07:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:07:19.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:07:19.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:06:52, diff=27.448846s, valid=True
2026-05-28T09:07:19.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:07:19.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:07:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:07:19.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:07:19.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:07:19.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:07:19.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:12, diff=7.451869s, valid=True
2026-05-28T09:07:19.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:07:19.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:07:19.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:07:19.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884681.452558s, valid=True
2026-05-28T09:07:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:07:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:07:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:07:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:07:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:07:19.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:07:19.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:07:19.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:07:19.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:07:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:07:19.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:07:19.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:07:19.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:07:19.880 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:07:20.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:07:20.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:07:20.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:07:20.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:07:20.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-28T09:07:20.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-28T09:07:20.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:07:20.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:07:50.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:07:50.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:07:50.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:07:51.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:07:51.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:07:51.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:07:51.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-28T09:07:51.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:07:51.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-28T09:07:51.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:07:51.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:07:51.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:07:51.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-28T09:07:53.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-28T09:07:53.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:07:53.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:07:53.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:07:53.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:07:53.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:07:53.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:07:53.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:07:53.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:07:53.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:07:53.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:07:53.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:07:53.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:07:53.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:07:53.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:07:54.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:07:54.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:07:54.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:07:54.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:07:54.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:07:54.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:07:54.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:07:54.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:07:54.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:07:54.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:07:27
2026-05-28T09:07:54.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68582, datetime.datetime(2026, 5, 28, 9, 7, 27), datetime.datetime(2026, 5, 28, 9, 7, 26), 'salt', 9.17, 54.89, None, 12.56, 256.57, 8.59, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:07:54.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:07:54.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:07:54.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:26, diff=28.17417s, valid=True
2026-05-28T09:07:54.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:07:54.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:07:54.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:12, diff=42.177031s, valid=True
2026-05-28T09:07:54.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:07:54.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:07:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:22, diff=32.183687s, valid=True
2026-05-28T09:07:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:07:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:07:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:07:54.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:07:54.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:07:54.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:07:54.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:07:12, diff=42.186712s, valid=True
2026-05-28T09:07:54.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:07:54.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:07:54.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:07:54.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884716.18738s, valid=True
2026-05-28T09:07:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:07:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:07:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:07:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:07:54.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:07:54.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:07:54.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:07:54.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:07:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:07:54.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:07:54.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:07:54.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:07:54.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:07:54.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:07:54.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:07:55.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:07:55.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:07:55.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:07:55.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-28T09:07:55.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-28T09:07:56.985 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:07:56.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:08:26.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:08:26.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:08:26.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:08:27.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:08:27.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:08:27.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:08:27.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-28T09:08:27.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:08:27.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-28T09:08:27.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:08:27.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:08:27.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:08:27.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-28T09:08:29.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-28T09:08:29.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:08:29.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:08:29.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:08:29.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:08:29.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:08:29.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:08:29.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:08:29.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:08:29.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:08:29.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:08:29.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:08:29.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:08:30.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:08:30.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:08:30.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:08:30.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:08:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:08:30.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:08:30.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:08:30.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:08:30.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:08:30.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:08:30.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:08:30.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:08:27
2026-05-28T09:08:30.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68584, datetime.datetime(2026, 5, 28, 9, 8, 27), datetime.datetime(2026, 5, 28, 9, 8, 27), 'salt', 9.23, 55.65, None, 10.09, 261.33, 8.4, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:08:30.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:08:30.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:08:30.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:27, diff=3.301815s, valid=True
2026-05-28T09:08:30.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:08:30.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:08:30.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:12, diff=18.304676s, valid=True
2026-05-28T09:08:30.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:08:30.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:23, diff=7.311247s, valid=True
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:08:30.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:08:30.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:12, diff=18.314256s, valid=True
2026-05-28T09:08:30.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:08:30.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:08:30.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:08:30.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884752.314923s, valid=True
2026-05-28T09:08:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:08:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:08:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:08:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:08:30.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:08:30.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:08:30.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:08:30.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:08:30.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:08:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:08:30.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:08:30.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:08:30.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:08:30.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:08:30.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:08:31.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:08:31.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:08:31.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:08:31.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-28T09:08:31.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-28T09:08:31.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:08:31.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:09:01.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:09:01.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:09:01.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:09:02.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:09:02.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:09:02.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:09:02.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:09:02.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:09:02.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:09:02.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:09:02.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:09:02.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:09:02.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-28T09:09:04.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-28T09:09:04.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:09:04.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:09:04.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:09:04.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:09:04.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:09:04.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:09:04.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:09:04.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:09:04.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:09:04.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:09:04.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:09:04.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:09:04.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:09:04.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:09:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:09:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:09:04.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:09:04.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:09:05.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:09:05.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:09:05.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:09:05.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:09:05.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:09:05.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:08:57
2026-05-28T09:09:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68585, datetime.datetime(2026, 5, 28, 9, 8, 57), datetime.datetime(2026, 5, 28, 9, 8, 57), 'salt', 9.2, 56.18, None, 9.85, 269.76, 8.27, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:09:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:09:05.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:09:05.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:57, diff=8.073487s, valid=True
2026-05-28T09:09:05.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:09:05.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:09:05.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:12, diff=-6.923578s, valid=True
2026-05-28T09:09:05.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:09:05.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:08:53, diff=12.083161s, valid=True
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:09:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:09:05.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:12, diff=-6.913846s, valid=True
2026-05-28T09:09:05.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:09:05.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:09:05.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:09:05.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884787.086832s, valid=True
2026-05-28T09:09:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:09:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:09:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:09:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:09:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:09:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:09:05.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:09:05.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:09:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:09:05.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:09:05.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:09:05.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:09:05.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:09:05.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:09:05.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:09:06.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:09:06.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:09:06.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:09:06.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-28T09:09:06.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-28T09:09:06.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:09:06.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:09:36.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:09:36.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:09:36.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:09:36.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:09:36.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:09:36.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:09:36.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-28T09:09:36.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:09:36.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-28T09:09:36.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:09:36.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:09:36.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:09:36.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-28T09:09:39.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-28T09:09:39.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:09:39.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:09:39.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:09:39.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:09:39.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:09:39.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:09:39.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:09:39.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:09:39.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:09:39.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:09:39.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:09:39.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:09:39.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:09:39.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:09:39.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:09:39.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:09:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:09:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:09:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:09:39.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:09:39.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:09:39.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:09:39.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:09:39.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:09:27
2026-05-28T09:09:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68586, datetime.datetime(2026, 5, 28, 9, 9, 27), datetime.datetime(2026, 5, 28, 9, 9, 27), 'salt', 9.13, 54.55, None, 11.72, 268.75, 8.67, 829.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:09:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:09:39.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:09:39.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:27, diff=12.682238s, valid=True
2026-05-28T09:09:39.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:09:39.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:09:39.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:12, diff=27.685046s, valid=True
2026-05-28T09:09:39.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:09:39.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:09:39.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:24, diff=15.691766s, valid=True
2026-05-28T09:09:39.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:09:39.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:09:39.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:09:39.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:09:39.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:09:39.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:09:39.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:12, diff=27.694753s, valid=True
2026-05-28T09:09:39.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:09:39.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:09:39.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:09:39.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884821.695405s, valid=True
2026-05-28T09:09:39.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:09:39.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:09:39.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:09:39.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:09:39.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:09:39.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:09:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:09:39.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:09:39.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:09:39.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:09:39.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:09:39.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:09:39.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:09:40.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:09:40.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:09:40.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:09:40.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:09:40.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:09:40.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-28T09:09:40.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-28T09:09:40.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:09:40.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:10:10.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:10:10.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:10:10.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:10:11.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:10:11.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:10:11.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:10:11.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-28T09:10:11.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:10:11.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-28T09:10:11.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:10:11.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:10:11.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:10:11.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-28T09:10: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-28T09:10:14.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:10:14.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:10:14.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:10:14.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:10:14.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:10:14.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:10:14.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:10:14.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:10:14.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:10:14.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:10:14.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:10:14.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:10:14.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:10:14.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:10:14.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:10:14.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:10:14.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:10:14.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:10:14.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:10:14.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:10:14.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:10:14.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:10:14.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:10:14.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:09:58
2026-05-28T09:10:14.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68587, datetime.datetime(2026, 5, 28, 9, 9, 58), datetime.datetime(2026, 5, 28, 9, 9, 57), 'salt', 9.2, 53.89, None, 11.79, 264.12, 8.85, 829.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:10:14.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:10:14.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:10:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:57, diff=17.365708s, valid=True
2026-05-28T09:10:14.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:10:14.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:10:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:12, diff=2.368534s, valid=True
2026-05-28T09:10:14.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:10:14.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:09:55, diff=19.375148s, valid=True
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:10:14.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:10:14.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:12, diff=2.378159s, valid=True
2026-05-28T09:10:14.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:10:14.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:10:14.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:10:14.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884856.378829s, valid=True
2026-05-28T09:10:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:10:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:10:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:10:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:10:14.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:10:14.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:10:14.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:10:14.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:10:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:10:14.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:10:14.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:10:14.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:10:14.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:10:14.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:10:14.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:10:15.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:10:15.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:10:15.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:10:15.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-28T09:10:15.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-28T09:10:15.716 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:10:15.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:10:45.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:10:45.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:10:45.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:10:46.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:10:46.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:10:46.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:10:46.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:10:46.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:10:46.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-28T09:10:46.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:10:46.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:10:46.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:10:46.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-28T09:10:48.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-28T09:10:48.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:10:48.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:10:48.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:10:48.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:10:48.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:10:48.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:10:48.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:10:48.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:10:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:10:48.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:10:48.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:10:48.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:10:48.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:10:48.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:10:48.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:10:48.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:10:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:10:49.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:10:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:10:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:10:49.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:10:49.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:10:49.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:10:49.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:10:28
2026-05-28T09:10:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68588, datetime.datetime(2026, 5, 28, 9, 10, 28), datetime.datetime(2026, 5, 28, 9, 10, 28), 'salt', 9.17, 53.06, None, 12.0, 267.27, 9.06, 829.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:10:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:10:49.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:10:49.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:28, diff=21.126908s, valid=True
2026-05-28T09:10:49.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:10:49.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:10:49.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:12, diff=37.129782s, valid=True
2026-05-28T09:10:49.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:10:49.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:26, diff=23.136574s, valid=True
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:10:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:10:49.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:10:49.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:12, diff=37.139701s, valid=True
2026-05-28T09:10:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:10:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:10:49.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:10:49.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884891.140363s, valid=True
2026-05-28T09:10:49.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:10:49.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:10:49.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:10:49.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:10:49.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:10:49.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:10:49.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:10:49.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:10:49.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:10:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:10:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:10:49.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:10:49.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:10:49.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:10:49.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:10:50.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:10:50.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:10:50.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:10:50.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-28T09:10:50.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-28T09:10:50.455 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:10:50.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:11:20.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:11:20.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:11:20.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:11:20.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:11:20.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:11:21.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:11:21.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-28T09:11:21.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:11:21.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-28T09:11:21.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:11:21.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:11:21.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:11:21.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-28T09:11:23.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:11:23.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:11:23.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:11:23.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:11:23.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:11:23.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:11:23.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:11:23.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:11:23.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:11:23.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:11:23.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:11:23.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:11:23.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:11:23.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:11:23.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:11:23.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:11:23.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:11:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:11:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:11:23.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:11:23.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:11:23.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:11:23.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:11:23.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:11:24.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:10:58
2026-05-28T09:11:24.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68589, datetime.datetime(2026, 5, 28, 9, 10, 58), datetime.datetime(2026, 5, 28, 9, 10, 58), 'salt', 9.13, 52.83, None, 12.18, 273.26, 9.11, 829.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:11:24.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:11:24.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:11:24.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:58, diff=26.053713s, valid=True
2026-05-28T09:11:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:11:24.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:11:24.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:12, diff=12.056572s, valid=True
2026-05-28T09:11:24.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:11:24.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:10:58, diff=26.063229s, valid=True
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:11:24.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:11:24.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:12, diff=12.06621s, valid=True
2026-05-28T09:11:24.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:11:24.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:11:24.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:11:24.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884926.066875s, valid=True
2026-05-28T09:11:24.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:11:24.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:11:24.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:11:24.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:11:24.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:11:24.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:11:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:11:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:11:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:11:24.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:11:24.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:11:24.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:11:24.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:11:24.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:11:24.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:11:25.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:11:25.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:11:25.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:11:25.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-28T09:11:25.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-28T09:11:25.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:11:25.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:11:55.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:11:55.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:11:55.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:11:55.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:11:55.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:11:55.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:11:55.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:11:55.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:11:55.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-28T09:11:55.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:11:55.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:11:55.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:11:55.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-28T09:11: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-28T09:11:58.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:11:58.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:11:58.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:11:58.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:11:58.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:11:58.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:11:58.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:11:58.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:11:58.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:11:58.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:11:58.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:11:58.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:11:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:11:58.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:11:58.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:11:58.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:11:58.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:11:58.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:11:58.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:11:58.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:11:58.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:11:58.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:11:58.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:11:58.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:11:28
2026-05-28T09:11:58.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68590, datetime.datetime(2026, 5, 28, 9, 11, 28), datetime.datetime(2026, 5, 28, 9, 11, 28), 'salt', 9.07, 53.42, None, 10.23, 260.18, 8.96, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:11:58.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:11:58.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:11:58.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:28, diff=30.606801s, valid=True
2026-05-28T09:11:58.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:11:58.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:11:58.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:12, diff=46.609681s, valid=True
2026-05-28T09:11:58.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:11:58.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:25, diff=33.616411s, valid=True
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:11:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:11:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:11:12, diff=46.619471s, valid=True
2026-05-28T09:11:58.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:11:58.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:11:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:11:58.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884960.620142s, valid=True
2026-05-28T09:11:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:11:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:11:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:11:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:11:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:11:58.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:11:58.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:11:58.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:11:58.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:11:58.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:11:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:11:58.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:11:58.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:11:58.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:11:59.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:11:59.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:11:59.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:11:59.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:11:59.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-28T09:11:59.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-28T09:11:59.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:11:59.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:12:29.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:12:29.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:12:29.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:12:29.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:12:29.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:12:30.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:12:30.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-28T09:12:30.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:12:30.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-28T09:12:30.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:12:30.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:12:30.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:12:30.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-28T09:12:32.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-28T09:12:32.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:12:32.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:12:32.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:12:32.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:12:32.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:12:32.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:12:32.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:12:32.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:12:32.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:12:32.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:12:32.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:12:32.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:12:32.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:12:32.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:12:32.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:12:32.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:12:32.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:12:32.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:12:32.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:12:32.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:12:32.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:12:32.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:12:32.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:12:32.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:12:29
2026-05-28T09:12:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68592, datetime.datetime(2026, 5, 28, 9, 12, 29), datetime.datetime(2026, 5, 28, 9, 12, 28), 'salt', 9.07, 53.99, None, 10.66, 265.67, 8.82, 829.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:12:32.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:12:32.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:12:32.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:28, diff=4.942873s, valid=True
2026-05-28T09:12:32.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:12:32.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:12:32.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:12, diff=20.945774s, valid=True
2026-05-28T09:12:32.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:12:32.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:25, diff=7.952562s, valid=True
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:12:32.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:12:32.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:12:32.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:12, diff=20.955537s, valid=True
2026-05-28T09:12:32.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:12:32.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:12:32.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:12:32.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=884994.956211s, valid=True
2026-05-28T09:12:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:12:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:12:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:12:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:12:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:12:33.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:12:33.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:12:33.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:12:33.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:12:33.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:12:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:12:33.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:12:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:12:33.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:12:33.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:12:33.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:12:33.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:12:33.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:12:33.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-28T09:12:33.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-28T09:12:34.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:12:34.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:13:04.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:13:04.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:13:04.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:13:04.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:13:04.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:13:04.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:13:04.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:13:04.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:13:04.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-28T09:13:04.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:13:04.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:13:04.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:13:04.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-28T09:13:07.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-28T09:13:07.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:13:07.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:13:07.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:13:07.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:13:07.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:13:07.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:13:07.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:13:07.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:13:07.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:13:07.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:13:07.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:13:07.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:13:07.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:13:07.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:13:07.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:13:07.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:13:07.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:13:07.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:13:07.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:13:07.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:13:07.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:13:07.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:13:07.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:13:07.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:12:59
2026-05-28T09:13:07.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68593, datetime.datetime(2026, 5, 28, 9, 12, 59), datetime.datetime(2026, 5, 28, 9, 12, 59), 'salt', 9.1, 54.45, None, 10.02, 264.05, 8.7, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:13:07.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:13:07.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:13:07.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:59, diff=8.62094s, valid=True
2026-05-28T09:13:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:13:07.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:13:07.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:12, diff=-4.376214s, valid=True
2026-05-28T09:13:07.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:13:07.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:12:56, diff=11.630437s, valid=True
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:13:07.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:13:07.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:12, diff=-4.36655s, valid=True
2026-05-28T09:13:07.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:13:07.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:13:07.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:13:07.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885029.634108s, valid=True
2026-05-28T09:13:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:13:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:13:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:13:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:13:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:13:07.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:13:07.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:13:07.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:13:07.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:13:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:13:07.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:13:07.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:13:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:13:07.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:13:08.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:13:08.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:13:08.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:13:08.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:13:08.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:13:08.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:13:08.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:13:08.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:13:38.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:13:38.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:13:38.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:13:38.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:13:38.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:13:39.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:13:39.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-28T09:13:39.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:13:39.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-28T09:13:39.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:13:39.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:13:39.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:13:39.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-28T09:13:41.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-28T09:13:41.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:13:42.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:13:42.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:13:42.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:13:42.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:13:42.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:13:42.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:13:42.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:13:42.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:13:42.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:13:42.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:13:42.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:13:42.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:13:42.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:13:42.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:13:42.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:13:42.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:13:42.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:13:42.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:13:42.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:13:42.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:13:42.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:13:42.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:13:42.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:13:29
2026-05-28T09:13:42.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68594, datetime.datetime(2026, 5, 28, 9, 13, 29), datetime.datetime(2026, 5, 28, 9, 13, 29), 'salt', 9.23, 54.15, None, 11.36, 260.53, 8.78, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:13:42.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:13:42.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:13:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:29, diff=13.336736s, valid=True
2026-05-28T09:13:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:13:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:13:42.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:12, diff=30.339604s, valid=True
2026-05-28T09:13:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:13:42.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:26, diff=16.346161s, valid=True
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:13:42.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:13:42.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:12, diff=30.349186s, valid=True
2026-05-28T09:13:42.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:13:42.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:13:42.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:13:42.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885064.34985s, valid=True
2026-05-28T09:13:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:13:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:13:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:13:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:13:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:13:42.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:13:42.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:13:42.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:13:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:13:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:13:42.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:13:42.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:13:42.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:13:42.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:13:42.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:13:43.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:13:43.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:13:43.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:13:43.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-28T09:13:43.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-28T09:13:44.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:13:44.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:14:14.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:14:14.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:14:14.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:14:14.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:14:14.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:14:14.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:14:14.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-28T09:14:14.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:14:14.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-28T09:14:14.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:14:14.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:14:14.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:14:14.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-28T09:14:17.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-28T09:14:17.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:14:17.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:14:17.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:14:17.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:14:17.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:14:17.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:14:17.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:14:17.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:14:17.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:14:17.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:14:17.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:14:17.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:14:17.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:14:17.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:14:17.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:14:17.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:14:17.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:14:17.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:14:17.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:14:17.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:14:17.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:14:17.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:14:17.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:14:17.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:13:59
2026-05-28T09:14:17.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68595, datetime.datetime(2026, 5, 28, 9, 13, 59), datetime.datetime(2026, 5, 28, 9, 13, 59), 'salt', 9.23, 54.55, None, 10.83, 255.62, 8.68, 829.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:14:17.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:14:17.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:14:17.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:59, diff=18.686678s, valid=True
2026-05-28T09:14:17.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:14:17.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:14:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:12, diff=5.689551s, valid=True
2026-05-28T09:14:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:14:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:13:56, diff=21.696433s, valid=True
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:14:17.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:14:17.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:12, diff=5.699541s, valid=True
2026-05-28T09:14:17.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:14:17.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:14:17.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:14:17.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885099.70023s, valid=True
2026-05-28T09:14:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:14:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:14:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:14:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:14:17.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:14:17.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:14:17.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:14:17.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:14:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:14:17.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:14:17.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:14:17.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:14:17.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:14:18.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:14:18.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:14:18.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:14:18.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:14:18.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:14:18.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-28T09:14:18.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-28T09:14:19.003 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:14:19.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:14:49.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:14:49.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:14:49.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:14:49.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:14:49.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:14:50.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:14:50.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-28T09:14:50.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:14:50.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-28T09:14:50.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:14:50.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:14:50.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:14:50.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-28T09:14:52.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-28T09:14:52.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:14:52.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:14:52.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:14:52.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:14:52.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:14:52.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:14:52.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:14:52.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:14:52.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:14:52.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:14:52.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:14:52.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:14:52.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:14:52.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:14:52.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:14:52.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:14:52.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:14:52.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:14:52.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:14:52.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:14:52.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:14:52.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:14:52.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:14:53.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:14:30
2026-05-28T09:14:53.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68596, datetime.datetime(2026, 5, 28, 9, 14, 30), datetime.datetime(2026, 5, 28, 9, 14, 29), 'salt', 9.4, 54.95, None, 11.36, 260.67, 8.59, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:14:53.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:14:53.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:14:53.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:29, diff=24.028436s, valid=True
2026-05-28T09:14:53.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:14:53.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:14:53.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:12, diff=41.031278s, valid=True
2026-05-28T09:14:53.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:14:53.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:14:53.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:27, diff=26.037782s, valid=True
2026-05-28T09:14:53.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:14:53.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:14:53.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:14:53.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:14:53.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:14:53.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:14:53.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:12, diff=41.040755s, valid=True
2026-05-28T09:14:53.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:14:53.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:14:53.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:14:53.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885135.041415s, valid=True
2026-05-28T09:14:53.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:14:53.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:14:53.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:14:53.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:14:53.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:14:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:14:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:14:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:14:53.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:14:53.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:14:53.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:14:53.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:14:53.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:14:53.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:14:53.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:14:53.932 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:14:54.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:14:54.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:14:54.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-28T09:14:54.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-28T09:14:54.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:14:54.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:15:24.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:15:24.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:15:24.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:15:24.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:15:24.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:15:24.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:15:24.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-28T09:15:24.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:15:24.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-28T09:15:24.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:15:24.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:15:24.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:15:24.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:15:27.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-28T09:15:27.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:15:27.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:15:27.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:15:27.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:15:27.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:15:27.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:15:27.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:15:27.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:15:27.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:15:27.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:15:27.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:15:27.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:15:27.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:15:27.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:15:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:15:27.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:15:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:15:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:15:27.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:15:27.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:15:27.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:15:27.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:15:27.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:15:27.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:15:00
2026-05-28T09:15:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68597, datetime.datetime(2026, 5, 28, 9, 15), datetime.datetime(2026, 5, 28, 9, 15), 'salt', 9.33, 53.89, None, 10.87, 257.52, 8.86, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:15:27.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:15:27.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:15:27.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:15:00, diff=27.775488s, valid=True
2026-05-28T09:15:27.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:15:27.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:15:27.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:15:12, diff=15.778387s, valid=True
2026-05-28T09:15:27.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:15:27.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:15:27.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:14:59, diff=28.785699s, valid=True
2026-05-28T09:15:27.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:15:27.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:15:27.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:15:27.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:15:27.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:15:27.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:15:27.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:15:12, diff=15.788851s, valid=True
2026-05-28T09:15:27.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:15:27.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:15:27.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:15:27.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885169.789509s, valid=True
2026-05-28T09:15:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:15:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:15:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:15:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:15:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:15:27.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:15:27.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:15:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:15:27.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:15:27.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:15:27.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:15:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:15:28.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:15:28.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:15:28.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:15:28.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:15:28.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:15:28.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:15:28.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-28T09:15:28.857 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:15:29.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:15:29.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:15:59.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:15:59.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:15:59.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:15:59.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:15:59.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:15:59.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:15:59.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-28T09:15:59.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:15:59.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-28T09:15:59.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:15:59.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:15:59.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:15:59.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:16:02.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-28T09:16:02.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:16:02.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:16:02.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:16:02.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:16:02.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:16:02.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:16:02.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:16:02.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:16:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:16:02.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:16:02.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:16:02.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:16:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:16:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:16:02.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:16:02.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:16:02.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T09:16:02.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:16:02.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T09:16:02.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:16:02.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:16:02.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:16:02.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:16:02.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:16:00
2026-05-28T09:16:02.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68599, datetime.datetime(2026, 5, 28, 9, 16), datetime.datetime(2026, 5, 28, 9, 16), 'salt', 9.33, 53.89, None, 10.2, 258.03, 8.86, 829.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:16:02.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:16:02.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:16:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:00, diff=2.710598s, valid=True
2026-05-28T09:16:02.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:16:02.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T09:16:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:12, diff=-9.286424s, valid=True
2026-05-28T09:16:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:16:02.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:15:57, diff=5.720449s, valid=True
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:16:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T09:16:02.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:12, diff=-9.276477s, valid=True
2026-05-28T09:16:02.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:16:02.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:16:02.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:16:02.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885204.724195s, valid=True
2026-05-28T09:16:02.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:16:02.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:16:02.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:16:02.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:16:02.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:16:02.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:16:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:16:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:16:02.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:16:02.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:16:02.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:16:02.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:16:03.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:16:03.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:16:03.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:16:03.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:16:03.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:16:03.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:16:03.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-28T09:16:03.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-28T09:16:04.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:16:04.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:16:34.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:16:34.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:16: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-28T09:16:34.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:16:34.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:16:34.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:16:34.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-28T09:16:34.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:16:34.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-28T09:16:34.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:16:34.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:16:34.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:16:34.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-28T09:16:37.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:16:37.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:16:37.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:16:37.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:16:37.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:16:37.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:16:37.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:16:37.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:16:37.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:16:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:16:37.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:16:37.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:16:37.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:16:37.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:16:37.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:16:37.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:16:37.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:16:37.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:16:37.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:16:37.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:16:37.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:16:37.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:16:37.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:16:37.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:16:37.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:16:30
2026-05-28T09:16:37.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68600, datetime.datetime(2026, 5, 28, 9, 16, 30), datetime.datetime(2026, 5, 28, 9, 16, 30), 'salt', 9.26, 53.75, None, 11.33, 261.53, 8.88, 829.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:16:37.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:16:37.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:16:37.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:30, diff=7.719598s, valid=True
2026-05-28T09:16:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:16:37.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:16:37.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:12, diff=25.722486s, valid=True
2026-05-28T09:16:37.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:16:37.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:27, diff=10.729252s, valid=True
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:16:37.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:16:37.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:12, diff=25.732317s, valid=True
2026-05-28T09:16:37.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:16:37.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:16:37.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:16:37.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885239.732985s, valid=True
2026-05-28T09:16:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:16:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:16:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:16:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:16:37.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:16:37.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:16:37.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:16:37.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:16:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:16:37.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:16:37.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:16:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:16:38.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:16:38.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:16:38.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:16:38.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:16:38.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:16:38.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:16:38.828 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:16:38.828 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:16:38.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:16:38.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:17:09.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:17:09.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:17:09.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:17:09.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:17:09.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:17:09.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:17:09.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-28T09:17:09.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:17:09.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-28T09:17:09.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:17:09.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:17:09.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:17:09.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-28T09:17:12.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-28T09:17:12.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:17:12.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:17:12.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:17:12.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:17:12.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:17:12.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:17:12.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:17:12.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:17:12.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:17:12.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:17:12.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:17:12.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:17:12.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:17:12.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:17:12.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:17:12.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:17:12.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:17:12.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:17:12.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:17:12.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:17:12.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:17:12.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:17:12.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:17:12.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:17:01
2026-05-28T09:17:12.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68601, datetime.datetime(2026, 5, 28, 9, 17, 1), datetime.datetime(2026, 5, 28, 9, 17), 'salt', 9.26, 54.05, None, 9.95, 263.62, 8.81, 829.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:17:12.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:17:12.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:17:12.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:00, diff=12.50398s, valid=True
2026-05-28T09:17:12.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:17:12.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:17:12.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:12, diff=0.5069s, valid=True
2026-05-28T09:17:12.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:17:12.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:17:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:16:57, diff=15.513626s, valid=True
2026-05-28T09:17:12.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:17:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:17:12.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:17:12.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:17:12.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:17:12.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:17:12.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:12, diff=0.516693s, valid=True
2026-05-28T09:17:12.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:17:12.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:17:12.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:17:12.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885274.517356s, valid=True
2026-05-28T09:17:12.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:17:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:17:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:17:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:17:12.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:17:12.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:17:12.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:17:12.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:17:12.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:17:12.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:17:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:17:12.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:17:12.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:17:12.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:17:13.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:17:13.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:17:13.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:17:13.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:17:13.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-28T09:17:13.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-28T09:17:13.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:17:13.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:17:43.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:17:43.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:17:43.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:17:43.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:17:43.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:17:44.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:17:44.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-28T09:17:44.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:17:44.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-28T09:17:44.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:17:44.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:17:44.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:17:44.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-28T09:17:46.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-28T09:17:46.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:17:46.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:17:46.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:17:46.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:17:46.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:17:46.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:17:46.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:17:46.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:17:46.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:17:46.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:17:46.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:17:46.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:17:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:17:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:17:46.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:17:46.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:17:46.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:17:46.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:17:46.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:17:46.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:17:46.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:17:46.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:17:46.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:17:46.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:17:31
2026-05-28T09:17:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68602, datetime.datetime(2026, 5, 28, 9, 17, 31), datetime.datetime(2026, 5, 28, 9, 17, 31), 'salt', 9.26, 53.72, None, 10.62, 256.15, 8.89, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:17:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:17:46.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:17:46.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:31, diff=15.881033s, valid=True
2026-05-28T09:17:46.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:17:46.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:17:46.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:12, diff=34.883886s, valid=True
2026-05-28T09:17:46.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:17:46.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:17:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:28, diff=18.890716s, valid=True
2026-05-28T09:17:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:17:46.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:17:46.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:17:46.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:17:46.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:17:46.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:17:46.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:12, diff=34.893761s, valid=True
2026-05-28T09:17:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:17:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:17:46.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:17:46.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885308.894417s, valid=True
2026-05-28T09:17:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:17:46.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:17:46.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:17:46.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:17:46.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:17:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:17:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:17:46.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:17:46.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:17:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:17:47.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:17:47.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:17:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:17:47.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:17:47.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:17:47.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:17:47.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:17:47.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:17:47.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:17:47.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-28T09:17:47.991 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:17:47.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:18:18.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:18:18.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:18:18.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:18:18.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:18:18.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:18:18.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:18:18.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-28T09:18:18.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:18:18.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-28T09:18:18.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:18:18.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:18:18.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:18:18.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:18:21.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-28T09:18:21.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:18:21.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:18:21.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:18:21.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:18:21.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:18:21.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:18:21.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:18:21.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:18:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:18:21.389 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09: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-28T09:18:21.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:18:21.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:18:21.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:18:21.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:18:21.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:18:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:18:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:18:21.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:18:21.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:18:21.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:18:21.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:18:21.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:18:21.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:18:01
2026-05-28T09:18:21.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68603, datetime.datetime(2026, 5, 28, 9, 18, 1), datetime.datetime(2026, 5, 28, 9, 18), 'salt', 9.26, 54.32, None, 10.16, 262.68, 8.74, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:18:21.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:18:21.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:18:21.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:00, diff=21.742008s, valid=True
2026-05-28T09:18:21.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:18:21.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:18:21.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:12, diff=9.744892s, valid=True
2026-05-28T09:18:21.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:18:21.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:17:58, diff=23.751581s, valid=True
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:18:21.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:18:21.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:18:21.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:12, diff=9.754654s, valid=True
2026-05-28T09:18:21.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:18:21.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:18:21.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:18:21.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885343.755299s, valid=True
2026-05-28T09:18:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:18:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:18:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:18:21.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:18:21.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:18:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:18:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:18:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:18:21.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:18:21.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:18:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:18:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:18:22.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:18:22.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:18:22.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:18:22.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:18:22.709 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:18:22.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:18:22.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-28T09:18:22.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-28T09:18:22.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:18:22.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:18:52.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:18:52.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:18:52.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:18:53.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:18:53.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:18:53.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:18:53.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-28T09:18:53.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:18:53.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-28T09:18:53.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:18:53.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:18:53.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:18:53.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-28T09:18:55.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:18:55.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:18:55.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:18:55.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:18:55.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:18:55.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:18:55.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:18:55.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:18:55.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:18:55.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:18:55.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:18:55.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:18:55.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:18:55.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:18:55.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:18:55.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:18:55.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:18:55.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:18:55.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:18:55.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:18:55.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:18:55.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:18:55.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:18:55.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:18:56.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:18:31
2026-05-28T09:18:56.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68604, datetime.datetime(2026, 5, 28, 9, 18, 31), datetime.datetime(2026, 5, 28, 9, 18, 31), 'salt', 9.33, 54.05, None, 10.94, 264.84, 8.81, 829.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:18:56.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:18:56.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:18:56.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:31, diff=25.009465s, valid=True
2026-05-28T09:18:56.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:18:56.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:18:56.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:12, diff=44.012287s, valid=True
2026-05-28T09:18:56.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:18:56.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:18:56.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:28, diff=28.018899s, valid=True
2026-05-28T09:18:56.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:18:56.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:18:56.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:18:56.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:18:56.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:18:56.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:18:56.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:18:12, diff=44.021923s, valid=True
2026-05-28T09:18:56.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:18:56.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:18:56.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:18:56.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885378.022592s, valid=True
2026-05-28T09:18:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:18:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:18:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:18:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:18:56.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:18:56.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:18:56.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:18:56.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:18:56.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:18:56.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:18:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:18:56.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:18:56.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:18:56.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:18:56.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:18:56.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:18:57.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:18:57.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:18:57.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-28T09:18:57.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-28T09:18:57.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:18:57.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:19:27.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:19:27.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:19:27.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:19:27.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:19:27.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:19:28.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:19:28.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-28T09:19:28.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:19:28.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-28T09:19:28.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:19:28.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:19:28.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:19:28.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-28T09:19:30.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-28T09:19:30.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:19:30.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:19:30.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:19:30.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:19:30.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:19:30.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:19:30.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:19:30.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:19:30.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:19:30.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:19:30.486 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:19:30.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:19:30.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:19:30.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:19:30.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:19:30.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:19:30.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:19:30.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:19:30.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:19:30.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:19:30.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:19:30.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:19:30.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:19:30.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:19:02
2026-05-28T09:19:30.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68605, datetime.datetime(2026, 5, 28, 9, 19, 2), datetime.datetime(2026, 5, 28, 9, 19, 1), 'salt', 9.43, 54.22, None, 9.18, 262.68, 8.78, 829.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:19:30.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:19:30.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:19:30.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:01, diff=29.809746s, valid=True
2026-05-28T09:19:30.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:19:30.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:19:30.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=18.812546s, valid=True
2026-05-28T09:19:30.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:19:30.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:00, diff=30.819176s, valid=True
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:19:30.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:19:30.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=18.822173s, valid=True
2026-05-28T09:19:30.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:19:30.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:19:30.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:19:30.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885412.822831s, valid=True
2026-05-28T09:19:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:19:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:19:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:19:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:19:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:19:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:19:30.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:19:30.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:19:30.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:19:30.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:19:31.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:19:31.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:19:31.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:19:31.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:19:31.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:19:31.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:19:31.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:19:31.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:19:31.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-28T09:19:31.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-28T09:19:32.038 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:19:32.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:20:02.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:20:02.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:20:02.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:20:02.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:20:02.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:20:02.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:20:02.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:20:02.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:20:02.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-28T09:20:02.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:20:02.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:20:02.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:20:02.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-28T09:20:04.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-28T09:20:04.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:20:04.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:20:04.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:20:04.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:20:04.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:20:04.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:20:04.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:20:04.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:20:04.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:20:04.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:20:04.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:20:04.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:20:05.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:20:05.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:20:05.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:20:05.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:20:05.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:20:05.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:20:05.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:20:05.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:20:05.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:20:05.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:20:05.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:20:05.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:20:02
2026-05-28T09:20:05.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68607, datetime.datetime(2026, 5, 28, 9, 20, 2), datetime.datetime(2026, 5, 28, 9, 20, 2), 'salt', 9.3, 53.29, None, 9.32, 264.18, 9.01, 829.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:20:05.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:20:05.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:20:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:20:02, diff=3.255439s, valid=True
2026-05-28T09:20:05.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:20:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:20:05.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=53.258333s, valid=True
2026-05-28T09:20:05.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:20:05.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:20:05.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:59, diff=6.264937s, valid=True
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:20:05.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:20:05.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=53.26794s, valid=True
2026-05-28T09:20:05.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:20:05.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:20:05.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:20:05.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885447.268686s, valid=True
2026-05-28T09:20:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:20:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:20:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:20:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:20:05.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:20:05.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:20:05.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:20:05.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:20:05.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:20:05.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:20:05.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:20:05.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:20:05.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:20:05.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:20:05.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:20:06.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:20:06.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:20:06.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:20:06.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-28T09:20:06.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-28T09:20:06.510 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:20:06.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:20:36.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:20:36.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:20:36.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:20:37.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:20:37.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:20:37.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:20:37.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-28T09:20:37.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:20:37.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-28T09:20:37.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:20:37.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:20:37.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:20:37.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-28T09:20:40.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-28T09:20:40.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:20:40.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:20:40.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:20:40.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:20:40.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:20:40.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:20:40.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:20:40.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:20:40.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:20:40.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:20:40.361 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:20:40.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:20:40.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:20:40.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:20:40.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:20:40.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:20:40.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:20:40.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:20:40.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:20:40.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:20:40.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:20:40.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:20:40.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:20:40.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:20:32
2026-05-28T09:20:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68608, datetime.datetime(2026, 5, 28, 9, 20, 32), datetime.datetime(2026, 5, 28, 9, 20, 32), 'salt', 9.39, 54.85, None, 10.27, 262.16, 8.61, 829.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:20:40.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:20:40.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:20:40.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:20:32, diff=8.683084s, valid=True
2026-05-28T09:20:40.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:20:40.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:20:40.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=88.685925s, valid=True
2026-05-28T09:20:40.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:20:40.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:20:40.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:20:29, diff=11.692647s, valid=True
2026-05-28T09:20:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:20:40.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:20:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:20:40.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:20:40.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:20:40.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:20:40.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=88.695601s, valid=True
2026-05-28T09:20:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:20:40.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:20:40.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:20:40.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885482.696257s, valid=True
2026-05-28T09:20:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:20:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:20:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:20:40.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:20:40.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:20:40.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:20:40.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:20:40.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:20:40.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:20:40.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:20:40.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:20:40.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:20:40.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:20:41.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:20:41.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:20:41.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:20:41.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:20:41.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:20:41.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-28T09:20:41.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-28T09:20:41.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:20:41.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:21:11.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:21:11.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:21: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-28T09:21:12.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:21:12.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:21:12.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:21:12.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-28T09:21:12.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:21:12.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:21:12.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:21:12.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:21:12.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:21:12.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-28T09:21:14.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-28T09:21:14.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:21:14.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:21:14.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:21:14.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:21:14.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:21:14.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:21:14.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:21:14.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:21:14.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:21:14.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:21:14.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:21:14.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:21:14.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:21:14.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:21:15.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:21:15.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:21:15.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:21:15.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:21:15.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:21:15.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:21:15.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:21:15.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:21:15.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:21:15.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:21:03
2026-05-28T09:21:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68609, datetime.datetime(2026, 5, 28, 9, 21, 3), datetime.datetime(2026, 5, 28, 9, 21, 2), 'salt', 9.46, 54.52, None, 9.46, 264.88, 8.7, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:21:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:21:15.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:21:15.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:21:02, diff=13.153483s, valid=True
2026-05-28T09:21:15.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:21:15.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:21:15.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=123.156322s, valid=True
2026-05-28T09:21:15.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:21:15.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:21:15.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:20:59, diff=16.162924s, valid=True
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:21:15.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:21:15.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=123.165969s, valid=True
2026-05-28T09:21:15.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:21:15.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:21:15.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:21:15.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885517.166617s, valid=True
2026-05-28T09:21:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:21:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:21:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:21:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:21:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:21:15.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:21:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:21:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:21:15.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:21:15.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:21:15.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:21:15.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:21:15.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:21:15.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:21:15.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:21:16.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:21:16.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:21:16.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:21:16.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-28T09:21:16.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-28T09:21:16.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:21:16.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:21:46.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:21:46.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:21:46.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:21:46.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:21:46.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:21:47.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:21:47.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-28T09:21:47.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:21:47.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-28T09:21:47.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:21:47.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:21:47.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:21:47.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-28T09:21:49.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-28T09:21:49.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:21:49.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:21:49.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:21:49.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:21:49.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:21:49.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:21:49.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:21:49.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:21:49.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:21:49.357 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:21:49.357 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:21:49.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:21:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:21:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:21:49.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:21:49.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:21:49.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:21:49.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:21:49.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:21:49.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:21:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:21:49.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:21:49.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:21:49.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:21:33
2026-05-28T09:21:49.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68610, datetime.datetime(2026, 5, 28, 9, 21, 33), datetime.datetime(2026, 5, 28, 9, 21, 32), 'salt', 9.46, 52.1, None, 11.12, 258.35, 9.33, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:21:49.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:21:49.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:21:49.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:21:32, diff=17.675713s, valid=True
2026-05-28T09:21:49.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:21:49.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:21:49.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=157.678505s, valid=True
2026-05-28T09:21:49.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:21:49.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:21:30, diff=19.685142s, valid=True
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:21:49.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:21:49.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=157.688103s, valid=True
2026-05-28T09:21:49.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:21:49.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:21:49.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:21:49.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885551.688766s, valid=True
2026-05-28T09:21:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:21:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:21:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:21:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:21:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:21:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:21:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:21:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:21:49.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:21:49.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:21:49.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:21:49.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:21:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:21:50.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:21:50.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:21:50.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:21:50.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:21:50.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:21:50.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-28T09:21:50.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-28T09:21:50.895 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:21:50.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:22:20.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:22:20.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:22:20.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:22:21.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:22:21.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:22:21.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:22:21.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-28T09:22:21.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:22:21.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-28T09:22:21.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:22:21.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:22:21.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:22:21.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-28T09:22:23.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-28T09:22:23.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:22:23.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:22:23.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:22:23.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:22:24.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:22:24.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:22:24.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:22:24.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:22:24.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:22:24.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:22:24.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:22:24.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:22:24.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:22:24.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:22:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:22:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:22:24.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:22:24.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:22:24.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:22:24.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:22:24.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:22:24.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:22:24.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:22:24.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:22:03
2026-05-28T09:22:24.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68611, datetime.datetime(2026, 5, 28, 9, 22, 3), datetime.datetime(2026, 5, 28, 9, 22, 3), 'salt', 9.43, 51.36, None, 9.99, 271.94, 9.53, 829.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:22:24.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:22:24.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:22:24.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:22:03, diff=21.321797s, valid=True
2026-05-28T09:22:24.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:22:24.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:22:24.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=192.324608s, valid=True
2026-05-28T09:22:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:22:24.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:22:00, diff=24.331174s, valid=True
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:22:24.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:22:24.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=192.33415s, valid=True
2026-05-28T09:22:24.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:22:24.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:22:24.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:22:24.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885586.334803s, valid=True
2026-05-28T09:22:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:22:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:22:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:22:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:22:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:22:24.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:22:24.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:22:24.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:22:24.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:22:24.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:22:24.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:22:24.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:22:24.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:22:24.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:22:24.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:22:25.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:22:25.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:22:25.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:22:25.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:22:25.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:22:25.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:22:25.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:22:55.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:22:55.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:22:55.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:22:56.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:22:56.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:22:56.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:22:56.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-28T09:22:56.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:22:56.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-28T09:22:56.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:22:56.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:22:56.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:22:56.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-28T09:22:58.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-28T09:22:58.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:22:58.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:22:58.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:22:58.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:22:58.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:22:59.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:22:59.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:22:59.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:22:59.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:22:59.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:22:59.009 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:22:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:22:59.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:22:59.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:22:59.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:22:59.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:22:59.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:22:59.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:22:59.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:22:59.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:22:59.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:22:59.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:22:59.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:22:59.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:22:33
2026-05-28T09:22:59.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68612, datetime.datetime(2026, 5, 28, 9, 22, 33), datetime.datetime(2026, 5, 28, 9, 22, 33), 'salt', 9.46, 51.93, None, 9.71, 264.88, 9.37, 829.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:22:59.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:22:59.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:22:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:22:33, diff=26.328219s, valid=True
2026-05-28T09:22:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:22:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:22:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=227.331061s, valid=True
2026-05-28T09:22:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:22:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:22:59.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:22:30, diff=29.3377s, valid=True
2026-05-28T09:22:59.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:22:59.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:22:59.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:22:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:22:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:22:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:22:59.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=227.340693s, valid=True
2026-05-28T09:22:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:22:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:22:59.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:22:59.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885621.341343s, valid=True
2026-05-28T09:22:59.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:22:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:22:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:22:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:22:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:22:59.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:22:59.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:22:59.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:22:59.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:22:59.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:22:59.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:22:59.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:22:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:22:59.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:22:59.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:23:00.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:23:00.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:23:00.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:23:00.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-28T09:23:00.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-28T09:23:00.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:23:00.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:23:30.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:23:30.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:23:30.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:23:31.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:23:31.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:23:31.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:23:31.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-28T09:23:31.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:23:31.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-28T09:23:31.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:23:31.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:23:31.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:23:31.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-28T09:23:33.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-28T09:23:33.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:23:33.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:23:33.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:23:33.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:23:33.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:23:33.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:23:33.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:23:33.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:23:33.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:23:33.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:23:33.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:23:33.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:23:33.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:23:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:23:33.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:23:33.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:23:34.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:23:34.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:23:34.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:23:34.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:23:34.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:23:34.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:23:34.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:23:34.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:23:33
2026-05-28T09:23:34.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68614, datetime.datetime(2026, 5, 28, 9, 23, 33), datetime.datetime(2026, 5, 28, 9, 23, 33), 'salt', 9.53, 53.69, None, 9.25, 258.47, 8.92, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:23:34.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:23:34.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:23:34.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:23:33, diff=1.128872s, valid=True
2026-05-28T09:23:34.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:23:34.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:23:34.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=262.131795s, valid=True
2026-05-28T09:23:34.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:23:34.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:23:32, diff=2.138532s, valid=True
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:23:34.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:23:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:23:34.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=262.141649s, valid=True
2026-05-28T09:23:34.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:23:34.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:23:34.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:23:34.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885656.142324s, valid=True
2026-05-28T09:23:34.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:23:34.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:23:34.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:23:34.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:23:34.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:23:34.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:23:34.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:23:34.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:23:34.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:23:34.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:23:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:23:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:23:34.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:23:34.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:23:34.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:23:35.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:23:35.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:23:35.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:23:35.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-28T09:23:35.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-28T09:23:35.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:23:35.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:24:05.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:24:05.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:24:05.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:24:05.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:24:05.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:24:05.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:24:05.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-28T09:24:05.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:24:05.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-28T09:24:05.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:24:05.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:24:05.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:24:05.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-28T09:24:08.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-28T09:24:08.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:24:08.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:24:08.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:24:08.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:24:08.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:24:08.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:24:08.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:24:08.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:24:08.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:24:08.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:24:08.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:24:08.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:24:08.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:24:08.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:24:08.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:24:08.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:24:08.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:24:08.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:24:08.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:24:08.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:24:08.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:24:08.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:24:08.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:24:08.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:24:04
2026-05-28T09:24:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68615, datetime.datetime(2026, 5, 28, 9, 24, 4), datetime.datetime(2026, 5, 28, 9, 24, 3), 'salt', 9.59, 53.89, None, 9.85, 264.03, 8.87, 829.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:24:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:24:08.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:24:08.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:24:03, diff=5.641443s, valid=True
2026-05-28T09:24:08.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:24:08.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:24:08.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=296.64488s, valid=True
2026-05-28T09:24:08.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:24:08.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:24:08.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:24:01, diff=7.652815s, valid=True
2026-05-28T09:24:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:24:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:24:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:24:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:24:08.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:24:08.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:24:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=296.656386s, valid=True
2026-05-28T09:24:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:24:08.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:24:08.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:24:08.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885690.657229s, valid=True
2026-05-28T09:24:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:24:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:24:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:24:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:24:08.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:24:08.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:24:08.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:24:08.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:24:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:24:08.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:24:08.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:24:08.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:24:08.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:24:09.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:24:09.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:24:09.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:24:09.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:24:09.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:24:09.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-28T09:24:09.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-28T09:24:10.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:24:10.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:24:40.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:24:40.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:24:40.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:24:40.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:24:40.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:24:40.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:24:40.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:24:40.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:24:40.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-28T09:24:40.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:24:40.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:24:40.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:24:40.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-28T09:24: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-28T09:24:42.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:24:42.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:24:42.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:24:42.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:24:42.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:24:43.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:24:43.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:24:43.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:24:43.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:24:43.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:24:43.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:24:43.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:24:43.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:24:43.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:24:43.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:24:43.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:24:43.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:24:43.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:24:43.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:24:43.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:24:43.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:24:43.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:24:43.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:24:43.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:24:34
2026-05-28T09:24:43.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68616, datetime.datetime(2026, 5, 28, 9, 24, 34), datetime.datetime(2026, 5, 28, 9, 24, 34), 'salt', 9.69, 52.06, None, 10.8, 266.31, 9.36, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:24:43.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:24:43.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:24:43.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:24:34, diff=9.329592s, valid=True
2026-05-28T09:24:43.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:24:43.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:24:43.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=331.332403s, valid=True
2026-05-28T09:24:43.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:24:43.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:24:32, diff=11.339057s, valid=True
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:24:43.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:24:43.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=331.342051s, valid=True
2026-05-28T09:24:43.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:24:43.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:24:43.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:24:43.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885725.34271s, valid=True
2026-05-28T09:24:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:24:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:24:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:24:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:24:43.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:24:43.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:24:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:24:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:24:43.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:24:43.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:24:43.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:24:43.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:24:43.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:24:43.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:24:43.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:24:44.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:24:44.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:24:44.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:24:44.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-28T09:24:44.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-28T09:24:44.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:24:44.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:25:14.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:25:14.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:25:14.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:25:14.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:25:14.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:25:15.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:25:15.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-28T09:25:15.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:25:15.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-28T09:25:15.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:25:15.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:25:15.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:25:15.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-28T09:25:17.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-28T09:25:17.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:25:17.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:25:17.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:25:17.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:25:17.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:25:17.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:25:17.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:25:17.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:25:17.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:25:17.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:25:17.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:25:17.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:25:17.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:25:17.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:25:17.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:25:17.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:25:17.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:25:17.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:25:17.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:25:17.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:25:17.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:25:17.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:25:17.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:25:17.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:25:04
2026-05-28T09:25:17.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68617, datetime.datetime(2026, 5, 28, 9, 25, 4), datetime.datetime(2026, 5, 28, 9, 25, 4), 'salt', 9.59, 51.0, None, 10.69, 270.13, 9.63, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:25:17.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:25:17.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:25:17.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:25:04, diff=13.801416s, valid=True
2026-05-28T09:25:17.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:25:17.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:25:17.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=365.804227s, valid=True
2026-05-28T09:25:17.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:25:17.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:25:17.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:25:02, diff=15.810845s, valid=True
2026-05-28T09:25:17.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:25:17.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:25:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:25:17.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:25:17.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:25:17.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:25:17.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:19:12, diff=365.813868s, valid=True
2026-05-28T09:25:17.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:25:17.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:25:17.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:25:17.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885759.814522s, valid=True
2026-05-28T09:25:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:25:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:25:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:25:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:25:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:25:17.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:25:17.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:25:17.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:25:17.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:25:17.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:25:18.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:25:18.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:25:18.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:25:18.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:25:18.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:25:18.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:25:18.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:25:18.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:25:18.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-28T09:25:18.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-28T09:25:18.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:25:18.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:25:48.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:25:48.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:25:48.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:25:49.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:25:49.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:25:49.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:25:49.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-28T09:25:49.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:25:49.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-28T09:25:49.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:25:49.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:25:49.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:25:49.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-28T09:25:51.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:25:51.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:25:51.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:25:51.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:25:51.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:25:51.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:25:51.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:25:51.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:25:51.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:25:51.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:25:51.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:25:51.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:25:51.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:25:51.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:25:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:25:51.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:25:51.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:25:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:25:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:25:52.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:25:52.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:25:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:25:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:25:52.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:25:52.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:25:35
2026-05-28T09:25:52.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68618, datetime.datetime(2026, 5, 28, 9, 25, 35), datetime.datetime(2026, 5, 28, 9, 25, 34), 'salt', 9.53, 50.04, None, 8.96, 270.95, 9.9, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:25:52.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:25:52.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:25:52.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:25:34, diff=18.094853s, valid=True
2026-05-28T09:25:52.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:25:52.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:25:52.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:12, diff=-19.902259s, valid=True
2026-05-28T09:25:52.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:25:52.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:25:32, diff=20.104455s, valid=True
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:25:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:25:52.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:12, diff=-19.892544s, valid=True
2026-05-28T09:25:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:25:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:25:52.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:25:52.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885794.108142s, valid=True
2026-05-28T09:25:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:25:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:25:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:25:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:25:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:25:52.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:25:52.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:25:52.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:25:52.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:25:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:25:52.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:25:52.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:25:52.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:25:52.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:25:52.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:25:52.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:25:53.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:25:53.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:25:53.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-28T09:25:53.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-28T09:25:53.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:25:53.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:26:23.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:26:23.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:26:23.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:26:23.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:26:23.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:26:23.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:26:23.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-28T09:26:23.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:26:23.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:26:23.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:26:23.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:26:23.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:26:23.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:26:26.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-28T09:26:26.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:26:26.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:26:26.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:26:26.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:26:26.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:26:26.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:26:26.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:26:26.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:26:26.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:26:26.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:26:26.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:26:26.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:26:26.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:26:26.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:26:26.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:26:26.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:26:26.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:26:26.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:26:26.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:26:26.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:26:26.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:26:26.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:26:26.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:26:26.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:26:05
2026-05-28T09:26:26.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68619, datetime.datetime(2026, 5, 28, 9, 26, 5), datetime.datetime(2026, 5, 28, 9, 26, 4), 'salt', 9.53, 49.01, None, 10.41, 263.58, 10.18, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:26:26.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:26:26.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:26:26.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:04, diff=22.582445s, valid=True
2026-05-28T09:26:26.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:26:26.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:26:26.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:12, diff=14.587066s, valid=True
2026-05-28T09:26:26.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:26:26.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:26:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:02, diff=24.593684s, valid=True
2026-05-28T09:26:26.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:26:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:26:26.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:26:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:26:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:26:26.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:26:26.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:12, diff=14.596707s, valid=True
2026-05-28T09:26:26.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:26:26.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:26:26.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:26:26.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885828.597358s, valid=True
2026-05-28T09:26:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:26:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:26:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:26:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:26:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:26:26.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:26:26.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:26:26.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:26:26.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:26:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:26:26.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:26:26.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:26:26.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:26:26.994 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:26:27.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:26:27.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:26:27.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:26:27.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:26:27.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-28T09:26:27.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-28T09:26:27.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:26:27.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:26:57.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:26:57.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:26:57.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:26:58.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:26:58.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:26:58.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:26:58.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-28T09:26:58.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:26:58.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-28T09:26:58.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:26:58.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:26:58.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:26:58.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-28T09:27:00.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-28T09:27:00.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:27:00.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:27:00.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:27:00.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:27:00.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:27:00.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:27:00.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:27:00.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:27:00.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:27:00.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:27:00.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:27:00.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:27:00.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:27:00.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:27:00.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:27:00.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:27:00.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:27:00.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:27:01.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:27:01.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:27:01.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:27:01.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:27:01.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:27:01.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:26:35
2026-05-28T09:27:01.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68620, datetime.datetime(2026, 5, 28, 9, 26, 35), datetime.datetime(2026, 5, 28, 9, 26, 35), 'salt', 9.46, 48.18, None, 11.33, 261.87, 10.41, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:27:01.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:27:01.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:27:01.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:35, diff=26.08275s, valid=True
2026-05-28T09:27:01.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:27:01.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:27:01.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:27:12, diff=-10.914435s, valid=True
2026-05-28T09:27:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:27:01.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:26:32, diff=29.092283s, valid=True
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:27:01.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:27:01.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:27:12, diff=-10.904707s, valid=True
2026-05-28T09:27:01.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:27:01.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:27:01.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:27:01.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885863.095961s, valid=True
2026-05-28T09:27:01.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:27:01.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:27:01.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:27:01.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:27:01.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:27:01.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:27:01.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:27:01.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:27:01.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:27:01.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:27:01.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:27:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:27:01.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:27:01.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:27:01.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:27:01.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:27:02.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:27:02.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:27:02.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-28T09:27:02.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-28T09:27:02.281 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:27:02.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:27:32.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:27:32.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:27:32.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:27:32.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:27:32.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:27:33.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:27:33.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-28T09:27:33.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:27:33.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-28T09:27:33.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:27:33.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:27:33.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:27:33.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:27:35.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:27:35.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:27:35.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:27:35.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:27:35.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:27:35.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:27:35.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:27:35.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:27:35.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:27:35.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:27:35.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:27:35.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:27:35.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:27:36.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:27:36.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:27:36.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:27:36.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:27:36.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:27:36.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:27:36.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:27:36.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:27:36.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:27:36.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:27:36.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:27:36.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:27:35
2026-05-28T09:27:36.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68622, datetime.datetime(2026, 5, 28, 9, 27, 35), datetime.datetime(2026, 5, 28, 9, 27, 35), 'salt', 9.56, 50.43, None, 10.13, 254.45, 9.79, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:27:36.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:27:36.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:27:36.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:27:35, diff=1.285491s, valid=True
2026-05-28T09:27:36.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:27:36.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:27:36.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:12, diff=-35.71174s, valid=True
2026-05-28T09:27:36.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:27:36.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:27:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:27:33, diff=3.294761s, valid=True
2026-05-28T09:27:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:27:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:27:36.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:27:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:27:36.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:27:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:27:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:12, diff=-35.702302s, valid=True
2026-05-28T09:27:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:27:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:27:36.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:27:36.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885898.298338s, valid=True
2026-05-28T09:27:36.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:27:36.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:27:36.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:27:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:27:36.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:27:36.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:27:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:27:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:27:36.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:27:36.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:27:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:27:36.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:27:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:27:36.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:27:36.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:27:37.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:27:37.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:27:37.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:27:37.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-28T09:27:37.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-28T09:27:37.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:27:37.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:28:07.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:28:07.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:28:07.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:28:07.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:28:07.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:28:08.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:28:08.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-28T09:28:08.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:28:08.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-28T09:28:08.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:28:08.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:28:08.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:28:08.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-28T09:28:10.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-28T09:28:10.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:28:10.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:28:10.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:28:10.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:28:10.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:28:10.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:28:10.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:28:10.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:28:10.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:28:10.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:28:10.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:28:10.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:28:10.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:28:10.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:28:10.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:28:10.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:28:10.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:28:10.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:28:10.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:28:10.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:28:10.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:28:10.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:28:10.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:28:10.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:28:06
2026-05-28T09:28:10.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68623, datetime.datetime(2026, 5, 28, 9, 28, 6), datetime.datetime(2026, 5, 28, 9, 28, 5), 'salt', 9.66, 50.04, None, 9.21, 262.64, 9.9, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:28:10.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:28:10.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:28:10.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:05, diff=5.797741s, valid=True
2026-05-28T09:28:10.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:28:10.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:28:10.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:12, diff=-1.199387s, valid=True
2026-05-28T09:28:10.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:28:10.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:05, diff=5.807365s, valid=True
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:28:10.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:28:10.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:12, diff=-1.189626s, valid=True
2026-05-28T09:28:10.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:28:10.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:28:10.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:28:10.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885932.811052s, valid=True
2026-05-28T09:28:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:28:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:28:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:28:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:28:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:28:10.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:28:10.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:28:10.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:28:10.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:28:10.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:28:11.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:28:11.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:28:11.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:28:11.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:28:11.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:28:11.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:28:11.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:28:11.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:28:11.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-28T09:28:11.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-28T09:28:12.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:28:12.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:28:42.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:28:42.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:28:42.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:28:42.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:28:42.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:28:42.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:28:42.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-28T09:28:42.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:28:42.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-28T09:28:42.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:28:42.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:28:42.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:28:42.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-28T09:28:45.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-28T09:28:45.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:28:45.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:28:45.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:28:45.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:28:45.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:28:45.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:28:45.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:28:45.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:28:45.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:28:45.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:28:45.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:28:45.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:28:45.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:28:45.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:28:45.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:28:45.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:28:45.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:28:45.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:28:45.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:28:45.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:28:45.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:28:45.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:28:45.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:28:45.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:28:36
2026-05-28T09:28:45.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68624, datetime.datetime(2026, 5, 28, 9, 28, 36), datetime.datetime(2026, 5, 28, 9, 28, 35), 'salt', 9.72, 50.5, None, 8.44, 260.92, 9.78, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:28:45.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:28:45.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:28:45.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:35, diff=10.937793s, valid=True
2026-05-28T09:28:45.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:28:45.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:28:45.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:12, diff=-26.059371s, valid=True
2026-05-28T09:28:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:28:45.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:28:34, diff=11.947299s, valid=True
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:28:45.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:28:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:12, diff=-26.049653s, valid=True
2026-05-28T09:28:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:28:45.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:28:45.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:28:45.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=885967.951016s, valid=True
2026-05-28T09:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:28:46.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:28:46.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:28:46.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:28:46.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:28:46.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:28:46.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:28:46.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:28:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:28:46.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:28:46.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:28:46.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:28:46.940 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:28:46.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:28:46.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:28:46.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:28:47.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:28:47.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:29:17.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:29:17.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:29:17.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:29:17.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:29:17.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:29:17.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:29:17.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-28T09:29:17.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:29:17.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-28T09:29:17.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:29:17.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:29:17.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:29:17.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-28T09:29:20.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-28T09:29:20.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:29:20.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:29:20.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:29:20.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:29:20.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:29:20.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:29:20.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:29:20.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:29:20.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:29:20.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:29:20.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:29:20.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:29:20.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:29:20.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:29:20.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:29:20.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:29:20.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:29:20.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:29:20.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:29:20.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:29:20.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:29:20.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:29:20.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:29:20.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:29:06
2026-05-28T09:29:20.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68625, datetime.datetime(2026, 5, 28, 9, 29, 6), datetime.datetime(2026, 5, 28, 9, 29, 6), 'salt', 9.86, 49.7, None, 9.07, 256.63, 10.01, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:29:20.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:29:20.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:29:20.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:06, diff=14.617069s, valid=True
2026-05-28T09:29:20.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:29:20.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:29:20.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:12, diff=8.619933s, valid=True
2026-05-28T09:29:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:29:20.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:29:20.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:04, diff=16.626629s, valid=True
2026-05-28T09:29:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:29:20.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:29:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:29:20.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:29:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:29:20.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:29:20.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:12, diff=8.629627s, valid=True
2026-05-28T09:29:20.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:29:20.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:29:20.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:29:20.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886002.630289s, valid=True
2026-05-28T09:29:20.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:29:20.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:29:20.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:29:20.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:29:20.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:29:20.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:29:20.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:29:20.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:29:20.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:29:20.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:29:20.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:29:20.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:29:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:29:20.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:29:21.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:29:21.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:29:21.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:29:21.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:29:21.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-28T09:29:21.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-28T09:29:21.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:29:21.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:29:51.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:29:51.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:29:51.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:29:52.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:29:52.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:29:52.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:29:52.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-28T09:29:52.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:29:52.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-28T09:29:52.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:29:52.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:29:52.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:29:52.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:29:54.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-28T09:29:54.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:29:54.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:29:54.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:29:54.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:29:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:29:54.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:29:54.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:29:54.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:29:54.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:29:54.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:29:54.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:29:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:29:54.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:29:54.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:29:54.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:29:54.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:29:54.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:29:54.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:29:55.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:29:55.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:29:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:29:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:29:55.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:29:55.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:29:36
2026-05-28T09:29:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68626, datetime.datetime(2026, 5, 28, 9, 29, 36), datetime.datetime(2026, 5, 28, 9, 29, 36), 'salt', 9.82, 49.9, None, 9.95, 251.56, 9.95, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:29:55.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:29:55.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:29:55.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:36, diff=19.082298s, valid=True
2026-05-28T09:29:55.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:29:55.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:29:55.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:12, diff=-16.914747s, valid=True
2026-05-28T09:29:55.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:29:55.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:29:34, diff=21.092055s, valid=True
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:29:55.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:29:55.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:12, diff=-16.904878s, valid=True
2026-05-28T09:29:55.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:29:55.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:29:55.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:29:55.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886037.095805s, valid=True
2026-05-28T09:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:29:55.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:29:55.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:29:55.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:29:55.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:29:55.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:29:55.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:29:55.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:29:55.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:29:55.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:29:55.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:29:55.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:29:56.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:29:56.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:29:56.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-28T09:29:56.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-28T09:29:56.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:29:56.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:30:26.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:30:26.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:30:26.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:30:26.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:30:26.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:30:26.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:30:26.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:30:26.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:30:26.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-28T09:30:26.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:30:26.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:30:26.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:30:26.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-28T09:30:28.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-28T09:30:28.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:30:28.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:30:28.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:30:28.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:30:28.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:30:28.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:30:28.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:30:28.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:30:28.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:30:28.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:30:28.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:30:28.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:30:28.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:30:28.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:30:29.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:30:29.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:30:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:30:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:30:29.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T09:30:29.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:30:29.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:30:29.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:30:29.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:30:29.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:30:06
2026-05-28T09:30:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68627, datetime.datetime(2026, 5, 28, 9, 30, 6), datetime.datetime(2026, 5, 28, 9, 30, 6), 'salt', 9.86, 50.07, None, 9.92, 255.9, 9.91, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:30:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:30:29.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:30:29.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:06, diff=23.181597s, valid=True
2026-05-28T09:30:29.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:30:29.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:30:29.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:12, diff=17.184521s, valid=True
2026-05-28T09:30:29.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:30:29.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:05, diff=24.191247s, valid=True
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:30:29.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T09:30:29.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:12, diff=17.194288s, valid=True
2026-05-28T09:30:29.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:30:29.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:30:29.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:30:29.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886071.194949s, valid=True
2026-05-28T09:30:29.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:30:29.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:30:29.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:30:29.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:30:29.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:30:29.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:30:29.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:30:29.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:30:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:30:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:30:29.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:30:29.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:30:29.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:30:29.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:30:29.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:30:30.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:30:30.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:30:30.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:30:30.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:30:30.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:30:30.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:30:30.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:31:00.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:31:00.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:31:00.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:31:00.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:31:00.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:31:00.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:31:00.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-28T09:31:00.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:31:00.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-28T09:31:00.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:31:00.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:31:00.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:31:00.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-28T09:31:03.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:31:03.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:31:03.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:31:03.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:31:03.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:31:03.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:31:03.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:31:03.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:31:03.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:31:03.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:31:03.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:31:03.177 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:31:03.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:31:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:31:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:31:03.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:31:03.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:31:03.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:31:03.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:31:03.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T09:31:03.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:31:03.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:31:03.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:31:03.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:31:03.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:30:37
2026-05-28T09:31:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68628, datetime.datetime(2026, 5, 28, 9, 30, 37), datetime.datetime(2026, 5, 28, 9, 30, 36), 'salt', 9.66, 49.01, None, 9.56, 259.51, 10.19, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:31:03.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:31:03.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:31:03.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:36, diff=27.487381s, valid=True
2026-05-28T09:31:03.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:31:03.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:31:03.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:31:12, diff=-8.509849s, valid=True
2026-05-28T09:31:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:31:03.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:30:35, diff=28.496608s, valid=True
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:31:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:31:03.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T09:31:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:31:12, diff=-8.500449s, valid=True
2026-05-28T09:31:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:31:03.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:31:03.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:31:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886105.500199s, valid=True
2026-05-28T09:31:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:31:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:31:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:31:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:31:03.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:31:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:31:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:31:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:31:03.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:31:03.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:31:03.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:31:03.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:31:03.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:31:03.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:31:04.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:31:04.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:31:04.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:31:04.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:31:04.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-28T09:31:04.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-28T09:31:04.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:31:04.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:31:34.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:31:34.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:31:34.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:31:35.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:31:35.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:31:35.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:31:35.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:31:35.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:31:35.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-28T09:31:35.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:31:35.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:31:35.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:31:35.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-28T09:31:37.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-28T09:31:37.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:31:37.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:31:37.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:31:37.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:31:37.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:31:37.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:31:37.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:31:37.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:31:37.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:31:37.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:31:37.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:31:37.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:31:37.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:31:37.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:31:38.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:31:38.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:31:38.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:31:38.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:31:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:31:38.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:31:38.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:31:38.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:31:38.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:31:38.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:31:37
2026-05-28T09:31:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68630, datetime.datetime(2026, 5, 28, 9, 31, 37), datetime.datetime(2026, 5, 28, 9, 31, 37), 'salt', 9.82, 50.7, None, 10.73, 261.27, 9.73, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:31:38.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:31:38.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:31:38.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:31:37, diff=1.145772s, valid=True
2026-05-28T09:31:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:31:38.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:31:38.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:12, diff=-33.851402s, valid=True
2026-05-28T09:31:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:31:38.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:31:35, diff=3.155231s, valid=True
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:31:38.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:31:38.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:12, diff=-33.841707s, valid=True
2026-05-28T09:31:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:31:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:31:38.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:31:38.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886140.158985s, valid=True
2026-05-28T09:31:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:31:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:31:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:31:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:31:38.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:31:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:31:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:31:38.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:31:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:31:38.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:31:38.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:31:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:31:38.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:31:38.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:31:38.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:31:39.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:31:39.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:31:39.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:31:39.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-28T09:31:39.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-28T09:31:39.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:31:39.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:32:09.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:32:09.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:32:09.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:32:09.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:32:09.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:32:10.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:32:10.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-28T09:32:10.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:32:10.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-28T09:32:10.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:32:10.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:32:10.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:32:10.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:32:12.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-28T09:32:12.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:32:12.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:32:12.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:32:12.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:32:12.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:32:12.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:32:12.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:32:12.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:32:12.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:32:12.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:32:12.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:32:12.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:32:12.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:32:12.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:32:12.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:32:12.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:32:12.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:32:12.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:32:12.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T09:32:12.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:32:12.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:32:12.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:32:12.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:32:12.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:32:07
2026-05-28T09:32:12.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68631, datetime.datetime(2026, 5, 28, 9, 32, 7), datetime.datetime(2026, 5, 28, 9, 32, 7), 'salt', 9.96, 49.41, None, 8.79, 266.86, 10.1, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:32:12.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:32:12.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:32:12.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:07, diff=5.847723s, valid=True
2026-05-28T09:32:12.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:32:12.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:32:12.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:12, diff=0.850561s, valid=True
2026-05-28T09:32:12.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:32:12.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:05, diff=7.857373s, valid=True
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:32:12.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T09:32:12.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:12, diff=0.860374s, valid=True
2026-05-28T09:32:12.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:32:12.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:32:12.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:32:12.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886174.861044s, valid=True
2026-05-28T09:32:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:32:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:32:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:32:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:32:12.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:32:12.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:32:12.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:32:12.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:32:12.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:32:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:32:13.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:32:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:32:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:32:13.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:32:13.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:32:13.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:32:13.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:32:13.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:32:13.853 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:32:13.853 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:32:13.920 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:32:13.920 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:32:43.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:32:43.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:32:43.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:32:44.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:32:44.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:32:44.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:32:44.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-28T09:32:44.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:32:44.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-28T09:32:44.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:32:44.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:32:44.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:32:44.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:32:46.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:32:46.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:32:46.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:32:46.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:32:46.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:32:46.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:32:46.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:32:46.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:32:46.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:32:46.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:32:46.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:32:46.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:32:46.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:32:46.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:32:46.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:32:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:32:47.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:32:47.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:32:47.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:32:47.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:32:47.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:32:47.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:32:47.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:32:47.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:32:47.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:32:38
2026-05-28T09:32:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68632, datetime.datetime(2026, 5, 28, 9, 32, 38), datetime.datetime(2026, 5, 28, 9, 32, 37), 'salt', 9.89, 49.9, None, 9.32, 266.02, 9.96, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:32:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:32:47.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:32:47.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:37, diff=10.159444s, valid=True
2026-05-28T09:32:47.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:32:47.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:32:47.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:12, diff=-24.837743s, valid=True
2026-05-28T09:32:47.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:32:47.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:32:47.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:32:37, diff=10.168796s, valid=True
2026-05-28T09:32:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:32:47.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:32:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:32:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:32:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:32:47.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:32:47.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:12, diff=-24.828193s, valid=True
2026-05-28T09:32:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:32:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:32:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:32:47.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886209.172445s, valid=True
2026-05-28T09:32:47.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:32:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:32:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:32:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:32:47.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:32:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:32:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:32:47.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:32:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:32:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:32:47.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:32:47.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:32:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:32:47.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:32:47.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:32:48.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:32:48.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:32:48.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:32:48.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:32:48.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:32:48.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:32:48.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:33:18.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:33:18.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:33:18.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:33:18.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:33:18.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:33:18.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:33: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-28T09:33:18.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:33:18.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-28T09:33:18.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:33:18.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:33:18.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:33:18.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-28T09:33:21.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-28T09:33:21.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:33:21.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:33:21.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:33:21.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:33:21.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:33:21.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:33:21.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:33:21.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:33:21.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:33:21.551 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:33:21.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:33:21.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:33:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:33:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:33:21.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:33:21.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:33:21.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:33:21.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:33:21.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T09:33:21.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:33:21.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:33:21.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:33:21.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:33:21.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:33:08
2026-05-28T09:33:21.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68633, datetime.datetime(2026, 5, 28, 9, 33, 8), datetime.datetime(2026, 5, 28, 9, 33, 7), 'salt', 10.06, 49.47, None, 9.67, 267.09, 10.09, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:33:21.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:33:21.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:33:21.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:07, diff=14.86694s, valid=True
2026-05-28T09:33:21.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:33:21.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:33:21.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:12, diff=9.869789s, valid=True
2026-05-28T09:33:21.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:33:21.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:06, diff=15.876467s, valid=True
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:33:21.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T09:33:21.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:12, diff=9.879513s, valid=True
2026-05-28T09:33:21.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:33:21.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:33:21.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:33:21.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886243.880179s, valid=True
2026-05-28T09:33:21.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:33:21.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:33:21.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:33:21.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:33:21.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:33:21.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:33:21.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:33:21.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:33:21.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:33:22.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:33:22.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:33:22.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:33:22.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:33:22.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:33:22.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:33:22.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:33:22.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:33:22.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:33:22.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-28T09:33:22.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-28T09:33:23.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:33:23.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:33:53.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:33:53.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:33:53.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:33:53.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:33:53.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:33:53.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:33:53.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:33:53.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:33:53.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-28T09:33:53.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:33:53.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:33:53.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:33:53.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-28T09:33:55.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-28T09:33:55.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:33:55.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:33:55.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:33:55.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:33:55.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:33:55.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:33:55.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:33:55.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:33:55.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:33:55.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:33:55.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:33:55.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:33:56.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:33:56.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:33:56.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:33:56.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:33:56.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:33:56.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:33:56.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:33:56.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:33:56.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:33:56.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:33:56.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:33:56.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:33:38
2026-05-28T09:33:56.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68634, datetime.datetime(2026, 5, 28, 9, 33, 38), datetime.datetime(2026, 5, 28, 9, 33, 38), 'salt', 9.89, 48.77, None, 10.31, 261.88, 10.27, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:33:56.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:33:56.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:33:56.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:38, diff=18.261992s, valid=True
2026-05-28T09:33:56.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:33:56.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:33:56.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:12, diff=-15.73514s, valid=True
2026-05-28T09:33:56.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:33:56.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:33:36, diff=20.271546s, valid=True
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:33:56.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:33:56.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:33:56.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:12, diff=-15.725418s, valid=True
2026-05-28T09:33:56.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:33:56.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:33:56.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:33:56.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886278.275253s, valid=True
2026-05-28T09:33:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:33:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:33:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:33:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:33:56.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:33:56.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:33:56.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:33:56.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:33:56.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:33:56.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:33:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:33:56.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:33:56.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:33:56.596 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:33:56.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:33:57.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:33:57.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:33:57.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:33:57.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-28T09:33:57.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-28T09:33:57.509 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:33:57.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:34:27.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:34:27.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:34:27.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:34:28.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:34:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:34:28.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:34:28.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-28T09:34:28.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:34:28.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-28T09:34:28.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:34:28.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:34:28.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:34:28.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-28T09:34:30.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-28T09:34:30.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:34:30.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:34:30.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:34:30.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:34:30.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:34:30.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:34:30.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:34:30.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:34:30.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:34:30.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:34:30.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:34:30.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:34:30.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:34:30.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:34:30.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:34:30.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:34:30.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:34:30.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:34:30.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T09:34:30.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:34:30.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:34:30.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:34:30.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:34:31.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:34:08
2026-05-28T09:34:31.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68635, datetime.datetime(2026, 5, 28, 9, 34, 8), datetime.datetime(2026, 5, 28, 9, 34, 8), 'salt', 9.76, 49.8, None, 9.74, 262.33, 9.98, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:34:31.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:34:31.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:34:31.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:08, diff=23.050634s, valid=True
2026-05-28T09:34:31.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:34:31.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:34:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:12, diff=19.053446s, valid=True
2026-05-28T09:34:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:34:31.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:06, diff=25.060077s, valid=True
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:34:31.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T09:34:31.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:12, diff=19.063103s, valid=True
2026-05-28T09:34:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:34:31.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:34:31.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:34:31.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886313.063772s, valid=True
2026-05-28T09:34:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:34:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:34:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:34:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:34:31.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:34:31.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:34:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:34:31.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:34:31.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:34:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:34:31.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:34:31.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:34:31.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:34:31.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:34:31.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:34:31.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:34:32.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:34:32.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:34:32.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:34:32.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:34:32.373 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:34:32.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:35:02.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:35:02.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:35:02.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:35:02.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:35:02.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:35:02.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:35:02.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:35:02.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:35:02.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-28T09:35:02.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:35:02.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:35:02.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:35:02.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-28T09:35:05.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-28T09:35:05.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:35:05.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:35:05.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:35:05.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:35:05.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:35:05.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:35:05.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:35:05.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:35:05.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:35:05.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:35:05.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:35:05.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:35:05.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:35:05.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:35:05.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:35:05.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:35:05.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:35:05.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:35:05.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:35:05.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:35:05.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:35:05.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:35:05.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:35:05.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:34:38
2026-05-28T09:35:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68636, datetime.datetime(2026, 5, 28, 9, 34, 38), datetime.datetime(2026, 5, 28, 9, 34, 38), 'salt', 9.79, 51.1, None, 9.6, 265.47, 9.62, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:35:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:35:05.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:35:05.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:38, diff=27.513412s, valid=True
2026-05-28T09:35:05.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:35:05.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:35:05.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:35:12, diff=-6.483786s, valid=True
2026-05-28T09:35:05.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:35:05.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:35:05.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:34:37, diff=28.525357s, valid=True
2026-05-28T09:35:05.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:35:05.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:35:05.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:35:05.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:35:05.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:35:05.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:35:05.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:35:12, diff=-6.469319s, valid=True
2026-05-28T09:35:05.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:35:05.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:35:05.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:35:05.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886347.531881s, valid=True
2026-05-28T09:35:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:35:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:35:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:35:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:35:05.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:35:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:35:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:35:05.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:35:05.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:35:05.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:35:05.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:35:05.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:35:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:35:05.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:35:06.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:35:06.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:35:06.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:35:06.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:35:06.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-28T09:35:06.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-28T09:35:06.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:35:06.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:35:36.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:35:36.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:35:36.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:35:37.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:35:37.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:35:37.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:35:37.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-28T09:35:37.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:35:37.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-28T09:35:37.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:35:37.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:35:37.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:35:37.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-28T09:35:39.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-28T09:35:39.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:35:39.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:35:39.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:35:39.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:35:39.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:35:39.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:35:39.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:35:39.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:35:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:35:39.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:35:39.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:35:39.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:35:39.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:35:39.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:35:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:35:39.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:35:39.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:35:39.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:35:40.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:35:40.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:35:40.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:35:40.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:35:40.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:35:40.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:35:39
2026-05-28T09:35:40.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68638, datetime.datetime(2026, 5, 28, 9, 35, 39), datetime.datetime(2026, 5, 28, 9, 35, 39), 'salt', 9.72, 49.01, None, 9.46, 277.0, 10.19, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:35:40.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:35:40.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:35:40.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:35:39, diff=1.083243s, valid=True
2026-05-28T09:35:40.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:35:40.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:35:40.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:12, diff=-31.913035s, valid=True
2026-05-28T09:35:40.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:35:40.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:35:37, diff=3.095097s, valid=True
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:35:40.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:35:40.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:12, diff=-31.901059s, valid=True
2026-05-28T09:35:40.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:35:40.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:35:40.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:35:40.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886382.099668s, valid=True
2026-05-28T09:35:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:35:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:35:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:35:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:35:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:35:40.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:35:40.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:35:40.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:35:40.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:35:40.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:35:40.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:35:40.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:35:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:35:40.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:35:40.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:35:41.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:35:41.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:35:41.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:35:41.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-28T09:35:41.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-28T09:35:41.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:35:41.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:36:11.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:36:11.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:36:11.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:36:11.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:36:11.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:36:12.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:36:12.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:36:12.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:36:12.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-28T09:36:12.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:36:12.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:36:12.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:36:12.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-28T09:36:14.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-28T09:36:14.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:36:14.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:36:14.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:36:14.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:36:14.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:36:14.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:36:14.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:36:14.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:36:14.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:36:14.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:36:14.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:36:14.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:36:14.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:36:14.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:36:14.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:36:14.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:36:14.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:36:14.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:36:14.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:36:14.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:36:14.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:36:14.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:36:14.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:36:14.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:36:09
2026-05-28T09:36:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68639, datetime.datetime(2026, 5, 28, 9, 36, 9), datetime.datetime(2026, 5, 28, 9, 36, 9), 'salt', 9.69, 50.6, None, 8.47, 274.56, 9.75, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:36:14.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:36:14.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:36:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:09, diff=6.003074s, valid=True
2026-05-28T09:36:15.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:36:15.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:36:15.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:12, diff=3.007228s, valid=True
2026-05-28T09:36:15.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:36:15.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:08, diff=7.014172s, valid=True
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:36:15.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:36:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:12, diff=3.017279s, valid=True
2026-05-28T09:36:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:36:15.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:36:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:36:15.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886417.017955s, valid=True
2026-05-28T09:36:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:36:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:36:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:36:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:36:15.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:36:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:36:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:36:15.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:36:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:36:15.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:36:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:36:15.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:36:15.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:36:15.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:36:15.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:36:15.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:36:15.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:36:15.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:36:15.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-28T09:36:15.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-28T09:36:16.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:36:16.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:36:46.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:36:46.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:36:46.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:36:46.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:36:46.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:36:46.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:36:46.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-28T09:36:46.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:36:46.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-28T09:36:46.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:36:46.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:36:46.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:36:46.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-28T09:36:49.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-28T09:36:49.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:36:49.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:36:49.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:36:49.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:36:49.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:36:49.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:36:49.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:36:49.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:36:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:36:49.192 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:36:49.193 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:36:49.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:36:49.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:36:49.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:36:49.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:36:49.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:36:49.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:36:49.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:36:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:36:49.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:36:49.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:36:49.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:36:49.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:36:49.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:36:39
2026-05-28T09:36:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68640, datetime.datetime(2026, 5, 28, 9, 36, 39), datetime.datetime(2026, 5, 28, 9, 36, 39), 'salt', 9.79, 51.1, None, 9.11, 277.54, 9.62, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:36:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:36:49.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:36:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:39, diff=10.508717s, valid=True
2026-05-28T09:36:49.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:36:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:36:49.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:12, diff=-22.488481s, valid=True
2026-05-28T09:36:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:36:49.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:36:38, diff=11.518161s, valid=True
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:36:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:36:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:12, diff=-22.478813s, valid=True
2026-05-28T09:36:49.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:36:49.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:36:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:36:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886451.521894s, valid=True
2026-05-28T09:36:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:36:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:36:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:36:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:36:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:36:49.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:36:49.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:36:49.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:36:49.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:36:49.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:36:49.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:36:49.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:36:49.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:36:49.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:36:50.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:36:50.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:36:50.583 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:36:50.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:36:50.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-28T09:36:50.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-28T09:36:50.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:36:50.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:37:20.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:37:20.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:37:20.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:37:21.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:37:21.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:37:21.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:37:21.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-28T09:37:21.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:37:21.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-28T09:37:21.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:37:21.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:37:21.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:37:21.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-28T09:37:23.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:37:23.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:37:23.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:37:23.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:37:23.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:37:23.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:37:23.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:37:23.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:37:23.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:37:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:37:23.682 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:37:23.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:37:23.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:37:23.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:37:23.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:37:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:37:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:37:23.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:37:23.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:37:23.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:37:23.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:37:23.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:37:23.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:37:23.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:37:23.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:37:09
2026-05-28T09:37:23.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68641, datetime.datetime(2026, 5, 28, 9, 37, 9), datetime.datetime(2026, 5, 28, 9, 37, 9), 'salt', 9.76, 47.05, None, 10.31, 258.99, 10.76, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:37:23.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:37:23.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:37:24.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:09, diff=15.001431s, valid=True
2026-05-28T09:37:24.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:37:24.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:37:24.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:12, diff=12.004322s, valid=True
2026-05-28T09:37:24.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:37:24.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:08, diff=16.011042s, valid=True
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:37:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:37:24.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:12, diff=12.014067s, valid=True
2026-05-28T09:37:24.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:37:24.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:37:24.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:37:24.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886486.014729s, valid=True
2026-05-28T09:37:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:37:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:37:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:37:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:37:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:37:24.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:37:24.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:37:24.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:37:24.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:37:24.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:37:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:37:24.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:37:24.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:37:24.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:37:24.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:37:24.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:37:24.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:37:24.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:37:24.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-28T09:37:24.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-28T09:37:25.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:37:25.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:37:55.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:37:55.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:37:55.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:37:55.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:37:55.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:37:56.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:37:56.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-28T09:37:56.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:37:56.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-28T09:37:56.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:37:56.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:37:56.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:37:56.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-28T09:37:58.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-28T09:37:58.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:37:58.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:37:58.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:37:58.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:37:58.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:37:58.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:37:58.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:37:58.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:37:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:37:58.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:37:58.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:37:58.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:37:58.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:37:58.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:37:58.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:37:58.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:37:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:37:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:37:58.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:37:58.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:37:58.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:37:58.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:37:58.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:37:58.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:37:40
2026-05-28T09:37:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68642, datetime.datetime(2026, 5, 28, 9, 37, 40), datetime.datetime(2026, 5, 28, 9, 37, 39), 'salt', 9.79, 46.85, None, 10.34, 267.77, 10.81, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:37:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:37:58.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:37:58.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:39, diff=19.850763s, valid=True
2026-05-28T09:37:58.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:37:58.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:37:58.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:12, diff=-13.146422s, valid=True
2026-05-28T09:37:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:37:58.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:37:39, diff=19.860185s, valid=True
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:37:58.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:37:58.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:12, diff=-13.136843s, valid=True
2026-05-28T09:37:58.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:37:58.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:37:58.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:37:58.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886520.863845s, valid=True
2026-05-28T09:37:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:37:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:37:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:37:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:37:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:37:58.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:37:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:37:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:37:58.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:37:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:37:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:37:59.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:37:59.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:37:59.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:37:59.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:37:59.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:37:59.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:37:59.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:37:59.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-28T09:37:59.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-28T09:37:59.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:37:59.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:38:29.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:38:29.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:38:29.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:38:30.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:38:30.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:38:30.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:38:30.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-28T09:38:30.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:38:30.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-28T09:38:30.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:38:30.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:38:30.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:38:30.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-28T09:38:32.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-28T09:38:32.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:38:32.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:38:32.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:38:32.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:38:32.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:38:32.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:38:32.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:38:32.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:38:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:38:32.830 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:38:32.830 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:38:32.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:38:32.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:38:32.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:38:32.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:38:32.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:38:33.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:38:33.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:38:33.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:38:33.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:38:33.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:38:33.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:38:33.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:38:33.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:38:10
2026-05-28T09:38:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68643, datetime.datetime(2026, 5, 28, 9, 38, 10), datetime.datetime(2026, 5, 28, 9, 38, 10), 'salt', 9.79, 45.62, None, 9.11, 255.5, 11.18, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:38:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:38:33.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:38:33.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:10, diff=23.143988s, valid=True
2026-05-28T09:38:33.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:38:33.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:38:33.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:12, diff=21.14687s, valid=True
2026-05-28T09:38:33.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:38:33.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:09, diff=24.153566s, valid=True
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:38:33.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:38:33.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:38:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:12, diff=21.156589s, valid=True
2026-05-28T09:38:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:38:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:38:33.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:38:33.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886555.157246s, valid=True
2026-05-28T09:38:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:38:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:38:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:38:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:38:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:38:33.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:38:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:38:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:38:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:38:33.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:38:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:38:33.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:38:33.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:38:33.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:38:33.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:38:34.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:38:34.101 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:38:34.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:38:34.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-28T09:38:34.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-28T09:38:34.352 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:38:34.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:39:04.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:39:04.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:39:04.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:39:04.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:39:04.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:39:04.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:39:04.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-28T09:39:04.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:39:04.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:39:04.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:39:04.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:39:04.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:39:04.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:39:07.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-28T09:39:07.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:39:07.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:39:07.405 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:39:07.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:39:07.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:39:07.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:39:07.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:39:07.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:39:07.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:39:07.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:39:07.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:39:07.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:39:07.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:39:07.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:39:07.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:39:07.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:39:07.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:39:07.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:39:07.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:39:07.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:39:07.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:39:07.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:39:07.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:39:07.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:38:40
2026-05-28T09:39:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68644, datetime.datetime(2026, 5, 28, 9, 38, 40), datetime.datetime(2026, 5, 28, 9, 38, 40), 'salt', 9.92, 47.48, None, 9.53, 261.88, 10.64, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:39:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:39:07.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:39:07.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:40, diff=27.759013s, valid=True
2026-05-28T09:39:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:39:07.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:39:07.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:39:12, diff=-4.238172s, valid=True
2026-05-28T09:39:07.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:39:07.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:38:39, diff=28.768364s, valid=True
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:39:07.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:39:07.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:39:12, diff=-4.22863s, valid=True
2026-05-28T09:39:07.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:39:07.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:39:07.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:39:07.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886589.772055s, valid=True
2026-05-28T09:39:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:39:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:39:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:39:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:39:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:39:07.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:39:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:39:07.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:39:07.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:39:07.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:39:08.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:39:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:39:08.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:39:08.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:39:08.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:39:08.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:39:08.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:39:08.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:39:08.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-28T09:39:08.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-28T09:39:09.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:39:09.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:39:39.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:39:39.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:39:39.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:39:39.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:39:39.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:39:39.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:39:39.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-28T09:39:39.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:39:39.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-28T09:39:39.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:39:39.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:39:39.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:39:39.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-28T09:39:42.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-28T09:39:42.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:39:42.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:39:42.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:39:42.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:39:42.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:39:42.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:39:42.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:39:42.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:39:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:39:42.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:39:42.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:39:42.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:39:42.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:39:42.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:39:42.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:39:42.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:39:42.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:39:42.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:39:42.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:39:42.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:39:42.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:39:42.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:39:42.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:39:42.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:39:41
2026-05-28T09:39:42.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68646, datetime.datetime(2026, 5, 28, 9, 39, 41), datetime.datetime(2026, 5, 28, 9, 39, 40), 'salt', 10.12, 47.75, None, 7.69, 278.8, 10.58, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:39:42.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:39:42.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:39:42.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:39:40, diff=2.591441s, valid=True
2026-05-28T09:39:42.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:39:42.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:39:42.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:12, diff=-29.405748s, valid=True
2026-05-28T09:39:42.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:39:42.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:39:42.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:39:40, diff=2.600909s, valid=True
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:39:42.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:39:42.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:12, diff=-29.396086s, valid=True
2026-05-28T09:39:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:39:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:39:42.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:39:42.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886624.60457s, valid=True
2026-05-28T09:39:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:39:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:39:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:39:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:39:42.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:39:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:39:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:39:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:39:42.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:39:42.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:39:42.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:39:42.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:39:42.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:39:42.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:39:43.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:39:43.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:39:43.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:39:43.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:39:43.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-28T09:39:43.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-28T09:39:43.795 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:39:43.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:40:13.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:40:13.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:40:13.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:40:13.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:40:13.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:40:14.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:40:14.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-28T09:40:14.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:40:14.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-28T09:40:14.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:40:14.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:40:14.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:40:14.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-28T09:40:16.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-28T09:40:16.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:40:16.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:40:16.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:40:16.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:40:16.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:40:16.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:40:16.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:40:16.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:40:16.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:40:16.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:40:16.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:40:16.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:40:16.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:40:16.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:40:17.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:40:17.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:40:17.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:40:17.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:40:17.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:40:17.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:40:17.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:40:17.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:40:17.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:40:17.201 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:40:11
2026-05-28T09:40:17.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68647, datetime.datetime(2026, 5, 28, 9, 40, 11), datetime.datetime(2026, 5, 28, 9, 40, 10), 'salt', 10.25, 49.47, None, 7.45, 288.54, 10.1, 830.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:40:17.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:40:17.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:40:17.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:10, diff=7.207454s, valid=True
2026-05-28T09:40:17.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:40:17.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:40:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:12, diff=5.210289s, valid=True
2026-05-28T09:40:17.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:40:17.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:40:17.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:10, diff=7.216976s, valid=True
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:40:17.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:40:17.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:12, diff=5.220014s, valid=True
2026-05-28T09:40:17.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:40:17.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:40:17.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:40:17.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886659.220677s, valid=True
2026-05-28T09:40:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:40:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:40:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:40:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:40:17.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:40:17.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:40:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:40:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:40:17.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:40:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:40:17.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:40:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:40:17.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:40:17.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:40:17.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:40:18.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:40:18.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:40:18.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:40:18.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-28T09:40:18.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-28T09:40:18.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:40:18.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:40:48.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:40:48.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:40:48.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:40:48.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:40:48.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:40:49.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:40:49.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-28T09:40:49.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:40:49.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:40:49.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:40:49.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:40:49.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:40: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-28T09:40:51.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-28T09:40:51.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:40:51.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:40:51.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:40:51.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:40:51.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:40:51.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:40:51.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:40:51.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:40:51.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:40:51.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:40:51.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:40:51.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:40:51.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:40:51.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:40:51.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:40:51.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:40:51.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:40:51.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:40:51.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:40:51.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:40:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:40:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:40:51.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:40:51.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:40:41
2026-05-28T09:40:51.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68648, datetime.datetime(2026, 5, 28, 9, 40, 41), datetime.datetime(2026, 5, 28, 9, 40, 41), 'salt', 10.25, 50.27, None, 8.4, 291.05, 9.88, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:40:51.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:40:51.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:40:51.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:41, diff=10.96171s, valid=True
2026-05-28T09:40:51.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:40:51.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:40:51.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:12, diff=-20.035515s, valid=True
2026-05-28T09:40:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:40:51.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:40:40, diff=11.9712s, valid=True
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:40:51.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:40:51.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:12, diff=-20.025755s, valid=True
2026-05-28T09:40:51.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:40:51.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:40:51.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:40:51.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886693.97491s, valid=True
2026-05-28T09:40:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:40:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:40:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:40:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:40:51.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:40:52.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:40:52.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:40:52.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:40:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:40:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:40:52.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:40:52.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:40:52.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:40:52.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:40:52.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:40:52.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:40:52.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:40:52.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:40:52.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:40:52.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:40:53.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:40:53.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:41:23.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:41:23.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:41:23.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:41:23.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:41:23.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:41:24.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:41:24.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-28T09:41:24.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:41:24.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-28T09:41:24.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:41:24.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:41:24.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:41:24.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-28T09:41:26.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-28T09:41:26.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:41:26.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:41:26.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:41:26.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:41:26.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:41:26.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:41:26.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:41:26.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:41:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:41:26.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:41:26.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:41:26.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:41:26.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:41:26.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:41:26.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:41:26.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:41:26.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:41:26.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:41:26.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:41:26.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:41:26.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:41:26.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:41:26.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:41:27.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:41:11
2026-05-28T09:41:27.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68649, datetime.datetime(2026, 5, 28, 9, 41, 11), datetime.datetime(2026, 5, 28, 9, 41, 11), 'salt', 10.19, 47.18, None, 9.64, 286.12, 10.75, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:41:27.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:41:27.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:41:27.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:11, diff=16.027695s, valid=True
2026-05-28T09:41:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:41:27.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:41:27.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:12, diff=15.030762s, valid=True
2026-05-28T09:41:27.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:41:27.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:11, diff=16.037431s, valid=True
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:41:27.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:41:27.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:12, diff=15.040498s, valid=True
2026-05-28T09:41:27.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:41:27.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:41:27.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:41:27.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886729.041178s, valid=True
2026-05-28T09:41:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:41:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:41:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:41:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:41:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:41:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:41:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:41:27.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:41:27.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:41:27.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:41:27.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:41:27.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:41:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:41:27.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:41:27.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:41:27.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:41:27.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:41:27.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:41:27.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-28T09:41:27.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-28T09:41:28.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:41:28.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:41:58.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:41:58.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:41:58.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:41:58.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:41:58.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:41:58.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:41:58.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-28T09:41:58.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:41:58.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-28T09:41:58.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:41:58.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:41:58.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:41:58.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-28T09:42:01.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-28T09:42:01.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:42:01.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:42:01.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:42:01.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:42:01.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:42:01.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:42:01.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:42:01.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:42:01.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:42:01.205 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:42:01.205 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:42:01.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:42:01.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:42:01.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:42:01.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:42:01.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:42:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:42:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:42:01.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:42:01.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:42:01.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:42:01.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:42:01.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:42:01.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:41:41
2026-05-28T09:42:01.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68650, datetime.datetime(2026, 5, 28, 9, 41, 41), datetime.datetime(2026, 5, 28, 9, 41, 41), 'salt', 10.05, 45.39, None, 8.68, 283.4, 11.26, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:42:01.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:42:01.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:42:01.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:41, diff=20.543674s, valid=True
2026-05-28T09:42:01.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:42:01.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:42:01.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:12, diff=-10.453434s, valid=True
2026-05-28T09:42:01.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:42:01.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:41:41, diff=20.553333s, valid=True
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:42:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:42:01.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:12, diff=-10.443575s, valid=True
2026-05-28T09:42:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:42:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:42:01.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:42:01.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886763.557101s, valid=True
2026-05-28T09:42:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:42:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:42:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:42:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:42:01.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:42:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:42:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:42:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:42:01.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:42:01.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:42:01.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:42:01.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:42:01.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:42:01.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:42:02.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:42:02.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:42:02.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:42:02.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:42:02.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-28T09:42:02.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-28T09:42:02.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:42:02.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:42:32.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:42:32.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:42:32.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:42:33.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:42:33.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:42:33.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:42:33.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-28T09:42:33.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:42:33.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-28T09:42:33.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:42:33.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:42:33.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:42:33.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-28T09:42:35.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-28T09:42:35.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:42:35.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:42:35.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:42:35.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:42:35.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:42:35.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:42:35.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:42:35.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:42:35.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:42:35.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:42:35.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:42:35.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:42:35.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:42:35.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:42:36.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:42:36.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:42:36.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:42:36.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:42:36.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:42:36.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:42:36.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:42:36.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:42:36.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:42:36.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:42:12
2026-05-28T09:42:36.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68651, datetime.datetime(2026, 5, 28, 9, 42, 12), datetime.datetime(2026, 5, 28, 9, 42, 11), 'salt', 10.19, 45.52, None, 8.68, 282.83, 11.24, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:42:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:42:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:42:36.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:11, diff=25.206276s, valid=True
2026-05-28T09:42:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:42:36.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:42:36.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:12, diff=24.20927s, valid=True
2026-05-28T09:42:36.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:42:36.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:12, diff=24.216167s, valid=True
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:42:36.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:42:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:12, diff=24.219196s, valid=True
2026-05-28T09:42:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:42:36.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:42:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:42:36.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886798.219865s, valid=True
2026-05-28T09:42:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:42:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:42:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:42:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:42:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:42:36.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:42:36.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:42:36.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:42:36.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:42:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:42:36.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:42:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:42:36.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:42:36.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:42:36.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:42:37.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:42:37.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:42:37.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:42:37.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:42:37.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-28T09:42:37.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:42:37.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:43:07.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:43:07.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:43:07.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:43:07.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:43:07.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:43:08.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:43:08.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-28T09:43:08.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:43:08.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-28T09:43:08.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:43:08.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:43:08.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:43: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-28T09:43:10.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-28T09:43:10.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:43:10.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:43:10.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:43:10.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:43:10.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:43:10.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:43:10.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:43:10.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:43:10.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:43:10.475 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:43:10.475 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:43:10.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:43:10.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:43:10.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:43:10.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:43:10.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:43:10.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:43:10.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:43:10.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:43:10.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:43:10.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:43:10.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:43:10.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:43:10.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:42:42
2026-05-28T09:43:10.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68652, datetime.datetime(2026, 5, 28, 9, 42, 42), datetime.datetime(2026, 5, 28, 9, 42, 41), 'salt', 10.12, 47.21, None, 8.12, 285.74, 10.74, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:43:10.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:43:10.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:43:10.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:41, diff=29.800167s, valid=True
2026-05-28T09:43:10.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:43:10.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:43:10.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:43:12, diff=-1.196989s, valid=True
2026-05-28T09:43:10.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:43:10.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:42:42, diff=28.809549s, valid=True
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:43:10.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:43:10.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:43:10.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:43:12, diff=-1.187423s, valid=True
2026-05-28T09:43:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:43:10.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:43:10.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:43:10.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886832.813237s, valid=True
2026-05-28T09:43:10.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:43:10.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:43:10.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:43:10.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:43:10.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:43:10.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:43:10.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:43:10.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:43:10.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:43:10.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:43:11.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:43:11.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:43:11.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:43:11.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:43:11.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:43:11.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:43:11.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:43:11.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:43:11.828 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:43:11.828 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:43:11.895 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:43:11.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:43:41.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:43:41.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:43:41.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:43:42.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:43:42.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:43:42.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:43:42.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-28T09:43:42.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:43:42.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-28T09:43:42.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:43:42.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:43:42.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:43: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-28T09:43:44.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-28T09:43:44.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:43:44.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:43:44.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:43:44.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:43:44.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:43:44.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:43:44.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:43:44.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:43:44.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:43:44.906 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:43:44.906 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:43:44.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:43:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:43:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:43:45.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:43:45.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:43:45.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:43:45.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:43:45.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:43:45.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:43:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:43:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:43:45.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:43:45.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:43:42
2026-05-28T09:43:45.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68654, datetime.datetime(2026, 5, 28, 9, 43, 42), datetime.datetime(2026, 5, 28, 9, 43, 42), 'salt', 10.22, 48.21, None, 9.67, 297.5, 10.46, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:43:45.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:43:45.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:43:45.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:43:42, diff=3.218615s, valid=True
2026-05-28T09:43:45.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:43:45.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:43:45.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=-26.778555s, valid=True
2026-05-28T09:43:45.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:43:45.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:43:42, diff=3.228053s, valid=True
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:43:45.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:43:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=-26.768966s, valid=True
2026-05-28T09:43:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:43:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:43:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:43:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886867.231697s, valid=True
2026-05-28T09:43:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:43:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:43:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:43:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:43:45.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:43:45.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:43:45.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:43:45.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:43:45.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:43:45.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:43:45.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:43:45.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:43:45.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:43:45.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:43:45.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:43:46.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:43:46.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:43:46.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:43:46.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-28T09:43:46.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-28T09:43:46.427 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:43:46.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:44:16.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:44:16.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:44:16.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:44:16.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:44:16.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:44:17.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:44:17.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:44:17.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:44:17.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-28T09:44:17.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:44:17.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:44:17.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:44:17.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-28T09:44:19.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:44:19.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:44:19.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:44:19.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:44:19.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:44:19.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:44:19.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:44:19.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:44:19.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:44:19.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:44:19.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:44:19.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:44:19.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:44:19.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:44:19.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:44:19.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:44:19.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:44:19.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:44:19.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:44:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:44:19.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:44:19.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:44:19.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:44:19.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:44:19.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:44:13
2026-05-28T09:44:19.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68655, datetime.datetime(2026, 5, 28, 9, 44, 13), datetime.datetime(2026, 5, 28, 9, 44, 12), 'salt', 10.32, 46.22, None, 8.4, 289.45, 11.05, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:44:19.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:44:19.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:44:19.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=7.736305s, valid=True
2026-05-28T09:44:19.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:44:19.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:44:19.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=7.739158s, valid=True
2026-05-28T09:44:19.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:44:19.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=7.745605s, valid=True
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:44:19.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:44:19.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:44:19.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:12, diff=7.748607s, valid=True
2026-05-28T09:44:19.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:44:19.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:44:19.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:44:19.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886901.749256s, valid=True
2026-05-28T09:44:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:44:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:44:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:44:19.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:44:19.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:44:19.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:44:19.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:44:19.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:44:19.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:44:19.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:44:20.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:44:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:44:20.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:44:20.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:44:20.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:44:20.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:44:20.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:44:20.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:44:20.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-28T09:44:20.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-28T09:44:20.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:44:20.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:44:50.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:44:50.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:44:50.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:44:51.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:44:51.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:44:51.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:44:51.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-28T09:44:51.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:44:51.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-28T09:44:51.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:44:51.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:44:51.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:44:51.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-28T09:44:53.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-28T09:44:53.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:44:53.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:44:53.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:44:53.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:44:53.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:44:53.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:44:53.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:44:53.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:44:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:44:53.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:44:53.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:44:53.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:44:53.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:44:53.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:44:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:44:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:44:54.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:44:54.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:44:54.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:44:54.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:44:54.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:44:54.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:44:54.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:44:54.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:44:43
2026-05-28T09:44:54.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68656, datetime.datetime(2026, 5, 28, 9, 44, 43), datetime.datetime(2026, 5, 28, 9, 44, 42), 'salt', 10.32, 45.26, None, 7.27, 288.86, 11.33, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:44:54.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:44:54.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:44:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:42, diff=12.182994s, valid=True
2026-05-28T09:44:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:44:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:44:54.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:12, diff=-17.814158s, valid=True
2026-05-28T09:44:54.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:44:54.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:44:43, diff=11.192461s, valid=True
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:44:54.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:44:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:12, diff=-17.804506s, valid=True
2026-05-28T09:44:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:44:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:44:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:44:54.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886936.196585s, valid=True
2026-05-28T09:44:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:44:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:44:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:44:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:44:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:44:54.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:44:54.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:44:54.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:44:54.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:44:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:44:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:44:54.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:44:54.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:44:54.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:44:54.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:44:55.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:44:55.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:44:55.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:44:55.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-28T09:44:55.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-28T09:44:55.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:44:55.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:45:25.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:45:25.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:45:25.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:45:25.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:45:25.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:45:26.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:45:26.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:45:26.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:45:26.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-28T09:45:26.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:45:26.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:45:26.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:45:26.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-28T09:45:28.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-28T09:45:28.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:45:28.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:45:28.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:45:28.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:45:28.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:45:28.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:45:28.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:45:28.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:45:28.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:45:28.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:45:28.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:45:28.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:45:28.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:45:28.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:45:28.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:45:28.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:45:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:45:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:45:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:45:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:45:28.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:45:28.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:45:28.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:45:28.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:45:13
2026-05-28T09:45:28.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68657, datetime.datetime(2026, 5, 28, 9, 45, 13), datetime.datetime(2026, 5, 28, 9, 45, 13), 'salt', 10.35, 46.15, None, 9.21, 294.63, 11.07, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:45:28.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:45:28.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:45:28.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:13, diff=15.90381s, valid=True
2026-05-28T09:45:28.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:45:28.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:45:28.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:12, diff=16.906661s, valid=True
2026-05-28T09:45:28.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:45:28.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:13, diff=15.9133s, valid=True
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:45:28.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:45:28.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:12, diff=16.916365s, valid=True
2026-05-28T09:45:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:45:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:45:28.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:45:28.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=886970.917036s, valid=True
2026-05-28T09:45:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:45:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:45:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:45:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:45:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:45:28.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:45:28.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:45:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:45:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:45:29.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:45:29.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:45:29.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:45:29.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:45:29.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:45:29.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:45:29.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:45:29.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:45:29.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:45:29.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-28T09:45:29.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-28T09:45:30.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:45:30.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:46:00.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:46:00.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:46:00.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:46:00.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:46:00.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:46:00.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:46:00.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-28T09:46:00.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:46:00.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-28T09:46:00.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:46:00.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:46:00.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:46:00.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-28T09:46:02.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-28T09:46:02.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:46:02.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:46:02.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:46:02.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:46:02.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:46:02.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:46:02.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:46:02.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:46:02.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:46:02.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:46:02.959 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:46:02.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:46:03.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:46:03.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:46:03.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:46:03.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:46:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:46:03.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:46:03.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:46:03.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:46:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:46:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:46:03.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:46:03.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:45:43
2026-05-28T09:46:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68658, datetime.datetime(2026, 5, 28, 9, 45, 43), datetime.datetime(2026, 5, 28, 9, 45, 43), 'salt', 10.32, 43.86, None, 8.08, 297.31, 11.76, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:46:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:46:03.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:46:03.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:43, diff=20.301925s, valid=True
2026-05-28T09:46:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:46:03.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:46:03.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:12, diff=-8.694627s, valid=True
2026-05-28T09:46:03.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:46:03.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:46:03.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:45:43, diff=20.312613s, valid=True
2026-05-28T09:46:03.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:46:03.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:46:03.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:46:03.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:46:03.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:46:03.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:46:03.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:12, diff=-8.684391s, valid=True
2026-05-28T09:46:03.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:46:03.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:46:03.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:46:03.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887005.316259s, valid=True
2026-05-28T09:46:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:46:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:46:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:46:03.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:46:03.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:46:03.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:46:03.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:46:03.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:46:03.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:46:03.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:46:03.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:46:03.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:46:03.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:46:03.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:46:03.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:46:04.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:46:04.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:46:04.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:46:04.314 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:46:04.314 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:46:04.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:46:04.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:46:34.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:46:34.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:46:34.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:46:34.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:46:34.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:46:35.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:46:35.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-28T09:46:35.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:46:35.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-28T09:46:35.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:46:35.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:46:35.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:46:35.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-28T09:46:37.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-28T09:46:37.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:46:37.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:46:37.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:46:37.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:46:37.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:46:37.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:46:37.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:46:37.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:46:37.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:46:37.620 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:46:37.620 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:46:37.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:46:37.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:46:37.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:46:37.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:46:37.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:46:37.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:46:37.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:46:37.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:46:37.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:46:37.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:46:37.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:46:37.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:46:37.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:46:13
2026-05-28T09:46:37.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68659, datetime.datetime(2026, 5, 28, 9, 46, 13), datetime.datetime(2026, 5, 28, 9, 46, 13), 'salt', 10.42, 41.37, None, 6.99, 302.55, 12.56, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:46:37.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:46:37.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:46:37.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:13, diff=24.938415s, valid=True
2026-05-28T09:46:37.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:46:37.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:46:37.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:12, diff=25.941345s, valid=True
2026-05-28T09:46:37.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:46:37.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:46:37.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:13, diff=24.948653s, valid=True
2026-05-28T09:46:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:46:37.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:46:37.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:46:37.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:46:37.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:46:37.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:46:37.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:12, diff=25.951762s, valid=True
2026-05-28T09:46:37.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:46:37.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:46:37.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:46:37.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887039.95242s, valid=True
2026-05-28T09:46:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:46:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:46:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:46:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:46:37.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:46:38.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:46:38.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:46:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:46:38.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:46:38.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:46:38.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:46:38.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:46:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:46:38.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:46:38.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:46:38.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:46:38.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:46:38.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:46:38.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-28T09:46:38.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-28T09:46:38.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:46:38.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:47:09.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:47:09.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:47:09.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:47:09.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:47:09.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:47:09.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:47:09.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-28T09:47:09.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:47:09.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-28T09:47:09.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:47:09.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:47:09.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:47:09.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-28T09:47:11.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-28T09:47:11.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:47:11.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:47:11.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:47:11.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:47:11.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:47:11.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:47:11.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:47:11.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:47:11.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:47:11.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:47:11.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:47:12.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:47:12.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:47:12.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:47:12.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:47:12.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:47:12.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:47:12.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:47:12.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:47:12.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:47:12.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:47:12.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:47:12.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:47:12.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:46:44
2026-05-28T09:47:12.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68660, datetime.datetime(2026, 5, 28, 9, 46, 44), datetime.datetime(2026, 5, 28, 9, 46, 43), 'salt', 10.42, 42.27, None, 8.01, 282.47, 12.27, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:47:12.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:47:12.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:47:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:43, diff=29.337294s, valid=True
2026-05-28T09:47:12.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:47:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:47:12.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:47:12, diff=0.340155s, valid=True
2026-05-28T09:47:12.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:47:12.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:47:12.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:46:44, diff=28.346978s, valid=True
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:47:12.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:47:12.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:47:12, diff=0.350011s, valid=True
2026-05-28T09:47:12.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:47:12.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:47:12.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:47:12.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887074.350684s, valid=True
2026-05-28T09:47:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:47:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:47:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:47:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:47:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:47:12.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:47:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:47:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:47:12.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:47:12.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:47:12.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:47:12.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:47:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:47:12.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:47:12.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:47:13.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:47:13.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:47:13.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:47:13.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-28T09:47:13.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-28T09:47:13.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:47:13.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:47:43.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:47:43.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:47:43.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:47:43.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:47:43.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:47:44.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:47:44.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-28T09:47:44.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:47:44.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:47:44.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:47:44.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:47:44.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:47:44.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-28T09:47:46.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-28T09:47:46.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:47:46.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:47:46.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:47:46.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:47:46.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:47:46.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:47:46.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:47:46.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:47:46.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:47:46.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:47:46.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:47:46.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:47:46.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:47:46.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:47:46.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:47:46.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:47:47.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:47:47.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:47:47.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:47:47.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:47:47.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:47:47.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:47:47.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:47:47.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:47:44
2026-05-28T09:47:47.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68662, datetime.datetime(2026, 5, 28, 9, 47, 44), datetime.datetime(2026, 5, 28, 9, 47, 44), 'salt', 10.38, 48.34, None, 8.22, 292.78, 10.43, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:47:47.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:47:47.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:47:47.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:47:44, diff=3.128915s, valid=True
2026-05-28T09:47:47.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:47:47.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:47:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:12, diff=-24.868227s, valid=True
2026-05-28T09:47:47.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:47:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:47:44, diff=3.138465s, valid=True
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:47:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:47:47.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:12, diff=-24.858498s, valid=True
2026-05-28T09:47:47.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:47:47.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:47:47.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:47:47.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887109.142167s, valid=True
2026-05-28T09:47:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:47:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:47:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:47:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:47:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:47:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:47:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:47:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:47:47.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:47:47.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:47:47.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:47:47.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:47:47.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:47:47.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:47:47.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:47:48.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:47:48.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:47:48.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:47: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-28T09:47: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-28T09:47:48.349 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:47:48.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:48:18.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:48:18.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:48:18.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:48:18.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:48:18.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:48:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:48:19.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-28T09:48:19.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:48:19.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-28T09:48:19.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:48:19.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:48:19.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:48:19.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-28T09:48: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-28T09:48:21.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:48:21.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:48:21.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:48:21.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:48:21.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:48:21.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:48:21.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:48:21.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:48:21.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:48:21.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:48:21.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:48:21.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:48:21.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:48:21.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:48:21.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:48:21.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:48:21.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:48:21.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:48:21.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:48:21.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:48:21.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:48:21.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:48:21.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:48:21.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:48:14
2026-05-28T09:48:21.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68663, datetime.datetime(2026, 5, 28, 9, 48, 14), datetime.datetime(2026, 5, 28, 9, 48, 14), 'salt', 10.32, 49.67, None, 8.75, 313.34, 10.06, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:48:21.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:48:21.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:48:21.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:14, diff=7.803664s, valid=True
2026-05-28T09:48:21.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:48:21.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:48:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:12, diff=9.80649s, valid=True
2026-05-28T09:48:21.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:48:21.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:10, diff=11.813248s, valid=True
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:48:21.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:48:21.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:12, diff=9.816231s, valid=True
2026-05-28T09:48:21.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:48:21.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:48:21.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:48:21.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887143.81689s, valid=True
2026-05-28T09:48:21.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:48:21.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:48:21.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:48:21.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:48:21.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:48:21.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:48:21.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:48:21.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:48:21.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:48:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:48:22.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:48:22.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:48:22.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:48:22.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:48:22.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:48:22.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:48:22.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:48:22.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:48:22.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-28T09:48:22.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-28T09:48:23.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:48:23.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:48:53.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:48:53.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:48:53.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:48:53.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:48:53.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:48:53.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:48:53.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-28T09:48:53.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:48:53.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-28T09:48:53.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:48:53.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:48:53.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:48:53.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-28T09:48:56.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-28T09:48:56.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:48:56.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:48:56.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:48:56.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:48:56.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:48:56.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:48:56.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:48:56.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:48:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:48:56.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:48:56.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:48:56.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:48:56.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:48:56.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:48:56.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:48:56.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:48:56.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:48:56.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:48:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:48:56.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:48:56.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:48:56.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:48:56.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:48:56.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:48:45
2026-05-28T09:48:56.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68664, datetime.datetime(2026, 5, 28, 9, 48, 45), datetime.datetime(2026, 5, 28, 9, 48, 44), 'salt', 10.32, 48.17, None, 9.67, 302.63, 10.48, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:48:56.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:48:56.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:48:56.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:44, diff=12.795977s, valid=True
2026-05-28T09:48:56.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:48:56.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:48:56.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:12, diff=-15.20107s, valid=True
2026-05-28T09:48:56.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:48:56.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:48:41, diff=15.805603s, valid=True
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:48:56.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:48:56.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:48:56.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:12, diff=-15.19102s, valid=True
2026-05-28T09:48:56.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:48:56.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:48:56.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:48:56.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887178.809677s, valid=True
2026-05-28T09:48:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:48:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:48:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:48:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:48:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:48:56.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:48:56.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:48:56.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:48:56.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:48:56.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:48:57.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:48:57.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:48:57.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:48:57.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:48:57.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:48:57.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:48:57.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:48:57.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:48: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-28T09:48: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-28T09:48:57.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:48:57.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:49:27.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:49:27.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:49:27.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:49:28.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:49:28.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:49:28.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:49:28.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-28T09:49:28.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:49:28.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-28T09:49:28.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:49:28.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:49:28.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:49:28.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-28T09:49:31.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-28T09:49:31.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:49:31.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:49:31.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:49:31.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:49:31.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:49:31.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:49:31.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:49:31.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:49:31.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:49:31.054 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:49:31.054 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:49:31.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:49:31.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:49:31.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:49:31.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:49:31.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:49:31.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:49:31.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:49:31.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:49:31.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:49:31.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:49:31.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:49:31.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:49:31.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:49:15
2026-05-28T09:49:31.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68665, datetime.datetime(2026, 5, 28, 9, 49, 15), datetime.datetime(2026, 5, 28, 9, 49, 15), 'salt', 10.32, 48.27, None, 7.84, 306.95, 10.45, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:49:31.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:49:31.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:49:31.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:15, diff=16.370469s, valid=True
2026-05-28T09:49:31.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:49:31.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:49:31.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:12, diff=19.373314s, valid=True
2026-05-28T09:49:31.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:49:31.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:15, diff=16.380027s, valid=True
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:49:31.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:49:31.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:12, diff=19.38304s, valid=True
2026-05-28T09:49:31.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:49:31.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:49:31.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:49:31.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887213.383698s, valid=True
2026-05-28T09:49:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:49:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:49:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:49:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:49:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:49:31.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:49:31.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:49:31.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:49:31.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:49:31.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:49:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:49:31.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:49:31.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:49:31.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:49:31.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:49:32.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:49:32.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:49:32.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:49:32.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-28T09:49:32.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-28T09:49:32.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:49:32.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:50:02.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:50:02.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:50:02.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:50:03.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:50:03.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:50:03.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:50:03.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-28T09:50:03.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:50:03.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-28T09:50:03.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:50:03.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:50:03.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:50:03.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-28T09:50:05.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-28T09:50:05.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:50:05.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:50:05.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:50:05.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:50:05.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:50:05.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:50:05.563 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:50:05.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:50:05.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:50:05.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:50:05.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:50:05.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:50:05.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:50:05.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:50:05.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:50:05.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:50:05.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:50:05.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:50:05.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:50:05.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:50:05.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:50:05.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:50:05.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:50:05.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:49:45
2026-05-28T09:50:05.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68666, datetime.datetime(2026, 5, 28, 9, 49, 45), datetime.datetime(2026, 5, 28, 9, 49, 45), 'salt', 10.35, 49.67, None, 5.72, 290.59, 10.06, 830.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:50:05.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:50:05.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:50:05.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:45, diff=20.911591s, valid=True
2026-05-28T09:50:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:50:05.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:50:05.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:12, diff=-6.08545s, valid=True
2026-05-28T09:50:05.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:50:05.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:49:45, diff=20.921347s, valid=True
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:50:05.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:50:05.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:12, diff=-6.07556s, valid=True
2026-05-28T09:50:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:50:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:50:05.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:50:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887247.925158s, valid=True
2026-05-28T09:50:05.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:50:05.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:50:05.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:50:05.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:50:05.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:50:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:50:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:50:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:50:06.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:50:06.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:50:06.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:50:06.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:50:06.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:50:06.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:50:06.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:50:06.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:50:06.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:50:06.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:50:06.930 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:50:06.930 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:50:07.175 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:50:07.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:50:37.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:50:37.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:50:37.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:50:37.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:50:37.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:50:37.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:50:37.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:50:37.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:50:37.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-28T09:50:37.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:50:37.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:50:37.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:50:37.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:50:40.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:50:40.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:50:40.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:50:40.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:50:40.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:50:40.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:50:40.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:50:40.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:50:40.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:50:40.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:50:40.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:50:40.028 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:50:40.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:50:40.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:50:40.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:50:40.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:50:40.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:50:40.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:50:40.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:50:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:50:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:50:40.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:50:40.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:50:40.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:50:40.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:50:16
2026-05-28T09:50:40.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68667, datetime.datetime(2026, 5, 28, 9, 50, 16), datetime.datetime(2026, 5, 28, 9, 50, 15), 'salt', 10.42, 47.11, None, 8.44, 292.02, 10.79, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:50:40.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:50:40.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:50:40.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:15, diff=25.336258s, valid=True
2026-05-28T09:50:40.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:50:40.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:50:40.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:12, diff=28.339097s, valid=True
2026-05-28T09:50:40.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:50:40.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:50:40.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:16, diff=24.34568s, valid=True
2026-05-28T09:50:40.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:50:40.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:50:40.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:50:40.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:50:40.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:50:40.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:50:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:12, diff=28.348682s, valid=True
2026-05-28T09:50:40.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:50:40.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:50:40.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:50:40.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887282.349334s, valid=True
2026-05-28T09:50:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:50:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:50:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:50:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:50:40.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:50:40.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:50:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:50:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:50:40.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:50:40.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:50:40.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:50:40.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:50:40.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:50:40.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:50:40.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:50:41.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:50:41.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:50:41.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:50:41.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-28T09:50:41.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-28T09:50:41.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:50:41.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:51:11.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:51:11.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:51:11.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:51:12.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:51:12.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:51:12.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:51:12.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-28T09:51:12.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:51:12.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-28T09:51:12.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:51:12.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:51:12.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:51:12.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:51:14.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-28T09:51:14.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:51:14.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:51:14.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:51:14.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:51:14.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:51:14.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:51:14.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:51:14.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:51:14.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:51:14.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:51:14.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:51:14.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:51:14.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:51:14.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:51:15.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:51:15.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:51:15.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:51:15.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:51:15.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:51:15.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:51:15.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:51:15.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:51:15.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:51:15.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:50:46
2026-05-28T09:51:15.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68668, datetime.datetime(2026, 5, 28, 9, 50, 46), datetime.datetime(2026, 5, 28, 9, 50, 45), 'salt', 10.45, 46.35, None, 8.19, 287.26, 11.02, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:51:15.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:51:15.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:51:15.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:45, diff=30.230963s, valid=True
2026-05-28T09:51:15.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:51:15.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:51:15.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:51:12, diff=3.233791s, valid=True
2026-05-28T09:51:15.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:51:15.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:50:36, diff=39.24051s, valid=True
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:51:15.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:51:15.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:51:12, diff=3.24354s, valid=True
2026-05-28T09:51:15.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:51:15.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:51:15.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:51:15.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887317.244218s, valid=True
2026-05-28T09:51:15.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:51:15.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:51:15.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:51:15.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:51:15.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:51:15.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:51:15.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:51:15.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:51:15.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:51:15.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:51:15.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:51:15.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:51:15.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:51:15.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:51:15.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:51:16.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:51:16.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:51:16.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:51:16.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-28T09:51:16.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-28T09:51:16.288 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:51:16.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:51:46.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:51:46.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:51:46.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:51:46.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:51:46.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:51:46.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:51:46.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-28T09:51:46.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:51:46.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-28T09:51:46.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:51:46.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:51:46.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:51:46.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:51: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-28T09:51:49.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:51:49.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:51:49.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:51:49.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:51:49.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:51:49.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:51:49.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:51:49.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:51:49.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:51:49.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:51:49.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:51:49.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:51:49.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T09:51:49.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:51:49.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T09:51:49.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:51:49.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:51:49.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:51:49.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T09:51:49.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:51:49.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:51:49.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:51:49.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:51:49.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:51:46
2026-05-28T09:51:49.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68670, datetime.datetime(2026, 5, 28, 9, 51, 46), datetime.datetime(2026, 5, 28, 9, 51, 46), 'salt', 10.58, 45.12, None, 8.54, 289.81, 11.39, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:51:49.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:51:49.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T09:51:49.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:51:46, diff=3.88463s, valid=True
2026-05-28T09:51:49.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:51:49.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:51:49.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:12, diff=-22.112366s, valid=True
2026-05-28T09:51:49.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:51:49.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T09:51:49.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:51:39, diff=10.894572s, valid=True
2026-05-28T09:51:49.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:51:49.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:51:49.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:51:49.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:51:49.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:51:49.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T09:51:49.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:12, diff=-22.10228s, valid=True
2026-05-28T09:51:49.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:51:49.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:51:49.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:51:49.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887351.89842s, valid=True
2026-05-28T09:51:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:51:49.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:51:49.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:51:49.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:51:49.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:51:49.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:51:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:51:49.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:51:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:51:50.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:51:50.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:51:50.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:51:50.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:51:50.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:51:50.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:51:50.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:51:50.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:51:50.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:51:50.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-28T09:51:50.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-28T09:51:51.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:51:51.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:52:21.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:52:21.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:52:21.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:52:21.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:52:21.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:52:21.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:52:21.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-28T09:52:21.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:52:21.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-28T09:52:21.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:52:21.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:52:21.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:52:21.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-28T09:52:24.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-28T09:52:24.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:52:24.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:52:24.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:52:24.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:52:24.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:52:24.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:52:24.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:52:24.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:52:24.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:52:24.388 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:52:24.388 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:52:24.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:52:24.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:52:24.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:52:24.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:52:24.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:52:24.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:52:24.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:52:24.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:52:24.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:52:24.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:52:24.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:52:24.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:52:24.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:52:16
2026-05-28T09:52:24.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68671, datetime.datetime(2026, 5, 28, 9, 52, 16), datetime.datetime(2026, 5, 28, 9, 52, 16), 'salt', 10.58, 43.99, None, 7.45, 306.5, 11.74, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:52:24.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:52:24.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:52:24.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:16, diff=8.706987s, valid=True
2026-05-28T09:52:24.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:52:24.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:52:24.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:12, diff=12.710782s, valid=True
2026-05-28T09:52:24.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:52:24.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:52:24.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:11, diff=13.717693s, valid=True
2026-05-28T09:52:24.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:52:24.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:52:24.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:52:24.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:52:24.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:52:24.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:52:24.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:12, diff=12.720777s, valid=True
2026-05-28T09:52:24.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:52:24.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:52:24.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:52:24.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887386.721432s, valid=True
2026-05-28T09:52:24.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:52:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:52:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:52:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:52:24.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:52:24.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:52:24.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:52:24.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:52:24.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:52:24.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:52:24.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:52:24.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:52:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:52:25.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:52:25.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:52:25.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:52:25.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:52:25.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:52:25.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:52:25.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:52:25.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:52:25.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:52:55.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:52:55.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:52:55.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:52:56.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:52:56.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:52:56.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:52:56.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-28T09:52:56.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:52:56.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-28T09:52:56.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:52:56.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:52:56.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:52:56.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-28T09:52:59.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-28T09:52:59.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:52:59.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:52:59.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:52:59.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:52:59.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:52:59.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:52:59.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:52:59.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:52:59.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:52:59.055 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:52:59.055 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:52:59.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:52:59.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:52:59.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:52:59.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:52:59.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:52:59.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:52:59.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:52:59.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:52:59.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:52:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:52:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:52:59.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:52:59.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:52:47
2026-05-28T09:52:59.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68672, datetime.datetime(2026, 5, 28, 9, 52, 47), datetime.datetime(2026, 5, 28, 9, 52, 46), 'salt', 10.55, 42.3, None, 8.86, 302.7, 12.27, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:52:59.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:52:59.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:52:59.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:46, diff=13.383282s, valid=True
2026-05-28T09:52:59.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:52:59.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:52:59.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:12, diff=-12.613807s, valid=True
2026-05-28T09:52:59.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:52:59.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:52:59.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:52:42, diff=17.392965s, valid=True
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:52:59.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:52:59.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:12, diff=-12.603971s, valid=True
2026-05-28T09:52:59.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:52:59.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:52:59.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:52:59.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887421.396687s, valid=True
2026-05-28T09:52:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:52:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:52:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:52:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:52:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:52:59.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:52:59.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:52:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:52:59.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:52:59.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:52:59.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:52:59.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:52:59.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:52:59.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:52:59.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:53:00.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:53:00.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:53:00.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:53:00.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-28T09:53:00.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-28T09:53:00.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:53:00.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:53:30.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:53:30.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:53:30.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:53:30.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:53:30.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:53:31.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:53:31.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:53:31.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:53:31.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-28T09:53:31.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:53:31.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:53:31.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:53:31.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:53:33.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-28T09:53:33.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:53:33.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:53:33.819 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:53:33.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:53:33.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:53:33.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:53:33.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:53:33.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:53:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:53:33.840 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:53:33.840 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:53:33.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:53:33.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:53:33.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:53:34.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:53:34.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:53:34.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:53:34.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:53:34.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:53:34.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:53:34.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:53:34.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:53:34.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:53:34.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:53:17
2026-05-28T09:53:34.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68673, datetime.datetime(2026, 5, 28, 9, 53, 17), datetime.datetime(2026, 5, 28, 9, 53, 16), 'salt', 10.58, 42.0, None, 8.26, 315.91, 12.37, 830.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:53:34.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:53:34.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:53:34.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:16, diff=18.160532s, valid=True
2026-05-28T09:53:34.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:53:34.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:53:34.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:12, diff=22.163455s, valid=True
2026-05-28T09:53:34.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:53:34.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:13, diff=21.170138s, valid=True
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:53:34.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:53:34.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:12, diff=22.173229s, valid=True
2026-05-28T09:53:34.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:53:34.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:53:34.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:53:34.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887456.173898s, valid=True
2026-05-28T09:53:34.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:53:34.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:53:34.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:53:34.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:53:34.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:53:34.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:53:34.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:53:34.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:53:34.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:53:34.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:53:34.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:53:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:53:34.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:53:34.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:53:34.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:53:35.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:53:35.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:53:35.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:53:35.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-28T09:53:35.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-28T09:53:35.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:53:35.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:54:05.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:54:05.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:54: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-28T09:54:05.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:54:05.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:54:06.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:54:06.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-28T09:54:06.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:54:06.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-28T09:54:06.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:54:06.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:54:06.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:54:06.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-28T09:54:08.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-28T09:54:08.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:54:08.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:54:08.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:54:08.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:54:08.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:54:08.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:54:08.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:54:08.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:54:08.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:54:08.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:54:08.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:54:08.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:54:08.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:54:08.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:54:08.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:54:08.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:54:08.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:54:08.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:54:09.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:54:09.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:54:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:54:09.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:54:09.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:54:09.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:53:47
2026-05-28T09:54:09.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68674, datetime.datetime(2026, 5, 28, 9, 53, 47), datetime.datetime(2026, 5, 28, 9, 53, 47), 'salt', 10.58, 43.43, None, 6.39, 283.4, 11.92, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:54:09.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:54:09.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:54:09.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:47, diff=22.076147s, valid=True
2026-05-28T09:54:09.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:54:09.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:54:09.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:12, diff=-2.921s, valid=True
2026-05-28T09:54:09.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:54:09.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:54:09.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:53:45, diff=24.085696s, valid=True
2026-05-28T09:54:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:54:09.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:54:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:54:09.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:54:09.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:54:09.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:54:09.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:12, diff=-2.911314s, valid=True
2026-05-28T09:54:09.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:54:09.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:54:09.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:54:09.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887491.089327s, valid=True
2026-05-28T09:54:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:54:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:54:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:54:09.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:54:09.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:54:09.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:54:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:54:09.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:54:09.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:54:09.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:54:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:54:09.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:54:09.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:54:09.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:54:09.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:54:09.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:54:10.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:54:10.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:54:10.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-28T09:54:10.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-28T09:54:10.141 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:54:10.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:54:40.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:54:40.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:54:40.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:54:40.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:54:40.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:54:40.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:54:40.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-28T09:54:40.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:54:40.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-28T09:54:40.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:54:40.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:54:40.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:54:40.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-28T09:54:43.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-28T09:54:43.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:54:43.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:54:43.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:54:43.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:54:43.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:54:43.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:54:43.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:54:43.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:54:43.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:54:43.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:54:43.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:54:43.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:54:43.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:54:43.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:54:43.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:54:43.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:54:43.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:54:43.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:54:43.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:54:43.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:54:43.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:54:43.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:54:43.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:54:43.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:54:17
2026-05-28T09:54:43.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68675, datetime.datetime(2026, 5, 28, 9, 54, 17), datetime.datetime(2026, 5, 28, 9, 54, 17), 'salt', 10.71, 44.02, None, 7.02, 297.49, 11.74, 830.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:54:43.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:54:43.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:54:43.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:17, diff=26.366865s, valid=True
2026-05-28T09:54:43.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:54:43.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:54:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:12, diff=31.369723s, valid=True
2026-05-28T09:54:43.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:54:43.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:16, diff=27.376437s, valid=True
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:54:43.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:54:43.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:12, diff=31.379458s, valid=True
2026-05-28T09:54:43.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:54:43.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:54:43.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:54:43.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887525.380131s, valid=True
2026-05-28T09:54:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:54:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:54:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:54:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:54:43.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:54:43.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:54:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:54:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:54:43.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:54:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:54:43.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:54:43.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:54:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:54:43.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:54:44.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:54:44.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:54:44.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:54:44.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:54:44.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-28T09:54:44.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-28T09:54:44.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:54:44.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:55:14.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:55:14.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:55:14.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:55:14.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:55:14.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:55:15.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:55:15.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-28T09:55:15.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:55:15.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-28T09:55:15.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:55:15.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:55:15.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:55:15.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-28T09:55:17.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-28T09:55:17.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:55:17.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:55:17.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:55:17.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:55:17.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:55:17.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:55:17.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:55:17.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:55:17.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:55:17.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:55:17.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:55:17.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:55:17.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:55:17.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:55:17.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:55:17.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:55:17.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:55:17.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:55:17.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:55:17.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:55:17.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:55:17.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:55:17.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:55:17.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:54:48
2026-05-28T09:55:17.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68676, datetime.datetime(2026, 5, 28, 9, 54, 48), datetime.datetime(2026, 5, 28, 9, 54, 47), 'salt', 10.61, 41.4, None, 9.04, 275.4, 12.57, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:55:17.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:55:17.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:55:17.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:47, diff=30.906504s, valid=True
2026-05-28T09:55:17.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:55:17.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:55:17.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:55:12, diff=5.909391s, valid=True
2026-05-28T09:55:17.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:55:17.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:54:38, diff=39.916144s, valid=True
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:55:17.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:55:17.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:55:12, diff=5.919203s, valid=True
2026-05-28T09:55:17.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:55:17.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:55:17.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:55:17.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887559.91989s, valid=True
2026-05-28T09:55:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:55:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:55:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:55:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:55:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:55:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:55:17.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:55:17.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:55:18.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:55:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:55:18.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:55:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:55:18.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:55:18.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:55:18.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:55:18.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:55:18.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:55:18.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:55:18.892 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:55:18.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T09:55:18.960 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:55:18.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:55:48.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:55:48.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:55:48.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:55:49.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:55:49.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:55:49.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:55:49.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-28T09:55:49.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:55:49.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-28T09:55:49.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:55:49.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:55:49.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:55:49.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-28T09:55:52.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-28T09:55:52.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:55:52.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:55:52.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:55:52.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:55:52.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:55:52.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:55:52.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:55:52.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:55:52.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:55:52.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:55:52.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:55:52.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:55:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:55:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:55:52.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:55:52.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:55:52.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:55:52.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:55:52.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:55:52.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:55:52.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:55:52.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:55:52.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:55:52.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:55:48
2026-05-28T09:55:52.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68678, datetime.datetime(2026, 5, 28, 9, 55, 48), datetime.datetime(2026, 5, 28, 9, 55, 48), 'salt', 10.55, 41.8, None, 9.0, 276.96, 12.44, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:55:52.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:55:52.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:55:52.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:55:48, diff=4.827355s, valid=True
2026-05-28T09:55:52.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:55:52.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:55:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:12, diff=-19.169817s, valid=True
2026-05-28T09:55:52.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:55:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:55:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:55:40, diff=12.836819s, valid=True
2026-05-28T09:55:52.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:55:52.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:55:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:55:52.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:55:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:55:52.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:55:52.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:12, diff=-19.160135s, valid=True
2026-05-28T09:55:52.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:55:52.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:55:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:55:52.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887594.840517s, valid=True
2026-05-28T09:55:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:55:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:55:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:55:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:55:52.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:55:52.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:55:52.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:55:52.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:55:52.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:55:52.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:55:53.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:55:53.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:55:53.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:55:53.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:55:53.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:55:53.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:55:53.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:55:53.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:55: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-28T09:55: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-28T09:55:53.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:55:53.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:56:23.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:56:23.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:56: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-28T09:56:24.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:56:24.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:56:24.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:56:24.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-28T09:56:24.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:56:24.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:56:24.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:56:24.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:56:24.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:56:24.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-28T09:56:26.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-28T09:56:26.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:56:26.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:56:26.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:56:26.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:56:26.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:56:26.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:56:26.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:56:26.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:56:26.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:56:26.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:56:26.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:56:26.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:56:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:56:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:56:26.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:56:26.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:56:26.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:56:26.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:56:26.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:56:26.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:56:26.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:56:26.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:56:26.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:56:27.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:56:18
2026-05-28T09:56:27.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68679, datetime.datetime(2026, 5, 28, 9, 56, 18), datetime.datetime(2026, 5, 28, 9, 56, 18), 'salt', 10.61, 40.67, None, 8.89, 282.53, 12.81, 830.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:56:27.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:56:27.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:56:27.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:18, diff=9.06255s, valid=True
2026-05-28T09:56:27.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:56:27.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:56:27.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:12, diff=15.065355s, valid=True
2026-05-28T09:56:27.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:56:27.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:56:27.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:11, diff=16.071963s, valid=True
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:56:27.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:56:27.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:12, diff=15.074988s, valid=True
2026-05-28T09:56:27.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:56:27.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:56:27.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:56:27.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887629.075637s, valid=True
2026-05-28T09:56:27.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:56:27.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:56:27.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:56:27.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:56:27.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:56:27.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:56:27.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:56:27.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:56:27.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:56:27.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:56:27.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:56:27.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:56:27.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:56:27.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:56:27.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:56:27.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:56:28.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:56:28.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:56:28.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-28T09:56:28.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-28T09:56:28.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:56:28.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:56:58.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:56:58.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:56:58.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:56:58.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:56:58.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:56:58.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:56:58.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-28T09:56:58.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:56:58.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-28T09:56:58.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:56:58.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:56:58.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:56:58.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-28T09:57:01.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-28T09:57:01.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:57:01.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:57:01.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:57:01.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:57:01.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:57:01.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:57:01.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:57:01.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:57:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:57:01.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:57:01.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:57:01.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:57:01.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:57:01.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:57:01.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:57:01.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:57:01.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:57:01.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:57:01.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:57:01.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:57:01.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:57:01.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:57:01.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:57:01.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:56:48
2026-05-28T09:57:01.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68680, datetime.datetime(2026, 5, 28, 9, 56, 48), datetime.datetime(2026, 5, 28, 9, 56, 48), 'salt', 10.61, 35.83, None, 8.44, 281.04, 14.51, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:57:01.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:57:01.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:57:01.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:48, diff=13.394946s, valid=True
2026-05-28T09:57:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:57:01.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:57:01.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:12, diff=-10.60225s, valid=True
2026-05-28T09:57:01.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:57:01.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:56:43, diff=18.404186s, valid=True
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:57:01.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:57:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:12, diff=-10.592798s, valid=True
2026-05-28T09:57:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:57:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:57:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:57:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887663.407874s, valid=True
2026-05-28T09:57:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:57:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:57:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:57:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:57:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:57:01.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:57:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:57:01.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:57:01.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:57:01.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:57:01.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:57:01.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:57:01.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:57:01.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:57:02.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:57:02.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:57:02.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:57:02.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:57: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-28T09:57: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-28T09:57:02.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:57:02.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:57:32.712 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:57:32.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:57:32.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:57:32.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:57:32.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:57:33.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:57:33.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-28T09:57:33.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:57:33.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:57:33.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:57:33.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:57:33.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:57:33.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-28T09:57:35.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-28T09:57:35.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:57:35.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:57:35.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:57:35.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:57:35.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:57:35.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:57:35.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:57:35.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:57:35.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:57:35.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:57:35.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:57:35.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:57:35.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:57:35.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:57:36.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:57:36.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:57:36.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:57:36.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:57:36.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:57:36.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:57:36.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:57:36.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:57:36.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:57:36.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:57:19
2026-05-28T09:57:36.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68681, datetime.datetime(2026, 5, 28, 9, 57, 19), datetime.datetime(2026, 5, 28, 9, 57, 18), 'salt', 10.68, 35.96, None, 8.36, 290.69, 14.47, 830.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:57:36.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:57:36.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:57:36.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:18, diff=18.149788s, valid=True
2026-05-28T09:57:36.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:57:36.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:57:36.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:12, diff=24.152609s, valid=True
2026-05-28T09:57:36.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:57:36.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:15, diff=21.159243s, valid=True
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:57:36.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:57:36.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:12, diff=24.162227s, valid=True
2026-05-28T09:57:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:57:36.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:57:36.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:57:36.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887698.16288s, valid=True
2026-05-28T09:57:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:57:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:57:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:57:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:57:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:57:36.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:57:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:57:36.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:57:36.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:57:36.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:57:36.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:57:36.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:57:36.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:57:36.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:57:36.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:57:37.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:57:37.137 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:57:37.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:57:37.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-28T09:57:37.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-28T09:57:37.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:57:37.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:58:07.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:58:07.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:58:07.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:58:07.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:58:07.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:58:07.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:58:07.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T09:58:07.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:58:07.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T09:58:07.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:58:07.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:58:07.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:58:07.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-28T09:58:10.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:58:10.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:58:10.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:58:10.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:58:10.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:58:10.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:58:10.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:58:10.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:58:10.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:58:10.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:58:10.179 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:58:10.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:58:10.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:58:10.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:58:10.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:58:10.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:58:10.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:58:10.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:58:10.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:58:10.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:58:10.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:58:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:58:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:58:10.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:58:10.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:57:49
2026-05-28T09:58:10.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68682, datetime.datetime(2026, 5, 28, 9, 57, 49), datetime.datetime(2026, 5, 28, 9, 57, 49), 'salt', 10.61, 37.32, None, 7.98, 272.19, 13.97, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:58:10.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:58:10.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:58:10.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:49, diff=21.487454s, valid=True
2026-05-28T09:58:10.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:58:10.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:58:10.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:12, diff=-1.509591s, valid=True
2026-05-28T09:58:10.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:58:10.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:57:46, diff=24.497101s, valid=True
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:58:10.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:58:10.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:12, diff=-1.499892s, valid=True
2026-05-28T09:58:10.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:58:10.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:58:10.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:58:10.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887732.500761s, valid=True
2026-05-28T09:58:10.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:58:10.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:58:10.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:58:10.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:58:10.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:58:10.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:58:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:58:10.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:58:10.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:58:10.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:58:10.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:58:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:58:10.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:58:10.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:58:11.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:58:11.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:58:11.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:58:11.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:58:11.470 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T09:58:11.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-28T09:58:11.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:58:11.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:58:41.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:58:41.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:58:41.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:58:41.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:58:41.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:58:42.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:58:42.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-28T09:58:42.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:58:42.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-28T09:58:42.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:58:42.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:58:42.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:58:42.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T09:58:44.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-28T09:58:44.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:58:44.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:58:44.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:58:44.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:58:44.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:58:44.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:58:44.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:58:44.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:58:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:58:44.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:58:44.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:58:44.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:58:44.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:58:44.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:58:44.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:58:44.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:58:45.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:58:45.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:58:45.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:58:45.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:58:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:58:45.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:58:45.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:58:45.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:58:19
2026-05-28T09:58:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68683, datetime.datetime(2026, 5, 28, 9, 58, 19), datetime.datetime(2026, 5, 28, 9, 58, 19), 'salt', 10.68, 38.62, None, 9.32, 269.92, 13.52, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:58:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:58:45.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:58:45.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:19, diff=26.10842s, valid=True
2026-05-28T09:58:45.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:58:45.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:58:45.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:12, diff=33.111214s, valid=True
2026-05-28T09:58:45.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:58:45.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:58:45.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:18, diff=27.117823s, valid=True
2026-05-28T09:58:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:58:45.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:58:45.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:58:45.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:58:45.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:58:45.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:58:45.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:12, diff=33.120824s, valid=True
2026-05-28T09:58:45.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:58:45.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:58:45.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:58:45.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887767.121465s, valid=True
2026-05-28T09:58:45.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:58:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:58:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:58:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:58:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:58:45.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:58:45.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:58:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:58:45.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:58:45.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:58:45.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:58:45.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:58:45.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:58:45.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:58:45.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:58:46.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:58:46.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:58:46.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:58:46.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-28T09:58:46.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-28T09:58:46.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:58:46.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:59:16.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:59:16.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:59:16.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:59:16.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:59:16.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:59:16.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:59:16.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-28T09:59:16.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:59:16.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-28T09:59:16.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:59:16.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:59:16.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:59:16.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-28T09:59:19.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T09:59:19.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:59:19.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:59:19.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:59:19.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:59:19.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:59:19.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:59:19.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:59:19.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:59:19.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:59:19.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:59:19.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:59:19.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:59:19.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:59:19.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:59:19.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:59:19.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:59:19.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:59:19.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:59:19.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:59:19.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:59:19.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:59:19.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:59:19.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:59:19.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:58:50
2026-05-28T09:59:19.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68684, datetime.datetime(2026, 5, 28, 9, 58, 50), datetime.datetime(2026, 5, 28, 9, 58, 49), 'salt', 10.74, 37.72, None, 9.39, 289.77, 13.84, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:59:19.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:59:19.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:59:19.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:49, diff=30.607831s, valid=True
2026-05-28T09:59:19.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:59:19.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:59:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:59:12, diff=7.610748s, valid=True
2026-05-28T09:59:19.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:59:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:58:49, diff=30.617471s, valid=True
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:59:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:59:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:59:12, diff=7.620525s, valid=True
2026-05-28T09:59:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:59:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:59:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:59:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887801.621236s, valid=True
2026-05-28T09:59:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:59:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:59:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:59:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:59:19.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:59:19.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:59:19.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:59:19.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:59:19.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:59:19.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:59:19.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:59:19.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:59:19.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:59:19.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:59:20.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:59:20.531 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:59:20.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:59:20.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:59:20.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-28T09:59:20.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-28T09:59:20.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:59:20.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T09:59:50.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T09:59:50.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T09:59:50.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T09:59:51.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T09:59:51.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T09:59:51.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T09:59:51.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-28T09:59:51.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T09:59:51.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-28T09:59:51.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T09:59:51.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T09:59:51.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T09:59:51.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-28T09:59:54.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-28T09:59:54.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T09:59:54.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T09:59:54.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T09:59:54.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T09:59:54.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T09:59:54.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T09:59:54.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T09:59:54.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T09:59:54.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T09:59:54.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T09:59:54.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T09:59:54.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T09:59:54.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T09:59:54.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T09:59:54.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T09:59:54.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:59:54.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:59:54.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T09:59:54.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T09:59:54.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T09:59:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T09:59:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T09:59:54.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T09:59:54.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 09:59:50
2026-05-28T09:59:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68686, datetime.datetime(2026, 5, 28, 9, 59, 50), datetime.datetime(2026, 5, 28, 9, 59, 50), 'salt', 10.68, 38.91, None, 9.28, 287.92, 13.42, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T09:59:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T09:59:54.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T09:59:54.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:59:50, diff=4.626615s, valid=True
2026-05-28T09:59:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T09:59:54.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:59:54.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:12, diff=-17.370485s, valid=True
2026-05-28T09:59:54.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T09:59:54.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 09:59:41, diff=13.636133s, valid=True
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T09:59:54.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T09:59:54.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:12, diff=-17.360843s, valid=True
2026-05-28T09:59:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T09:59:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T09:59:54.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T09:59:54.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887836.63982s, valid=True
2026-05-28T09:59:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T09:59:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T09:59:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T09:59:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T09:59:54.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T09:59:54.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T09:59:54.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T09:59:54.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T09:59:54.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T09:59:54.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T09:59:54.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T09:59:54.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T09:59:54.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T09:59:55.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T09:59:55.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:59:55.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T09:59:55.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T09:59:55.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T09:59:55.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-28T09:59:55.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-28T09:59:55.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T09:59:55.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:00:25.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:00:25.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:00:25.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:00:26.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:00:26.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:00:26.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:00:26.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-28T10:00:26.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:00:26.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-28T10:00:26.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:00:26.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:00:26.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:00:26.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-28T10:00: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-28T10:00:28.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:00:28.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:00:28.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:00:28.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:00:28.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:00:29.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:00:29.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:00:29.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:00:29.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:00:29.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:00:29.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:00:29.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:00:29.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:00:29.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:00:29.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:00:29.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:00:29.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:00:29.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:00:29.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:00:29.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:00:29.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:00:29.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:00:29.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:00:29.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:00:20
2026-05-28T10:00:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68687, datetime.datetime(2026, 5, 28, 10, 0, 20), datetime.datetime(2026, 5, 28, 10, 0, 20), 'salt', 10.74, 37.45, None, 9.28, 272.83, 13.93, 830.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:00:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:00:29.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:00:29.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:20, diff=9.314626s, valid=True
2026-05-28T10:00:29.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:00:29.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:00:29.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:12, diff=17.317513s, valid=True
2026-05-28T10:00:29.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:00:29.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:13, diff=16.324376s, valid=True
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:00:29.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:00:29.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:12, diff=17.327432s, valid=True
2026-05-28T10:00:29.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:00:29.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:00:29.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:00:29.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887871.328108s, valid=True
2026-05-28T10:00:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:00:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:00:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:00:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:00:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:00:29.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:00:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:00:29.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:00:29.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:00:29.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:00:29.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:00:29.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:00:29.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:00:29.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:00:29.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:00:30.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:00:30.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:00:30.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:00:30.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-28T10:00:30.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-28T10:00:30.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:00:30.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:01:00.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:01:00.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:01:00.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:01:00.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:01:00.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:01:01.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:01:01.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-28T10:01:01.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:01:01.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-28T10:01:01.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:01:01.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:01:01.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:01:01.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-28T10:01:03.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-28T10:01:03.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:01:03.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:01:03.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:01:03.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:01:03.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:01:03.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:01:03.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:01:03.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:01:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:01:03.492 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:01:03.492 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:01:03.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:01:03.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:01:03.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:01:03.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:01:03.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:01:03.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:01:03.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:01:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:01:03.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:01:03.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:01:03.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:01:03.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:01:03.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:00:50
2026-05-28T10:01:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68688, datetime.datetime(2026, 5, 28, 10, 0, 50), datetime.datetime(2026, 5, 28, 10, 0, 50), 'salt', 10.71, 33.54, None, 9.67, 297.52, 15.4, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:01:03.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:01:03.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:01:03.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:50, diff=13.806901s, valid=True
2026-05-28T10:01:03.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:01:03.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:01:03.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:12, diff=-8.190259s, valid=True
2026-05-28T10:01:03.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:01:03.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:00:44, diff=19.816458s, valid=True
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:01:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:01:03.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:12, diff=-8.180498s, valid=True
2026-05-28T10:01:03.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:01:03.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:01:03.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:01:03.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887905.820173s, valid=True
2026-05-28T10:01:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:01:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:01:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:01:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:01:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:01:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:01:03.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:01:03.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:01:03.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:01:03.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:01:04.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:01:04.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:01:04.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:01:04.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:01:04.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:01:04.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:01:04.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:01:04.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:01: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-28T10:01: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-28T10:01:05.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:01:05.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:01:35.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:01:35.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:01:35.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:01:35.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:01:35.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:01:36.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:01:36.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-28T10:01:36.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:01: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-28T10:01:36.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:01:36.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:01:36.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:01: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-28T10:01:38.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-28T10:01:38.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:01:38.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:01:38.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:01:38.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:01:38.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:01:38.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:01:38.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:01:38.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:01:38.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:01:38.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:01:38.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:01:38.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:01:38.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:01:38.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:01:38.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:01:38.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:01:38.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:01:38.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:01:38.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:01:38.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:01:38.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:01:38.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:01:38.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:01:38.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:01:21
2026-05-28T10:01:38.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68689, datetime.datetime(2026, 5, 28, 10, 1, 21), datetime.datetime(2026, 5, 28, 10, 1, 20), 'salt', 10.71, 32.94, None, 9.42, 287.52, 15.64, 830.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:01:38.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:01:38.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:01:38.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:20, diff=18.825847s, valid=True
2026-05-28T10:01:38.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:01:38.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:01:38.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:12, diff=26.828685s, valid=True
2026-05-28T10:01:38.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:01:38.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:15, diff=23.835325s, valid=True
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:01:38.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:01:38.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:12, diff=26.838353s, valid=True
2026-05-28T10:01:38.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:01:38.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:01:38.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:01:38.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887940.839009s, valid=True
2026-05-28T10:01:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:01:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:01:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:01:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:01:38.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:01:38.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:01:38.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:01:38.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:01:38.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:01:38.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:01:39.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:01:39.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:01:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:01:39.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:01:39.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:01:39.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:01:39.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:01:39.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:01:39.839 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:01:39.839 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:01:39.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:01:39.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:02:09.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:02:09.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:02:09.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:02:10.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:02:10.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:02:10.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:02:10.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-28T10:02:10.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:02:10.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-28T10:02:10.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:02:10.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:02:10.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:02:10.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-28T10:02:12.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-28T10:02:12.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:02:13.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:02:13.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:02:13.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:02:13.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:02:13.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:02:13.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:02:13.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:02:13.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:02:13.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:02:13.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:02:13.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:02:13.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:02:13.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:02:13.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:02:13.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:02:13.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:02:13.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:02:13.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:02:13.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:02:13.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:02:13.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:02:13.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:02:13.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:01:51
2026-05-28T10:02:13.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68690, datetime.datetime(2026, 5, 28, 10, 1, 51), datetime.datetime(2026, 5, 28, 10, 1, 51), 'salt', 10.78, 36.39, None, 8.65, 279.35, 14.33, 830.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:02:13.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:02:13.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:02:13.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:51, diff=22.421243s, valid=True
2026-05-28T10:02:13.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:02:13.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:02:13.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:12, diff=1.42406s, valid=True
2026-05-28T10:02:13.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:02:13.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:02:13.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:01:47, diff=26.430616s, valid=True
2026-05-28T10:02:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:02:13.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:02:13.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:02:13.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:02:13.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:02:13.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:02:13.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:12, diff=1.433632s, valid=True
2026-05-28T10:02:13.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:02:13.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:02:13.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:02:13.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=887975.43428s, valid=True
2026-05-28T10:02:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:02:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:02:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:02:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:02:13.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:02:13.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:02:13.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:02:13.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:02:13.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:02:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:02:13.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:02:13.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:02:13.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:02:13.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:02:13.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:02:14.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:02:14.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:02:14.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:02:14.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-28T10:02:14.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-28T10:02:14.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:02:14.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:02:44.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:02:44.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:02:44.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:02:45.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:02:45.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:02:45.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:02:45.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:02:45.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:02:45.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-28T10:02:45.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:02:45.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:02:45.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:02: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-28T10:02:48.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-28T10:02:48.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:02:48.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:02:48.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:02:48.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:02:48.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:02:48.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:02:48.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:02:48.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:02:48.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:02:48.249 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:02:48.249 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:02:48.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:02:48.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:02:48.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:02:48.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:02:48.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:02:48.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:02:48.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:02:48.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:02:48.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:02:48.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:02:48.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:02:48.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:02:48.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:02:21
2026-05-28T10:02:48.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68691, datetime.datetime(2026, 5, 28, 10, 2, 21), datetime.datetime(2026, 5, 28, 10, 2, 21), 'salt', 10.88, 38.32, None, 8.96, 267.85, 13.65, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:02:48.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:02:48.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:02:48.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:21, diff=27.562551s, valid=True
2026-05-28T10:02:48.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:02:48.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:02:48.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:12, diff=36.56543s, valid=True
2026-05-28T10:02:48.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:02:48.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:18, diff=30.572181s, valid=True
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:02:48.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:02:48.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:02:12, diff=36.575189s, valid=True
2026-05-28T10:02:48.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:02:48.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:02:48.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:02:48.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888010.575854s, valid=True
2026-05-28T10:02:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:02:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:02:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:02:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:02:48.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:02:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:02:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:02:48.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:02:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:02:48.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:02:48.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:02:48.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:02:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:02:48.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:02:49.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:02:49.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:02:49.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:02:49.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:02:49.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:02:49.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:02:49.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:02:49.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:03:19.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:03:19.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:03:19.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:03:20.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:03:20.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:03:20.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:03:20.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-28T10:03:20.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:03:20.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-28T10:03:20.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:03:20.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:03:20.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:03:20.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-28T10:03:23.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-28T10:03:23.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:03:23.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:03:23.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:03:23.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:03:23.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:03:23.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:03:23.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:03:23.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:03:23.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:03:23.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:03:23.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:03:23.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:03:23.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:03:23.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:03:23.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:03:23.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:03:23.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:03:23.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:03:23.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:03:23.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:03:23.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:03:23.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:03:23.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:03:23.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:03:22
2026-05-28T10:03:23.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68693, datetime.datetime(2026, 5, 28, 10, 3, 22), datetime.datetime(2026, 5, 28, 10, 3, 21), 'salt', 10.84, 40.08, None, 11.01, 286.39, 13.03, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:03:23.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:03:23.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:03:23.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:21, diff=2.589792s, valid=True
2026-05-28T10:03:23.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:03:23.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:03:23.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:12, diff=11.592635s, valid=True
2026-05-28T10:03:23.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:03:23.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:21, diff=2.599252s, valid=True
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:03:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:03:23.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:12, diff=11.602252s, valid=True
2026-05-28T10:03:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:03:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:03:23.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:03:23.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888045.602905s, valid=True
2026-05-28T10:03:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:03:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:03:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:03:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:03:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:03:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:03:23.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:03:23.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:03:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:03:23.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:03:23.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:03:23.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:03:23.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:03:23.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:03:24.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:03:24.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:03:24.596 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:03:24.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:03:24.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-28T10:03:24.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-28T10:03:24.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:03:24.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:03:54.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:03:54.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:03:54.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:03:55.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:03:55.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:03:55.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:03:55.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-28T10:03:55.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:03:55.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-28T10:03:55.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:03:55.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:03:55.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:03:55.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-28T10:03:58.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-28T10:03:58.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:03:58.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:03:58.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:03:58.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:03:58.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:03:58.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:03:58.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:03:58.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:03:58.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:03:58.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:03:58.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:03:58.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:03:58.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:03:58.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:03:58.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:03:58.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:03:58.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:03:58.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:03:58.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:03:58.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:03:58.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:03:58.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:03:58.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:03:59.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:03:52
2026-05-28T10:03:59.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68694, datetime.datetime(2026, 5, 28, 10, 3, 52), datetime.datetime(2026, 5, 28, 10, 3, 51), 'salt', 10.94, 39.51, None, 7.13, 309.37, 13.23, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:03:59.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:03:59.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:03:59.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:51, diff=8.054645s, valid=True
2026-05-28T10:03:59.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:03:59.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:03:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:12, diff=-12.942502s, valid=True
2026-05-28T10:03:59.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:03:59.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:03:42, diff=17.064194s, valid=True
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:03:59.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:03:59.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:12, diff=-12.932813s, valid=True
2026-05-28T10:03:59.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:03:59.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:03:59.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:03:59.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888081.06785s, valid=True
2026-05-28T10:03:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:03:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:03:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:03:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:03:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:03:59.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:03:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:03:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:03:59.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:03:59.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:03:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:03:59.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:03:59.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:03:59.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:03:59.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:04:00.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:04:00.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:04:00.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:04:00.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-28T10:04:00.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-28T10:04:00.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:04:00.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:04:30.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:04:30.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:04:30.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:04:30.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:04:30.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:04:30.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:04:30.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-28T10:04:30.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:04:30.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-28T10:04:30.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:04:30.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:04:31.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:04:31.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:04:33.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-28T10:04:33.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:04:33.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:04:33.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:04:33.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:04:33.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:04:33.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:04:33.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:04:33.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:04:33.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:04:33.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:04:33.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:04:33.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:04:33.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:04:33.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:04:33.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:04:33.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:04:33.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:04:33.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:04:33.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:04:33.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:04:33.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:04:33.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:04:33.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:04:33.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:04:22
2026-05-28T10:04:33.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68695, datetime.datetime(2026, 5, 28, 10, 4, 22), datetime.datetime(2026, 5, 28, 10, 4, 22), 'salt', 10.97, 39.31, None, 6.42, 293.39, 13.3, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:04:33.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:04:33.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:04:33.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:22, diff=11.797782s, valid=True
2026-05-28T10:04:33.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:04:33.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:04:33.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:12, diff=21.800644s, valid=True
2026-05-28T10:04:33.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:04:33.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:13, diff=20.807544s, valid=True
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:04:33.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:04:33.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:04:33.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:12, diff=21.810584s, valid=True
2026-05-28T10:04:33.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:04:33.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:04:33.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:04:33.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888115.811245s, valid=True
2026-05-28T10:04:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:04:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:04:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:04:33.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:04:33.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:04:33.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:04:33.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:04:33.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:04:33.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:04:33.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:04:34.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:04:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:04:34.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:04:34.134 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:04:34.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:04:34.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:04:34.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:04:34.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:04:34.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-28T10:04:34.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-28T10:04:35.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:04:35.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:05:05.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:05:05.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:05:05.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:05:05.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:05:05.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:05:05.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:05:05.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-28T10:05:05.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:05:05.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-28T10:05:05.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:05:05.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:05:05.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:05:05.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-28T10:05:08.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-28T10:05:08.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:05:08.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:05:08.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:05:08.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:05:08.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:05:08.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:05:08.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:05:08.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:05:08.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:05:08.190 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:05:08.191 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:05:08.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:05:08.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:05:08.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:05:08.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:05:08.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:05:08.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:05:08.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:05:08.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:05:08.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:05:08.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:05:08.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:05:08.441 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:05:08.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:04:52
2026-05-28T10:05:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68696, datetime.datetime(2026, 5, 28, 10, 4, 52), datetime.datetime(2026, 5, 28, 10, 4, 51), 'salt', 11.01, 35.8, None, 9.56, 288.31, 14.57, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:05:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:05:08.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:05:08.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:51, diff=17.506435s, valid=True
2026-05-28T10:05:08.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:05:08.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:05:08.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:12, diff=-3.490738s, valid=True
2026-05-28T10:05:08.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:05:08.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:04:45, diff=23.516024s, valid=True
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:05:08.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:05:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:12, diff=-3.480964s, valid=True
2026-05-28T10:05:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:05:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:05:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:05:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888150.519687s, valid=True
2026-05-28T10:05:08.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:05:08.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:05:08.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:05:08.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:05:08.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:05:08.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:05:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:05:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:05:08.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:05:08.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:05:08.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:05:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:05:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:05:08.925 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:05:09.154 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:05:09.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:05:09.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:05:09.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:05:09.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-28T10:05:09.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-28T10:05:09.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:05:09.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:05:39.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:05:39.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:05:39.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:05:40.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:05:40.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:05:40.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:05:40.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-28T10:05:40.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:05:40.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-28T10:05:40.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:05:40.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:05:40.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:05:40.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-28T10:05:43.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-28T10:05:43.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:05:43.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:05:43.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:05:43.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:05:43.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:05:43.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:05:43.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:05:43.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:05:43.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:05:43.124 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:05:43.124 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:05:43.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:05:43.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:05:43.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:05:43.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:05:43.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:05:43.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:05:43.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:05:43.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:05:43.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:05:43.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:05:43.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:05:43.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:05:43.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:05:22
2026-05-28T10:05:43.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68697, datetime.datetime(2026, 5, 28, 10, 5, 22), datetime.datetime(2026, 5, 28, 10, 5, 21), 'salt', 10.97, 34.5, None, 9.21, 294.53, 15.05, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:05:43.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:05:43.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:05:43.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:21, diff=22.453863s, valid=True
2026-05-28T10:05:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:05:43.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:05:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:12, diff=31.456787s, valid=True
2026-05-28T10:05:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:05:43.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:05:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:16, diff=27.46471s, valid=True
2026-05-28T10:05:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:05:43.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:05:43.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:05:43.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:05:43.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:05:43.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:05:43.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:12, diff=31.467923s, valid=True
2026-05-28T10:05:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:05:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:05:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:05:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888185.468639s, valid=True
2026-05-28T10:05:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:05:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:05:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:05:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:05:43.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:05:43.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:05:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:05:43.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:05:43.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:05:43.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:05:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:05:43.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:05:43.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:05:43.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:05:44.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:05:44.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:05:44.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:05:44.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:05:44.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-28T10:05:44.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-28T10:05:44.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:05:44.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:06:14.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:06:14.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:06:14.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:06:15.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:06:15.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:06:15.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:06:15.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-28T10:06:15.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:06:15.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-28T10:06:15.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:06:15.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:06:15.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:06:15.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-28T10:06:17.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-28T10:06:17.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:06:17.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:06:17.822 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:06:17.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:06:17.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:06:17.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:06:17.843 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:06:17.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:06:17.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:06:17.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:06:17.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:06:17.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:06:17.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:06:17.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:06:18.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:06:18.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:06:18.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:06:18.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:06:18.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:06:18.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:06:18.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:06:18.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:06:18.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:06:18.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:05:53
2026-05-28T10:06:18.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68698, datetime.datetime(2026, 5, 28, 10, 5, 53), datetime.datetime(2026, 5, 28, 10, 5, 52), 'salt', 11.11, 35.2, None, 9.92, 306.99, 14.81, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:06:18.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:06:18.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:06:18.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:52, diff=26.157162s, valid=True
2026-05-28T10:06:18.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:06:18.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:06:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:12, diff=6.16s, valid=True
2026-05-28T10:06:18.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:06:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:05:48, diff=30.166575s, valid=True
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:06:18.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:06:18.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:06:18.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:12, diff=6.169552s, valid=True
2026-05-28T10:06:18.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:06:18.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:06:18.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:06:18.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888220.17022s, valid=True
2026-05-28T10:06:18.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:06:18.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:06:18.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:06:18.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:06:18.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:06:18.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:06:18.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:06:18.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:06:18.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:06:18.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:06:18.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:06:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:06:18.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:06:18.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:06:18.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:06:19.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:06:19.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:06:19.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:06:19.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-28T10:06:19.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-28T10:06:19.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:06:19.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:06:49.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:06:49.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:06:49.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:06:49.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:06:49.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:06:49.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:06:49.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:06:49.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:06:49.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-28T10:06:49.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:06:49.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:06:49.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:06:49.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-28T10:06:52.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:06:52.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:06:52.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:06:52.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:06:52.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:06:52.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:06:52.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:06:52.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:06:52.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:06:52.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:06:52.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:06:52.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:06:52.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:06:52.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:06:52.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:06:52.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:06:52.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:06:52.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:06:52.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:06:52.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:06:52.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:06:52.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:06:52.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:06:52.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:06:52.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:06:23
2026-05-28T10:06:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68699, datetime.datetime(2026, 5, 28, 10, 6, 23), datetime.datetime(2026, 5, 28, 10, 6, 21), 'salt', 11.04, 36.69, None, 10.48, 296.17, 14.24, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:06:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:06:52.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:06:52.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:21, diff=31.380527s, valid=True
2026-05-28T10:06:52.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:06:52.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:06:52.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:12, diff=40.383346s, valid=True
2026-05-28T10:06:52.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:06:52.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:19, diff=33.389983s, valid=True
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:06:52.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:06:52.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:06:12, diff=40.392997s, valid=True
2026-05-28T10:06:52.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:06:52.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:06:52.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:06:52.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888254.393657s, valid=True
2026-05-28T10:06:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:06:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:06:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:06:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:06:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:06:52.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:06:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:06:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:06:52.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:06:52.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:06:52.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:06:52.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:06:52.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:06:52.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:06:52.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:06:53.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:06:53.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:06:53.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:06:53.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-28T10:06:53.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-28T10:06:53.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:06:53.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:07:23.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:07:23.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:07:23.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:07:23.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:07:23.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:07:23.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:07:23.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-28T10:07:23.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:07:23.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-28T10:07:23.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:07:23.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:07:23.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:07:23.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-28T10:07:26.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:07:26.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:07:26.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:07:26.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:07:26.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:07:26.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:07:26.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:07:26.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:07:26.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:07:26.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:07:26.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:07:26.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:07:26.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:07:26.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:07:26.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:07:26.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:07:26.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:07:26.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:07:26.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:07:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:07:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:07:26.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:07:26.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:07:26.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:07:26.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:07:23
2026-05-28T10:07:26.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68701, datetime.datetime(2026, 5, 28, 10, 7, 23), datetime.datetime(2026, 5, 28, 10, 7, 23), 'salt', 10.97, 36.06, None, 8.19, 296.5, 14.46, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:07:26.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:07:26.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:07:26.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:23, diff=3.711936s, valid=True
2026-05-28T10:07:26.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:07:26.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:07:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:12, diff=14.715005s, valid=True
2026-05-28T10:07:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:07:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:22, diff=4.722137s, valid=True
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:07:26.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:07:26.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:12, diff=14.725401s, valid=True
2026-05-28T10:07:26.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:07:26.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:07:26.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:07:26.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888288.726129s, valid=True
2026-05-28T10:07:26.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:07:26.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:07:26.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:07:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:07:26.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:07:26.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:07:26.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:07:26.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:07:26.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:07:26.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:07:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:07:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:07:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:07:27.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:07:27.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:07:27.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:07:27.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:07:27.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:07:27.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-28T10:07:27.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-28T10:07:28.009 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:07:28.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:07:58.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:07:58.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:07:58.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:07:58.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:07:58.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:07:58.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:07:58.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-28T10:07:58.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:07:58.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-28T10:07:58.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:07:58.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:07:58.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:07:58.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:08:01.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-28T10:08:01.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:08:01.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:08:01.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:08:01.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:08:01.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:08:01.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:08:01.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:08:01.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:08:01.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:08:01.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:08:01.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:08:01.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:08:01.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:08:01.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:08:01.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:08:01.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:08:01.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:08:01.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:08:01.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:08:01.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:08:01.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:08:01.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:08:01.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:08:01.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:07:56
2026-05-28T10:08:01.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68702, datetime.datetime(2026, 5, 28, 10, 7, 56), datetime.datetime(2026, 5, 28, 10, 7, 54), 'salt', 11.01, 37.92, None, 7.45, 283.09, 13.8, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:08:01.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:08:01.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:08:01.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:54, diff=7.451566s, valid=True
2026-05-28T10:08:01.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:08:01.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:08:01.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:12, diff=-10.545622s, valid=True
2026-05-28T10:08:01.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:08:01.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:07:54, diff=7.461129s, valid=True
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:08:01.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:08:01.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:12, diff=-10.535905s, valid=True
2026-05-28T10:08:01.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:08:01.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:08:01.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:08:01.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888323.464753s, valid=True
2026-05-28T10:08:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:08:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:08:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:08:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:08:01.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:08:01.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:08:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:08:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:08:01.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:08:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:08:01.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:08:01.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:08:01.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:08:01.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:08:02.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:08:02.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:08:02.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:08:02.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:08:02.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-28T10:08:02.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-28T10:08:02.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:08:02.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:08:32.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:08:32.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:08:32.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:08:33.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:08:33.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:08:33.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:08:33.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-28T10:08:33.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:08:33.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-28T10:08:33.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:08:33.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:08:33.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:08:33.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-28T10:08:35.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-28T10:08:35.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:08:35.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:08:35.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:08:35.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:08:35.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:08:35.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:08:35.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:08:35.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:08:35.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:08:35.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:08:35.936 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:08:35.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:08:36.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:08:36.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:08:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:08:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:08:36.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:08:36.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:08:36.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:08:36.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:08:36.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:08:36.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:08:36.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:08:36.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:08:26
2026-05-28T10:08:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68703, datetime.datetime(2026, 5, 28, 10, 8, 26), datetime.datetime(2026, 5, 28, 10, 8, 25), 'salt', 10.94, 37.32, None, 9.78, 298.61, 14.0, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:08:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:08:36.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:08:36.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:25, diff=11.274685s, valid=True
2026-05-28T10:08:36.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:08:36.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:08:36.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:12, diff=24.277539s, valid=True
2026-05-28T10:08:36.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:08:36.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:08:36.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:25, diff=11.288886s, valid=True
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:08:36.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:08:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:12, diff=24.294187s, valid=True
2026-05-28T10:08:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:08:36.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:08:36.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:08:36.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888358.295047s, valid=True
2026-05-28T10:08:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:08:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:08:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:08:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:08:36.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:08:36.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:08:36.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:08:36.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:08:36.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:08:36.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:08:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:08:36.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:08:36.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:08:36.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:08:36.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:08:37.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:08:37.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:08:37.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:08:37.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-28T10:08:37.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-28T10:08:37.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:08:37.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:09:07.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:09:07.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:09:07.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:09:07.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:09:07.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:09:07.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:09: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-28T10:09:07.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:09: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-28T10:09:07.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:09:07.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:09:07.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:09:07.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-28T10:09:10.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-28T10:09:10.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:09:10.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:09:10.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:09:10.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:09:10.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:09:10.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:09:10.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:09:10.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:09:10.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:09:10.210 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:09:10.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:09:10.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:09:10.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:09:10.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:09:10.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:09:10.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:09:10.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:09:10.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:09:10.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:09:10.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:09:10.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:09:10.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:09:10.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:09:10.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:08:57
2026-05-28T10:09:10.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68704, datetime.datetime(2026, 5, 28, 10, 8, 57), datetime.datetime(2026, 5, 28, 10, 8, 56), 'salt', 11.01, 37.79, None, 8.15, 332.8, 13.85, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:09:10.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:09:10.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:09:10.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:56, diff=14.524882s, valid=True
2026-05-28T10:09:10.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:09:10.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:09:10.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:12, diff=-1.472268s, valid=True
2026-05-28T10:09:10.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:09:10.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:08:55, diff=15.534369s, valid=True
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:09:10.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:09:10.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:12, diff=-1.462587s, valid=True
2026-05-28T10:09:10.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:09:10.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:09:10.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:09:10.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888392.538069s, valid=True
2026-05-28T10:09:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:09:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:09:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:09:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:09:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:09:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:09:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:09:10.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:09:10.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:09:10.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:09:10.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:09:10.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:09:10.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:09:10.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:09:11.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:09:11.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:09:11.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:09:11.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:09:11.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:09:11.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:09:11.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:09:11.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:09:41.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:09:41.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:09:41.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:09:42.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:09:42.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:09:42.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:09:42.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-28T10:09:42.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:09:42.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:09:42.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:09:42.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:09:42.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:09:42.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-28T10:09:44.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-28T10:09:44.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:09:44.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:09:44.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:09:44.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:09:44.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:09:44.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:09:44.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:09:44.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:09:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:09:44.901 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:09:44.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:09:44.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:09:44.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:09:44.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:09:45.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:09:45.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:09:45.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:09:45.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:09:45.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:09:45.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:09:45.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:09:45.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:09:45.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:09:45.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:09:27
2026-05-28T10:09:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68705, datetime.datetime(2026, 5, 28, 10, 9, 27), datetime.datetime(2026, 5, 28, 10, 9, 26), 'salt', 11.01, 33.74, None, 10.13, 304.07, 15.36, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:09:45.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:09:45.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:09:45.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:26, diff=19.213372s, valid=True
2026-05-28T10:09:45.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:09:45.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:09:45.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:12, diff=33.216249s, valid=True
2026-05-28T10:09:45.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:09:45.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:09:45.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:25, diff=20.222976s, valid=True
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:09:45.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:09:45.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:12, diff=33.226006s, valid=True
2026-05-28T10:09:45.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:09:45.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:09:45.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:09:45.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888427.226667s, valid=True
2026-05-28T10:09:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:09:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:09:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:09:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:09:45.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:09:45.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:09:45.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:09:45.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:09:45.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:09:45.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:09:45.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:09:45.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:09:45.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:09:45.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:09:45.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:09:46.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:09:46.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:09:46.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:09:46.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-28T10:09:46.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-28T10:09:46.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:09:46.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:10:16.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:10:16.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:10:16.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:10:16.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:10:16.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:10:16.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:10:16.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:10:16.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:10:16.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:10:17.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:10:17.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:10:17.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:10:17.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-28T10:10:19.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-28T10:10:19.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:10:19.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:10:19.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:10:19.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:10:19.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:10:19.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:10:19.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:10:19.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:10:19.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:10:19.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:10:19.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:10:19.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:10:19.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:10:19.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:10:19.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:10:19.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:10:19.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:10:19.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:10:19.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:10:19.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:10:19.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:10:19.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:10:19.776 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:10:19.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:09:57
2026-05-28T10:10:19.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68706, datetime.datetime(2026, 5, 28, 10, 9, 57), datetime.datetime(2026, 5, 28, 10, 9, 57), 'salt', 11.01, 34.24, None, 10.02, 301.87, 15.17, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:10:19.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:10:19.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:10:19.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:57, diff=22.842649s, valid=True
2026-05-28T10:10:19.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:10:19.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:10:19.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:12, diff=7.846563s, valid=True
2026-05-28T10:10:19.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:10:19.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:10:19.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:09:55, diff=24.85545s, valid=True
2026-05-28T10:10:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:10:19.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:10:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:10:19.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:10:19.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:10:19.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:10:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:12, diff=7.859286s, valid=True
2026-05-28T10:10:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:10:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:10:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:10:19.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888461.860103s, valid=True
2026-05-28T10:10:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:10:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:10:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:10:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:10:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:10:19.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:10:19.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:10:19.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:10:19.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:10:20.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:10:20.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:10:20.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:10:20.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:10:20.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:10:20.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:10:21.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:10:21.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:10:21.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:10:21.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-28T10:10:21.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-28T10:10:21.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:10:21.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:10:51.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:10:51.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:10:51.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:10:51.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:10:51.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:10:51.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:10:51.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-28T10:10:51.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:10:51.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-28T10:10:51.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:10:51.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:10:51.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:10:51.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-28T10:10:54.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-28T10:10:54.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:10:54.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:10:54.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:10:54.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:10:54.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:10:54.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:10:54.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:10:54.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:10:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:10:54.551 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:10:54.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:10:54.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:10:54.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:10:54.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:10:54.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:10:54.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:10:54.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:10:54.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:10:54.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:10:54.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:10:54.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:10:54.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:10:54.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:10:54.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:10:27
2026-05-28T10:10:54.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68707, datetime.datetime(2026, 5, 28, 10, 10, 27), datetime.datetime(2026, 5, 28, 10, 10, 27), 'salt', 11.01, 37.92, None, 9.0, 286.0, 13.8, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:10:54.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:10:54.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:10:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:27, diff=27.855268s, valid=True
2026-05-28T10:10:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:10:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:10:54.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:12, diff=42.85793s, valid=True
2026-05-28T10:10:54.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:10:54.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:25, diff=29.864255s, valid=True
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:10:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:10:54.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:10:12, diff=42.867189s, valid=True
2026-05-28T10:10:54.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:10:54.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:10:54.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:10:54.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888496.867826s, valid=True
2026-05-28T10:10:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:10:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:10:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:10:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:10:54.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:10:54.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:10:54.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:10:54.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:10:54.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:10:54.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:10:55.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:10:55.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:10:55.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:10:55.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:10:55.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:10:55.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:10:55.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:10:55.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:10:55.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-28T10:10:55.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-28T10:10:56.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:10:56.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:11:26.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:11:26.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:11:26.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:11:26.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:11:26.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:11:26.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:11:26.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-28T10:11:26.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:11:26.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-28T10:11:27.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:11:27.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:11:27.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:11:27.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-28T10:11:29.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-28T10:11:29.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:11:29.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:11:29.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:11:29.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:11:30.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:11:30.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:11:30.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:11:30.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:11:30.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:11:30.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:11:30.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:11:30.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:11:30.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:11:30.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:11:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:11:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:11:30.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:11:30.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:11:30.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:11:30.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:11:30.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:11:30.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:11:30.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:11:30.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:11:28
2026-05-28T10:11:30.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68709, datetime.datetime(2026, 5, 28, 10, 11, 28), datetime.datetime(2026, 5, 28, 10, 11, 27), 'salt', 11.04, 32.48, None, 8.58, 290.67, 15.87, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:11:30.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:11:30.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:11:30.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:27, diff=3.347548s, valid=True
2026-05-28T10:11:30.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:11:30.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:11:30.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:12, diff=18.350578s, valid=True
2026-05-28T10:11:30.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:11:30.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:11:30.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:26, diff=4.357586s, valid=True
2026-05-28T10:11:30.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:11:30.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:11:30.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:11:30.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:11:30.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:11:30.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:11:30.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:12, diff=18.360866s, valid=True
2026-05-28T10:11:30.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:11:30.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:11:30.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:11:30.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888532.361554s, valid=True
2026-05-28T10:11:30.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:11:30.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:11:30.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:11:30.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:11:30.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:11:30.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:11:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:11:30.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:11:30.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:11:30.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:11:30.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:11:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:11:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:11:30.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:11:30.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:11:31.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:11:31.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:11:31.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:11:31.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-28T10:11:31.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-28T10:11:31.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:11:31.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:12:01.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:12:01.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:12:01.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:12:01.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:12:01.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:12:02.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:12:02.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-28T10:12:02.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:12:02.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-28T10:12:02.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:12:02.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:12:02.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:12:02.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-28T10:12:04.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-28T10:12:04.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:12:04.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:12:04.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:12:04.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:12:04.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:12:04.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:12:04.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:12:04.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:12:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:12:04.559 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:12:04.559 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:12:04.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:12:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:12:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:12:04.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:12:04.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:12:04.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:12:04.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:12:04.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:12:04.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:12:04.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:12:04.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:12:04.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:12:04.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:11:58
2026-05-28T10:12:04.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68710, datetime.datetime(2026, 5, 28, 10, 11, 58), datetime.datetime(2026, 5, 28, 10, 11, 58), 'salt', 10.97, 31.05, None, 8.4, 303.25, 16.45, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:12:04.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:12:04.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:12:04.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:58, diff=6.877645s, valid=True
2026-05-28T10:12:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:12:04.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:12:04.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:12, diff=-7.119457s, valid=True
2026-05-28T10:12:04.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:12:04.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:11:56, diff=8.887327s, valid=True
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:12:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:12:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:12, diff=-7.109537s, valid=True
2026-05-28T10:12:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:12:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:12:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:12:04.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888566.89114s, valid=True
2026-05-28T10:12:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:12:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:12:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:12:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:12:04.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:12:04.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:12:04.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:12:04.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:12:04.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:12:05.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:12:05.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:12:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:12:05.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:12:05.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:12:05.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:12:05.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:12:05.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:12:05.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:12:05.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-28T10:12:05.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-28T10:12:06.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:12:06.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:12:36.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:12:36.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:12:36.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:12:36.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:12:37.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:12:38.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:12:38.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-28T10:12:38.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:12:38.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-28T10:12:38.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:12:38.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:12:39.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:12:39.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-28T10:12:41.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-28T10:12:41.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:12:41.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:12:41.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:12:41.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:12:41.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:12:41.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:12:41.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:12:41.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:12:41.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:12:41.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:12:41.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:12:41.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:12:41.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:12:41.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:12:41.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:12:41.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:12:41.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:12:41.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:12:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:12:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:12:41.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:12:41.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:12:41.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:12:41.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:12:28
2026-05-28T10:12:41.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68711, datetime.datetime(2026, 5, 28, 10, 12, 28), datetime.datetime(2026, 5, 28, 10, 12, 28), 'salt', 11.17, 32.77, None, 10.23, 299.82, 15.76, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:12:41.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:12:41.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:12:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:28, diff=13.932181s, valid=True
2026-05-28T10:12:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:12:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:12:41.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:12, diff=29.935151s, valid=True
2026-05-28T10:12:41.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:12:41.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:12:41.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:26, diff=15.941758s, valid=True
2026-05-28T10:12:41.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:12:41.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:12:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:12:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:12:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:12:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:12:41.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:12, diff=29.944877s, valid=True
2026-05-28T10:12:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:12:41.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:12:41.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:12:41.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888603.945563s, valid=True
2026-05-28T10:12:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:12:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:12:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:12:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:12:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:12:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:12:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:12:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:12:42.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:12:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:12:42.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:12:42.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:12:42.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:12:42.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:12:42.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:12:42.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:12:42.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:12:42.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:12:42.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-28T10:12:42.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-28T10:12:43.276 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:12:43.276 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:13:13.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:13:13.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:13:13.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:13:13.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:13:13.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:13:13.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:13:13.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:13:13.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:13:13.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-28T10:13:13.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:13:13.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:13:13.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:13:13.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-28T10:13:16.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-28T10:13:16.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:13:16.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:13:16.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:13:16.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:13:16.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:13:16.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:13:16.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:13:16.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:13:16.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:13:16.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:13:16.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:13:16.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:13:17.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:13:17.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:13:17.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:13:17.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:13:17.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:13:17.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:13:17.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:13:17.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:13:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:13:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:13:17.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:13:17.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:12:58
2026-05-28T10:13:17.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68712, datetime.datetime(2026, 5, 28, 10, 12, 58), datetime.datetime(2026, 5, 28, 10, 12, 58), 'salt', 11.24, 34.8, None, 7.98, 300.59, 14.98, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:13:17.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:13:17.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:13:17.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:58, diff=19.257602s, valid=True
2026-05-28T10:13:17.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:13:17.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:13:17.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:12, diff=5.260663s, valid=True
2026-05-28T10:13:17.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:13:17.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:12:58, diff=19.267491s, valid=True
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:13:17.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:13:17.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:13:17.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:12, diff=5.270735s, valid=True
2026-05-28T10:13:17.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:13:17.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:13:17.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:13:17.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888639.271471s, valid=True
2026-05-28T10:13:17.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:13:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:13:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:13:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:13:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:13:17.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:13:17.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:13:17.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:13:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:13:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:13:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:13:17.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:13:17.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:13:17.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:13:17.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:13:18.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:13:18.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:13:18.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:13:18.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-28T10:13:18.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-28T10:13:18.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:13:18.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:13:48.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:13:48.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:13:48.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:13:48.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:13:48.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:13:49.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:13:49.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-28T10:13:49.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:13:49.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:13:49.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:13:49.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:13:49.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:13:49.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-28T10:13:51.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-28T10:13:51.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:13:51.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:13:51.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:13:51.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:13:51.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:13:51.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:13:51.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:13:51.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:13:51.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:13:51.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:13:51.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:13:51.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:13:51.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:13:51.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:13:51.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:13:51.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:13:51.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:13:51.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:13:51.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:13:51.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:13:51.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:13:51.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:13:51.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:13:52.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:13:29
2026-05-28T10:13:52.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68713, datetime.datetime(2026, 5, 28, 10, 13, 29), datetime.datetime(2026, 5, 28, 10, 13, 28), 'salt', 11.24, 34.13, None, 8.36, 285.45, 15.23, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:13:52.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:13:52.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:13:52.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:28, diff=24.026174s, valid=True
2026-05-28T10:13:52.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:13:52.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:13:52.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:12, diff=40.029132s, valid=True
2026-05-28T10:13:52.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:13:52.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:13:52.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:27, diff=25.035873s, valid=True
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:13:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:13:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:12, diff=40.039033s, valid=True
2026-05-28T10:13:52.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:13:52.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:13:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:13:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888674.039704s, valid=True
2026-05-28T10:13:52.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:13:52.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:13:52.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:13:52.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:13:52.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:13:52.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:13:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:13:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:13:52.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:13:52.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:13:52.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:13:52.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:13:52.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:13:52.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:13:52.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:13:52.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:13:53.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:13:53.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:13:53.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-28T10:13:53.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-28T10:13:53.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:13:53.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:14:23.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:14:23.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:14: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-28T10:14:23.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:14:23.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:14:23.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:14:23.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-28T10:14:23.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:14:23.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-28T10:14:23.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:14:23.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:14:23.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:14:23.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-28T10:14:26.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-28T10:14:26.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:14:26.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:14:26.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:14:26.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:14:26.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:14:26.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:14:26.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:14:26.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:14:26.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:14:26.271 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:14:26.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:14:26.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:14:26.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:14:26.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:14:26.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:14:26.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:14:26.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:14:26.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:14:26.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:14:26.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:14:26.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:14:26.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:14:26.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:14:26.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:13:59
2026-05-28T10:14:26.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68714, datetime.datetime(2026, 5, 28, 10, 13, 59), datetime.datetime(2026, 5, 28, 10, 13, 58), 'salt', 11.14, 29.46, None, 7.59, 283.39, 17.17, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:14:26.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:14:26.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:14:26.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:58, diff=28.58471s, valid=True
2026-05-28T10:14:26.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:14:26.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:14:26.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:14:12, diff=14.587684s, valid=True
2026-05-28T10:14:26.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:14:26.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:13:57, diff=29.594503s, valid=True
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:14:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:14:26.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:14:26.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:14:12, diff=14.597684s, valid=True
2026-05-28T10:14:26.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:14:26.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:14:26.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:14:26.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888708.598338s, valid=True
2026-05-28T10:14:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:14:26.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:14:26.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:14:26.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:14:26.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:14:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:14:26.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:14:26.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:14:26.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:14:26.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:14:26.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:14:26.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:14:26.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:14:26.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:14:27.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:14:27.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:14:27.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:14:27.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:14:27.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-28T10:14:27.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-28T10:14:27.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:14:27.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:14:57.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:14:57.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:14:57.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:14:58.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:14:59.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:15:00.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:15:00.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-28T10:15:00.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:15:00.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-28T10:15:00.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:15:00.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:15:00.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:15:00.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-28T10:15:03.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-28T10:15:03.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:15:03.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:15:03.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:15:03.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:15:03.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:15:03.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:15:03.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:15:03.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:15:03.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:15:03.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:15:03.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:15:03.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:15:03.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:15:03.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:15:03.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:15:03.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:15:03.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:15:03.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:15:03.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:15:03.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:15:03.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:15:03.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:15:03.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:15:03.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:14:59
2026-05-28T10:15:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68716, datetime.datetime(2026, 5, 28, 10, 14, 59), datetime.datetime(2026, 5, 28, 10, 14, 59), 'salt', 11.14, 32.01, None, 9.56, 287.31, 16.07, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:15:03.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:15:03.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:15:03.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:14:59, diff=4.870409s, valid=True
2026-05-28T10:15:03.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:15:03.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:15:03.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:12, diff=-8.126365s, valid=True
2026-05-28T10:15:03.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:15:03.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:15:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:14:58, diff=5.880665s, valid=True
2026-05-28T10:15:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:15:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:15:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:15:03.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:15:03.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:15:03.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:15:03.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:12, diff=-8.116238s, valid=True
2026-05-28T10:15:03.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:15:03.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:15:03.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:15:03.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888745.888659s, valid=True
2026-05-28T10:15:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:15:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:15:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:15:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:15:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:15:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:15:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:15:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:15:03.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:15:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:15:04.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:15:04.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:15:04.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:15:04.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:15:04.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:15:04.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:15:04.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:15:04.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:15:04.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-28T10:15:04.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-28T10:15:05.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:15:05.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:15:35.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:15:35.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:15:35.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:15:35.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:15:35.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:15:36.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:15:36.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-28T10:15:36.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:15:36.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-28T10:15:36.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:15:36.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:15:36.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:15:36.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-28T10:15:38.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-28T10:15:38.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:15:38.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:15:38.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:15:38.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:15:38.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:15:38.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:15:38.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:15:38.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:15:38.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:15:38.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:15:38.782 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:15:38.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:15:38.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:15:38.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:15:38.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:15:38.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:15:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:15:38.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:15:39.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:15:39.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:15:39.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:15:39.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:15:39.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:15:39.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:15:29
2026-05-28T10:15:39.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68717, datetime.datetime(2026, 5, 28, 10, 15, 29), datetime.datetime(2026, 5, 28, 10, 15, 29), 'salt', 11.1, 30.42, None, 7.77, 304.28, 16.74, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:15:39.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:15:39.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:15:39.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:29, diff=10.099187s, valid=True
2026-05-28T10:15:39.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:15:39.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:15:39.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:12, diff=27.102082s, valid=True
2026-05-28T10:15:39.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:15:39.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:28, diff=11.108813s, valid=True
2026-05-28T10:15:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:15:39.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:15:39.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:15:39.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:15:39.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:15:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:12, diff=27.11192s, valid=True
2026-05-28T10:15:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:15:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:15:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:15:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888781.112581s, valid=True
2026-05-28T10:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:15:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:15:39.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:15:39.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:15:39.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:15:39.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:15:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:15:39.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:15:39.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:15:39.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:15:39.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:15:40.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:15:40.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:15:40.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:15:40.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-28T10:15:40.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-28T10:15:40.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:15:40.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:16:10.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:16:10.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:16:10.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:16:10.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:16:10.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:16:11.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:16:11.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-28T10:16:11.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:16:11.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-28T10:16:11.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:16:11.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:16:11.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:16:11.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-28T10:16:13.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:16:13.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:16:13.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:16:13.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:16:13.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:16:13.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:16:13.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:16:13.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:16:13.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:16:13.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:16:13.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:16:13.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:16:13.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:16:13.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:16:13.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:16:13.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:16:13.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:16:13.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:16:13.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:16:13.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:16:13.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:16:13.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:16:13.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:16:13.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:16:13.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:16:00
2026-05-28T10:16:13.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68718, datetime.datetime(2026, 5, 28, 10, 16), datetime.datetime(2026, 5, 28, 10, 15, 59), 'salt', 11.14, 30.42, None, 6.67, 298.9, 16.75, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:16:13.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:16:13.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:16:13.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:59, diff=14.745059s, valid=True
2026-05-28T10:16:13.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:16:13.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:16:13.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:12, diff=1.747975s, valid=True
2026-05-28T10:16:13.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:16:13.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:16:13.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:15:58, diff=15.754803s, valid=True
2026-05-28T10:16:13.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:16:13.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:16:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:16:13.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:16:13.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:16:13.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:16:13.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:12, diff=1.757892s, valid=True
2026-05-28T10:16:13.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:16:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:16:13.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:16:13.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888815.758557s, valid=True
2026-05-28T10:16:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:16:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:16:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:16:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:16:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:16:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:16:13.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:16:13.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:16:13.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:16:13.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:16:13.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:16:13.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:16:14.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:16:14.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:16:14.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:16:14.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:16:14.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:16:14.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:16:14.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-28T10:16:14.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-28T10:16:14.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:16:14.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:16:44.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:16:44.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:16:44.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:16:45.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:16:45.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:16:45.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:16: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-28T10:16:45.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:16:45.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:16:45.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:16:45.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:16:45.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:16:45.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-28T10:16:48.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:16:48.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:16:48.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:16:48.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:16:48.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:16:48.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:16:48.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:16:48.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:16:48.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:16:48.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:16:48.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:16:48.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:16:48.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:16:48.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:16:48.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:16:48.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:16:48.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:16:48.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:16:48.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:16:48.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:16:48.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:16:48.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:16:48.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:16:48.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:16:48.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:16:30
2026-05-28T10:16:48.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68719, datetime.datetime(2026, 5, 28, 10, 16, 30), datetime.datetime(2026, 5, 28, 10, 16, 30), 'salt', 11.14, 29.85, None, 6.57, 300.56, 16.99, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:16:48.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:16:48.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:16:48.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:30, diff=18.519157s, valid=True
2026-05-28T10:16:48.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:16:48.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:16:48.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:12, diff=36.522002s, valid=True
2026-05-28T10:16:48.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:16:48.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:16:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:29, diff=19.528584s, valid=True
2026-05-28T10:16:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:16:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:16:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:16:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:16:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:16:48.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:16:48.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:12, diff=36.531593s, valid=True
2026-05-28T10:16:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:16:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:16:48.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:16:48.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888850.532259s, valid=True
2026-05-28T10:16:48.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:16:48.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:16:48.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:16:48.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:16:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:16:48.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:16:48.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:16:48.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:16:48.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:16:48.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:16:48.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:16:48.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:16:48.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:16:48.849 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:16:49.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:16:49.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:16:49.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:16:49.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:16:49.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-28T10:16:49.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-28T10:16:49.678 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:16:49.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:17:19.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:17:19.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:17:19.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:17:20.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:17:20.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:17:20.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:17:20.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-28T10:17:20.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:17:20.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-28T10:17:20.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:17:20.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:17:20.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:17:20.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-28T10:17:23.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-28T10:17:23.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:17:23.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:17:23.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:17:23.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:17:23.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:17:23.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:17:23.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:17:23.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:17:23.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:17:23.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:17:23.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:17:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:17:23.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:17:23.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:17:23.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:17:23.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:17:23.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:17:23.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:17:23.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:17:23.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:17:23.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:17:23.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:17:23.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:17:23.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:17:00
2026-05-28T10:17:23.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68720, datetime.datetime(2026, 5, 28, 10, 17), datetime.datetime(2026, 5, 28, 10, 17), 'salt', 11.1, 29.59, None, 6.92, 346.7, 17.1, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:17:23.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:17:23.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:17:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:00, diff=23.60169s, valid=True
2026-05-28T10:17:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:17:23.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:17:23.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:12, diff=11.604546s, valid=True
2026-05-28T10:17:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:17:23.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:16:59, diff=24.611382s, valid=True
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:17:23.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:17:23.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:12, diff=11.614418s, valid=True
2026-05-28T10:17:23.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:17:23.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:17:23.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:17:23.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888885.615123s, valid=True
2026-05-28T10:17:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:17:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:17:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:17:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:17:23.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:17:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:17:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:17:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:17:23.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:17:23.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:17:23.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:17:23.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:17:23.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:17:23.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:17:24.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:17:24.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:17:24.583 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:17:24.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:17:24.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-28T10:17:24.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-28T10:17:24.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:17:24.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:17:54.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:17:54.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:17: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-28T10:17:55.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:17:55.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:17:55.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:17:55.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-28T10:17:55.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:17:55.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-28T10:17:55.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:17:55.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:17:55.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:17:55.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:17:57.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-28T10:17:57.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:17:57.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:17:57.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:17:57.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:17:57.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:17:57.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:17:57.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:17:57.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:17:57.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:17:57.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:17:57.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:17:57.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:17:58.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:17:58.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:17:58.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:17:58.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:17:58.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:17:58.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:17:58.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:17:58.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:17:58.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:17:58.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:17:58.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:17:58.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:17:30
2026-05-28T10:17:58.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68721, datetime.datetime(2026, 5, 28, 10, 17, 30), datetime.datetime(2026, 5, 28, 10, 17, 30), 'salt', 11.3, 32.31, None, 6.74, 319.45, 15.97, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:17:58.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:17:58.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:17:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:30, diff=28.29804s, valid=True
2026-05-28T10:17:58.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:17:58.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:17:58.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:12, diff=46.300856s, valid=True
2026-05-28T10:17:58.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:17:58.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:30, diff=28.307411s, valid=True
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:17:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:17:58.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:17:12, diff=46.310396s, valid=True
2026-05-28T10:17:58.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:17:58.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:17:58.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:17:58.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888920.311047s, valid=True
2026-05-28T10:17:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:17:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:17:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:17:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:17:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:17:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:17:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:17:58.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:17:58.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:17:58.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:17:58.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:17:58.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:17:58.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:17:58.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:17:58.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:17:59.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:17:59.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:17:59.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:17:59.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-28T10:17:59.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-28T10:17:59.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:17:59.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:18:29.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:18:29.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:18:29.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:18:29.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:18:29.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:18:30.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:18:30.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-28T10:18:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:18:30.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-28T10:18:30.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:18:30.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:18:30.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:18:30.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-28T10:18:32.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:18:32.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:18:32.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:18:32.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:18:32.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:18:32.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:18:32.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:18:32.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:18:32.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:18:32.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:18:32.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:18:32.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:18:32.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:18:32.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:18:32.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:18:32.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:18:32.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:18:32.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:18:32.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:18:32.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:18:32.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:18:32.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:18:32.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:18:32.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:18:32.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:18:31
2026-05-28T10:18:32.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68723, datetime.datetime(2026, 5, 28, 10, 18, 31), datetime.datetime(2026, 5, 28, 10, 18, 30), 'salt', 11.3, 32.44, None, 6.99, 320.01, 15.91, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:18:32.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:18:32.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:18:32.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:18:30, diff=2.730086s, valid=True
2026-05-28T10:18:32.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:18:32.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:18:32.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:18:12, diff=20.732904s, valid=True
2026-05-28T10:18:32.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:18:32.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:18:32.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:18:30, diff=2.739627s, valid=True
2026-05-28T10:18:32.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:18:32.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:18:32.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:18:32.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:18:32.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:18:32.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:18:32.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:18:12, diff=20.742654s, valid=True
2026-05-28T10:18:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:18:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:18:32.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:18:32.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888954.743304s, valid=True
2026-05-28T10:18:32.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:18:32.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:18:32.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:18:32.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:18:32.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:18:32.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:18:32.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:18:32.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:18:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:18:32.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:18:32.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:18:32.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:18:33.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:18:33.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:18:33.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:18:33.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:18:33.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:18:33.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:18:33.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-28T10:18:33.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-28T10:18:33.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:18:33.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:19:03.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:19:03.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:19:03.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:19:04.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:19:04.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:19:04.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:19:04.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-28T10:19:04.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:19:04.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-28T10:19:04.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:19:04.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:19:04.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:19:04.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-28T10:19:06.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-28T10:19:06.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:19:06.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:19:06.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:19:06.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:19:06.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:19:06.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:19:06.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:19:06.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:19:06.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:19:06.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:19:06.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:19:06.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:19:07.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:19:07.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:19:07.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:19:07.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:19:07.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:19:07.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:19:07.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:19:07.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:19:07.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:19:07.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:19:07.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:19:07.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:19:01
2026-05-28T10:19:07.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68724, datetime.datetime(2026, 5, 28, 10, 19, 1), datetime.datetime(2026, 5, 28, 10, 19, 1), 'salt', 11.17, 32.14, None, 5.47, 319.64, 16.02, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:19:07.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:19:07.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:19:07.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:01, diff=6.328119s, valid=True
2026-05-28T10:19:07.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:19:07.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:19:07.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:12, diff=-4.669041s, valid=True
2026-05-28T10:19:07.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:19:07.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:19:07.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:00, diff=7.337713s, valid=True
2026-05-28T10:19:07.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:19:07.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:19:07.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:19:07.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:19:07.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:19:07.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:19:07.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:12, diff=-4.659291s, valid=True
2026-05-28T10:19:07.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:19:07.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:19:07.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:19:07.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=888989.341354s, valid=True
2026-05-28T10:19:07.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:19:07.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:19:07.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:19:07.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:19:07.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:19:07.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:19:07.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:19:07.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:19:07.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:19:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:19:07.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:19:07.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:19:07.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:19:07.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:19:07.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:19:08.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:19:08.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:19:08.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:19:08.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-28T10:19:08.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-28T10:19:08.557 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:19:08.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:19:38.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:19:38.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:19:38.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:19:39.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:19:39.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:19:39.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:19:39.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-28T10:19:39.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:19:39.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-28T10:19:39.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:19:39.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:19:39.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:19:39.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-28T10:19:42.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-28T10:19:42.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:19:42.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:19:42.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:19:42.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:19:42.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:19:42.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:19:42.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:19:42.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:19:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:19:42.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:19:42.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:19:42.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:19:42.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:19:42.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:19:42.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:19:42.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:19:42.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:19:42.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:19:42.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:19:42.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:19:42.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:19:42.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:19:42.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:19:42.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:19:31
2026-05-28T10:19:42.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68725, datetime.datetime(2026, 5, 28, 10, 19, 31), datetime.datetime(2026, 5, 28, 10, 19, 31), 'salt', 11.3, 34.66, None, 8.08, 321.75, 15.03, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:19:42.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:19:42.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:19:42.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:31, diff=11.555491s, valid=True
2026-05-28T10:19:42.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:19:42.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:19:42.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:12, diff=30.55835s, valid=True
2026-05-28T10:19:42.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:19:42.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:19:42.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:30, diff=12.564902s, valid=True
2026-05-28T10:19:42.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:19:42.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:19:42.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:19:42.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:19:42.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:19:42.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:19:42.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:19:12, diff=30.567931s, valid=True
2026-05-28T10:19:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:19:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:19:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:19:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889024.568581s, valid=True
2026-05-28T10:19:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:19:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:19:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:19:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:19:42.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:19:42.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:19:42.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:19:42.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:19:42.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:19:42.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:19:42.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:19:42.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:19:42.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:19:42.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:19:43.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:19:43.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:19:43.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:19:43.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:19:43.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-28T10:19:43.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-28T10:19:43.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:19:43.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:20:13.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:20:13.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:20:13.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:20:13.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:20:13.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:20:14.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:20:14.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-28T10:20:14.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:20:14.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:20:14.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:20:14.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:20:14.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:20:14.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-28T10:20:16.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-28T10:20:16.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:20:16.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:20:16.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:20:16.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:20:16.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:20:16.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:20:16.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:20:16.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:20:16.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:20:16.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:20:16.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:20:17.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:20:17.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:20:17.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:20:17.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:20:17.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:20:17.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:20:17.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:20:17.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:20:17.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:20:17.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:20:17.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:20:17.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:20:17.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:20:02
2026-05-28T10:20:17.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68726, datetime.datetime(2026, 5, 28, 10, 20, 2), datetime.datetime(2026, 5, 28, 10, 20, 1), 'salt', 11.24, 34.43, None, 7.84, 308.82, 15.12, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:20:17.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:20:17.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:20:17.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:01, diff=16.350753s, valid=True
2026-05-28T10:20:17.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:20:17.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:20:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:12, diff=5.353539s, valid=True
2026-05-28T10:20:17.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:20:17.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:20:17.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:00, diff=17.360783s, valid=True
2026-05-28T10:20:17.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:20:17.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:20:17.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:20:17.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:20:17.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:20:17.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:20:17.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:12, diff=5.365611s, valid=True
2026-05-28T10:20:17.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:20:17.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:20:17.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:20:17.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889059.366688s, valid=True
2026-05-28T10:20:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:20:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:20:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:20:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:20:17.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:20:17.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:20:17.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:20:17.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:20:17.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:20:17.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:20:17.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:20:17.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:20:17.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:20:17.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:20:17.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:20:18.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:20:18.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:20:18.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:20:18.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-28T10:20:18.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-28T10:20:18.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:20:18.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:20:48.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:20:48.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:20:48.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:20:49.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:20:49.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:20:49.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:20:49.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:20:49.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:20:49.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-28T10:20:49.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:20:49.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:20:49.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:20:49.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:20:51.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-28T10:20:51.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:20:51.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:20:51.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:20:51.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:20:51.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:20:51.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:20:51.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:20:51.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:20:51.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:20:51.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:20:51.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:20:51.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:20:51.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:20:51.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:20:51.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:20:51.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:20:51.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:20:51.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:20:51.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:20:51.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:20:51.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:20:51.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:20:51.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:20:52.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:20:32
2026-05-28T10:20:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68727, datetime.datetime(2026, 5, 28, 10, 20, 32), datetime.datetime(2026, 5, 28, 10, 20, 31), 'salt', 11.14, 31.28, None, 8.72, 318.3, 16.38, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:20:52.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:20:52.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:20:52.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:31, diff=21.059929s, valid=True
2026-05-28T10:20:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:20:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:20:52.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:12, diff=40.062774s, valid=True
2026-05-28T10:20:52.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:20:52.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:31, diff=21.069314s, valid=True
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:20:52.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:20:52.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:20:12, diff=40.072324s, valid=True
2026-05-28T10:20:52.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:20:52.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:20:52.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:20:52.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889094.072981s, valid=True
2026-05-28T10:20:52.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:20:52.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:20:52.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:20:52.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:20:52.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:20:52.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:20:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:20:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:20:52.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:20:52.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:20:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:20:52.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:20:52.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:20:52.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:20:52.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:20:53.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:20:53.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:20:53.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:20:53.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-28T10:20:53.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-28T10:20:55.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:20:55.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:21:25.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:21:25.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:21:25.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:21:25.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:21:25.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:21:25.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:21:25.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-28T10:21:25.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:21:25.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-28T10:21:25.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:21:25.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:21:25.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:21:25.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-28T10:21:29.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-28T10:21:29.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:21:29.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:21:29.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:21:29.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:21:29.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:21:29.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:21:29.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:21:29.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:21:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:21:29.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:21:29.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:21:29.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:21:29.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:21:29.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:21:29.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:21:29.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:21:29.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:21:29.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:21:29.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:21:29.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:21:29.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:21:29.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:21:29.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:21:29.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:21:02
2026-05-28T10:21:29.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68728, datetime.datetime(2026, 5, 28, 10, 21, 2), datetime.datetime(2026, 5, 28, 10, 21, 2), 'salt', 11.07, 28.66, None, 8.44, 305.67, 17.52, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:21:29.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:21:29.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:21:29.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:02, diff=27.405708s, valid=True
2026-05-28T10:21:29.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:21:29.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:21:29.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=17.40867s, valid=True
2026-05-28T10:21:29.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:21:29.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:01, diff=28.415293s, valid=True
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:21:29.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:21:29.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=17.418391s, valid=True
2026-05-28T10:21:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:21:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:21:29.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:21:29.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889131.419114s, valid=True
2026-05-28T10:21:29.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:21:29.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:21:29.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:21:29.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:21:29.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:21:29.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:21:29.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:21:29.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:21:29.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:21:29.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:21:29.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:21:29.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:21:29.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:21:29.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:21:30.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:21:30.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:21:30.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:21:30.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:21:30.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-28T10:21:30.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-28T10:21:30.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:21:30.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:22:00.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:22:00.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:22:00.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:22:01.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:22:01.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:22:01.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:22:01.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-28T10:22:01.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:22:01.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-28T10:22:01.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:22:01.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:22:01.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:22:01.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-28T10:22:03.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:22:03.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:22:03.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:22:03.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:22:03.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:22:03.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:22:03.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:22:03.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:22:03.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:22:03.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:22:03.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:22:03.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:22:03.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:22:03.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:22:03.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:22:03.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:22:03.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:22:03.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:22:03.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:22:03.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:22:03.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:22:04.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:22:04.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:22:04.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:22:04.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:22:02
2026-05-28T10:22:04.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68730, datetime.datetime(2026, 5, 28, 10, 22, 2), datetime.datetime(2026, 5, 28, 10, 22, 2), 'salt', 11.3, 31.98, None, 6.67, 296.35, 16.1, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:22:04.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:22:04.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:22:04.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:22:02, diff=2.064528s, valid=True
2026-05-28T10:22:04.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:22:04.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:22:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=52.06746s, valid=True
2026-05-28T10:22:04.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:22:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:22:01, diff=3.074184s, valid=True
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:22:04.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:22:04.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=52.07731s, valid=True
2026-05-28T10:22:04.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:22:04.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:22:04.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:22:04.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889166.077992s, valid=True
2026-05-28T10:22:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:22:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:22:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:22:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:22:04.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:22:04.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:22:04.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:22:04.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:22:04.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:22:04.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:22:04.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:22:04.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:22:04.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:22:04.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:22:04.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:22:05.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:22:05.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:22:05.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:22:05.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-28T10:22:05.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-28T10:22:05.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:22:05.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:22:35.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:22:35.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:22:35.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:22:35.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:22:35.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:22:35.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:22:35.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:22:35.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:22:35.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-28T10:22:35.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:22:35.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:22:35.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:22:35.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-28T10:22:38.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-28T10:22:38.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:22:38.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:22:38.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:22:38.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:22:38.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:22:38.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:22:38.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:22:38.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:22:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:22:38.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:22:38.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:22:38.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:22:38.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:22:38.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:22:38.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:22:38.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:22:38.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:22:38.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:22:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:22:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:22:38.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:22:38.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:22:38.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:22:38.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:22:33
2026-05-28T10:22:38.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68731, datetime.datetime(2026, 5, 28, 10, 22, 33), datetime.datetime(2026, 5, 28, 10, 22, 32), 'salt', 11.43, 31.45, None, 10.16, 288.51, 16.34, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:22:38.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:22:38.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:22:38.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:22:32, diff=6.551233s, valid=True
2026-05-28T10:22:38.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:22:38.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:22:38.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=86.554185s, valid=True
2026-05-28T10:22:38.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:22:38.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:22:32, diff=6.561008s, valid=True
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:22:38.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:22:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=86.564073s, valid=True
2026-05-28T10:22:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:22:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:22:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:22:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889200.564743s, valid=True
2026-05-28T10:22:38.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:22:38.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:22:38.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:22:38.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:22:38.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:22:38.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:22:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:22:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:22:38.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:22:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:22:38.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:22:38.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:22:38.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:22:38.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:22:39.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:22:39.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:22:39.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:22:39.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:22:39.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:22:39.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:22:39.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:22:39.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:23:09.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:23:09.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:23:09.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:23:10.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:23:10.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:23:10.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:23:10.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-28T10:23:10.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:23:10.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-28T10:23:10.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:23:10.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:23:10.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:23:10.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-28T10:23:13.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-28T10:23:13.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:23:13.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:23:13.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:23:13.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:23:13.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:23:13.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:23:13.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:23:13.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:23:13.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:23:13.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:23:13.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:23:13.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:23:13.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:23:13.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:23:13.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:23:13.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:23:13.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:23:13.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:23:13.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:23:13.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:23:13.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:23:13.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:23:13.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:23:13.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:23:03
2026-05-28T10:23:13.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68732, datetime.datetime(2026, 5, 28, 10, 23, 3), datetime.datetime(2026, 5, 28, 10, 23, 2), 'salt', 11.33, 30.95, None, 8.61, 307.87, 16.54, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:23:13.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:23:13.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:23:13.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:23:02, diff=11.422965s, valid=True
2026-05-28T10:23:13.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:23:13.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:23:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=121.425757s, valid=True
2026-05-28T10:23:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:23:13.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:23:02, diff=11.432333s, valid=True
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:23:13.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:23:13.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=121.435281s, valid=True
2026-05-28T10:23:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:23:13.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:23:13.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:23:13.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889235.435936s, valid=True
2026-05-28T10:23:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:23:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:23:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:23:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:23:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:23:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:23:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:23:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:23:13.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:23:13.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:23:13.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:23:13.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:23:13.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:23:13.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:23:13.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:23:14.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:23:14.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:23:14.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:23:14.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-28T10:23:14.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-28T10:23:14.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:23:14.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:23:44.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:23:44.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:23:44.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:23:44.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:23:44.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:23:44.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:23:44.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-28T10:23:44.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:23:44.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-28T10:23:44.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:23:44.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:23:44.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:23:44.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-28T10:23:47.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-28T10:23:47.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:23:47.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:23:47.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:23:47.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:23:47.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:23:47.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:23:47.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:23:47.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:23:47.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:23:47.715 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:23:47.715 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:23:47.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:23:47.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:23:47.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:23:47.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:23:47.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:23:47.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:23:47.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:23:47.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:23:47.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:23:47.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:23:47.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:23:47.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:23:48.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:23:33
2026-05-28T10:23:48.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68733, datetime.datetime(2026, 5, 28, 10, 23, 33), datetime.datetime(2026, 5, 28, 10, 23, 33), 'salt', 11.47, 29.49, None, 7.27, 315.17, 17.2, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:23:48.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:23:48.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:23:48.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:23:33, diff=15.036267s, valid=True
2026-05-28T10:23:48.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:23:48.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:23:48.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=156.039067s, valid=True
2026-05-28T10:23:48.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:23:48.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:23:48.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:23:32, diff=16.045721s, valid=True
2026-05-28T10:23:48.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:23:48.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:23:48.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:23:48.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:23:48.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:23:48.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:23:48.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=156.048713s, valid=True
2026-05-28T10:23:48.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:23:48.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:23:48.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:23:48.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889270.049361s, valid=True
2026-05-28T10:23:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:23:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:23:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:23:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:23:48.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:23:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:23:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:23:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:23:48.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:23:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:23:48.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:23:48.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:23:48.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:23:48.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:23:48.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:23:48.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:23:49.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:23:49.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:23:49.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-28T10:23:49.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-28T10:23:49.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:23:49.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:24:19.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:24:19.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:24:19.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:24:19.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:24:19.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:24:19.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:24:19.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-28T10:24:19.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:24:19.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-28T10:24:19.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:24:19.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:24:19.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:24:19.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-28T10:24:22.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-28T10:24:22.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:24:22.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:24:22.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:24:22.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:24:22.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:24:22.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:24:22.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:24:22.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:24:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:24:22.357 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:24:22.357 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:24:22.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:24:22.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:24:22.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:24:22.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:24:22.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:24:22.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:24:22.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:24:22.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:24:22.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:24:22.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:24:22.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:24:22.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:24:22.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:24:03
2026-05-28T10:24:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68734, datetime.datetime(2026, 5, 28, 10, 24, 3), datetime.datetime(2026, 5, 28, 10, 24, 3), 'salt', 11.53, 28.99, None, 6.78, 319.42, 17.42, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:24:22.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:24:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:24:22.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:24:03, diff=19.697961s, valid=True
2026-05-28T10:24:22.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:24:22.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:24:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=190.700807s, valid=True
2026-05-28T10:24:22.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:24:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:24:03, diff=19.707482s, valid=True
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:24:22.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:24:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=190.71051s, valid=True
2026-05-28T10:24:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:24:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:24:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:24:22.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889304.711193s, valid=True
2026-05-28T10:24:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:24:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:24:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:24:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:24:22.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:24:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:24:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:24:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:24:22.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:24:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:24:22.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:24:22.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:24:23.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:24:23.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:24:23.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:24:23.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:24:23.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:24:23.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:24:23.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-28T10:24:23.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-28T10:24:23.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:24:23.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:24:53.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:24:53.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:24:53.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:24:54.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:24:54.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:24:54.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:24:54.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-28T10:24:54.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:24:54.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:24:54.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:24:54.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:24:54.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:24:54.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-28T10:24:56.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-28T10:24:56.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:24:56.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:24:56.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:24:56.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:24:57.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:24:57.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:24:57.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:24:57.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:24:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:24:57.019 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:24:57.019 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:24:57.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:24:57.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:24:57.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:24:57.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:24:57.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:24:57.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:24:57.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:24:57.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:24:57.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:24:57.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:24:57.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:24:57.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:24:57.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:24:33
2026-05-28T10:24:57.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68735, datetime.datetime(2026, 5, 28, 10, 24, 33), datetime.datetime(2026, 5, 28, 10, 24, 33), 'salt', 11.46, 27.96, None, 7.24, 293.86, 17.88, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:24:57.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:24:57.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:24:57.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:24:33, diff=24.383938s, valid=True
2026-05-28T10:24:57.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:24:57.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:24:57.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=225.387441s, valid=True
2026-05-28T10:24:57.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:24:57.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:24:33, diff=24.396153s, valid=True
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:24:57.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:24:57.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=225.40005s, valid=True
2026-05-28T10:24:57.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:24:57.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:24:57.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:24:57.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889339.400878s, valid=True
2026-05-28T10:24:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:24:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:24:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:24:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:24:57.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:24:57.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:24:57.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:24:57.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:24:57.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:24:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:24:57.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:24:57.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:24:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:24:57.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:24:58.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:24:58.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:24:58.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:24:58.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:24:58.567 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:24:58.567 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:24:58.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:24:58.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:25:28.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:25:28.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:25:28.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:25:29.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:25:29.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:25:29.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:25:29.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-28T10:25:29.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:25:29.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-28T10:25:29.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:25:29.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:25:29.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:25:29.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:25:31.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-28T10:25:31.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:25:31.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:25:31.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:25:31.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:25:31.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:25:31.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:25:31.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:25:31.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:25:31.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:25:31.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:25:31.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:25:31.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:25:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:25:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:25:32.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:25:32.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:25:32.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:25:32.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:25:32.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:25:32.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:25:32.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:25:32.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:25:32.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:25:32.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:25:04
2026-05-28T10:25:32.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68736, datetime.datetime(2026, 5, 28, 10, 25, 4), datetime.datetime(2026, 5, 28, 10, 25, 3), 'salt', 11.56, 26.37, None, 7.27, 293.53, 18.66, 830.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:25:32.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:25:32.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:25:32.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:25:03, diff=29.255889s, valid=True
2026-05-28T10:25:32.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:25:32.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:25:32.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=260.258728s, valid=True
2026-05-28T10:25:32.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:25:32.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:25:03, diff=29.265329s, valid=True
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:25:32.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:25:32.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=260.268344s, valid=True
2026-05-28T10:25:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:25:32.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:25:32.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:25:32.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889374.269s, valid=True
2026-05-28T10:25:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:25:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:25:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:25:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:25:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:25:32.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:25:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:25:32.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:25:32.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:25:32.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:25:32.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:25:32.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:25:32.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:25:32.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:25:32.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:25:33.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:25:33.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:25:33.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:25:33.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-28T10:25:33.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-28T10:25:33.520 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:25:33.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:26:03.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:26:03.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:26:03.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:26:03.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:26:03.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:26:04.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:26:04.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-28T10:26:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:26: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-28T10:26:04.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:26:04.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:26:04.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:26:04.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:26:06.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:26:06.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:26:06.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:26:06.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:26:06.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:26:06.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:26:06.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:26:06.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:26:06.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:26:06.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:26:06.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:26:06.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:26:06.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:26:06.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:26:06.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:26:06.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:26:06.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:26:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:26:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:26:06.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:26:06.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:26:06.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:26:06.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:26:06.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:26:06.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:26:04
2026-05-28T10:26:06.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68738, datetime.datetime(2026, 5, 28, 10, 26, 4), datetime.datetime(2026, 5, 28, 10, 26, 4), 'salt', 11.36, 28.33, None, 6.74, 313.66, 17.7, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:26:06.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:26:06.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:26:06.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:26:04, diff=2.73233s, valid=True
2026-05-28T10:26:06.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:26:06.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:26:06.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=294.735086s, valid=True
2026-05-28T10:26:06.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:26:06.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:26:06.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:26:04, diff=2.741701s, valid=True
2026-05-28T10:26:06.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:26:06.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:26:06.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:26:06.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:26:06.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:26:06.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:26:06.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:21:12, diff=294.744766s, valid=True
2026-05-28T10:26:06.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:26:06.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:26:06.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:26:06.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889408.745427s, valid=True
2026-05-28T10:26:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:26:06.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:26:06.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:26:06.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:26:06.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:26:06.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:26:06.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:26:06.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:26:06.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:26:06.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:26:07.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:26:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:26:07.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:26:07.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:26:07.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:26:07.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:26:07.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:26:07.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:26:07.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-28T10:26:07.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-28T10:26:07.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:26:07.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:26:37.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:26:37.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:26:37.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:26:38.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:26:38.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:26:38.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:26:38.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-28T10:26:38.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:26:38.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-28T10:26:38.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:26:38.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:26:38.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:26:38.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-28T10:26:41.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-28T10:26:41.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:26:41.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:26:41.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:26:41.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:26:41.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:26:41.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:26:41.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:26:41.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:26:41.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:26:41.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:26:41.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:26:41.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:26:41.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:26:41.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:26:41.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:26:41.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:26:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:26:41.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:26:41.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:26:41.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:26:41.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:26:41.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:26:41.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:26:41.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:26:34
2026-05-28T10:26:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68739, datetime.datetime(2026, 5, 28, 10, 26, 34), datetime.datetime(2026, 5, 28, 10, 26, 34), 'salt', 11.46, 26.64, None, 7.27, 329.76, 18.52, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:26:41.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:26:41.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:26:41.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:26:34, diff=7.568674s, valid=True
2026-05-28T10:26:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:26:41.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:26:41.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:12, diff=-30.428526s, valid=True
2026-05-28T10:26:41.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:26:41.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:26:41.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:26:34, diff=7.579686s, valid=True
2026-05-28T10:26:41.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:26:41.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:26:41.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:26:41.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:26:41.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:26:41.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:26:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:12, diff=-30.415823s, valid=True
2026-05-28T10:26:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:26:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:26:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:26:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889443.584872s, valid=True
2026-05-28T10:26:41.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:26:41.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:26:41.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:26:41.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:26:41.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:26:41.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:26:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:26:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:26:41.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:26:41.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:26:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:26:41.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:26:41.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:26:41.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:26:42.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:26:42.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:26:42.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:26:42.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:26:42.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:26:42.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:26:42.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:26:42.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:27:12.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:27:12.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:27:12.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:27:13.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:27:13.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:27:13.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:27:13.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-28T10:27:13.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:27:13.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-28T10:27:13.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:27:13.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:27:13.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:27:13.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:27:15.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-28T10:27:15.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:27:15.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:27:15.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:27:15.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:27:15.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:27:15.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:27:15.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:27:15.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:27:15.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:27:15.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:27:15.599 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:27:15.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:27:15.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:27:15.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:27:15.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:27:15.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:27:15.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:27:15.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:27:15.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:27:15.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:27:15.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:27:15.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:27:15.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:27:15.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:27:05
2026-05-28T10:27:15.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68740, datetime.datetime(2026, 5, 28, 10, 27, 5), datetime.datetime(2026, 5, 28, 10, 27, 4), 'salt', 11.36, 25.28, None, 6.85, 323.33, 19.18, 830.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:27:15.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:27:15.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:27:15.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:04, diff=11.919173s, valid=True
2026-05-28T10:27:15.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:27:15.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:27:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:12, diff=3.92203s, valid=True
2026-05-28T10:27:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:27:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:27:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:04, diff=11.928811s, valid=True
2026-05-28T10:27:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:27:15.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:27:15.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:27:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:27:15.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:27:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:27:15.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:12, diff=3.931822s, valid=True
2026-05-28T10:27:15.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:27:15.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:27:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:27:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889477.932483s, valid=True
2026-05-28T10:27:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:27:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:27:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:27:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:27:15.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:27:15.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:27:15.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:27:15.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:27:16.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:27:16.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:27:16.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:27:16.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:27:16.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:27:16.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:27:16.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:27:16.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:27:17.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:27:17.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:27:17.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-28T10:27:17.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-28T10:27:17.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:27:17.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:27:47.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:27:47.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:27:47.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:27:47.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:27:47.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:27:47.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:27:47.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-28T10:27:47.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:27:47.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-28T10:27:47.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:27:47.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:27:47.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:27:47.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:27:50.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:27:50.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:27:50.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:27:50.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:27:50.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:27:50.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:27:50.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:27:50.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:27:50.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:27:50.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:27:50.342 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:27:50.342 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:27:50.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:27:50.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:27:50.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:27:50.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:27:50.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:27:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:27:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:27:50.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:27:50.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:27:50.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:27:50.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:27:50.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:27:50.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:27:35
2026-05-28T10:27:50.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68741, datetime.datetime(2026, 5, 28, 10, 27, 35), datetime.datetime(2026, 5, 28, 10, 27, 35), 'salt', 11.3, 24.51, None, 6.32, 280.31, 19.57, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:27:50.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:27:50.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:27:50.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:35, diff=15.654335s, valid=True
2026-05-28T10:27:50.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:27:50.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:27:50.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:12, diff=-21.342839s, valid=True
2026-05-28T10:27:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:27:50.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:27:50.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:27:35, diff=15.663924s, valid=True
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:27:50.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:27:50.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:12, diff=-21.333091s, valid=True
2026-05-28T10:27:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:27:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:27:50.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:27:50.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889512.667557s, valid=True
2026-05-28T10:27:50.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:27:50.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:27:50.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:27:50.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:27:50.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:27:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:27:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:27:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:27:50.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:27:50.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:27:50.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:27:50.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:27:50.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:27:50.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:27:51.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:27:51.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:27:51.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:27:51.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:27:51.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-28T10:27:51.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-28T10:27:51.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:27:51.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:28:21.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:28:21.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:28:21.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:28:22.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:28:22.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:28:22.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:28:22.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:28:22.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:28:22.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:28:22.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:28:22.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:28:22.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:28:22.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-28T10:28: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-28T10:28:25.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:28:25.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:28:25.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:28:25.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:28:25.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:28:25.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:28:25.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:28:25.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:28:25.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:28:25.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:28:25.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:28:25.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:28:25.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:28:25.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:28:25.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:28:25.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:28:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:28:25.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:28:25.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:28:25.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:28:25.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:28:25.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:28:25.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:28:25.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:28:06
2026-05-28T10:28:25.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68742, datetime.datetime(2026, 5, 28, 10, 28, 6), datetime.datetime(2026, 5, 28, 10, 28, 5), 'salt', 11.43, 24.45, None, 8.36, 293.9, 19.63, 830.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:28:25.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:28:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:28:25.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:05, diff=20.660986s, valid=True
2026-05-28T10:28:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:28:25.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:28:25.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:12, diff=13.663846s, valid=True
2026-05-28T10:28:25.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:28:25.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:05, diff=20.670453s, valid=True
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:28:25.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:28:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:12, diff=13.67345s, valid=True
2026-05-28T10:28:25.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:28:25.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:28:25.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:28:25.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889547.674127s, valid=True
2026-05-28T10:28:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:28:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:28:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:28:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:28:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:28:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:28:25.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:28:25.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:28:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:28:25.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:28:25.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:28:25.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:28:25.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:28:25.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:28:26.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:28:26.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:28:26.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:28:26.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:28:26.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-28T10:28:26.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-28T10:28:26.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:28:26.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:28:56.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:28:56.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:28:56.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:28:57.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:28:57.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:28:57.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:28:57.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-28T10:28:57.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:28:57.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-28T10:28:57.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:28:57.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:28:57.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:28:57.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-28T10:29:00.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:29:00.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:29:00.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:29:00.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:29:00.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:29:00.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:29:00.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:29:00.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:29:00.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:29:00.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:29:00.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:29:00.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:29:00.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:29:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:29:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:29:00.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:29:00.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:29:00.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:29:00.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:29:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:29:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:29:00.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:29:00.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:29:00.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:29:00.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:28:36
2026-05-28T10:29:00.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68743, datetime.datetime(2026, 5, 28, 10, 28, 36), datetime.datetime(2026, 5, 28, 10, 28, 35), 'salt', 11.56, 25.91, None, 6.39, 278.6, 18.89, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:29:00.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:29:00.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:29:00.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:35, diff=25.356608s, valid=True
2026-05-28T10:29:00.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:29:00.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:29:00.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:12, diff=-11.6406s, valid=True
2026-05-28T10:29:00.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:29:00.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:29:00.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:28:35, diff=25.365959s, valid=True
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:29:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:29:00.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:12, diff=-11.631059s, valid=True
2026-05-28T10:29:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:29:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:29:00.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:29:00.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889582.369586s, valid=True
2026-05-28T10:29:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:29:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:29:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:29:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:29:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:29:00.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:29:00.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:29:00.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:29:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:29:00.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:29:00.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:29:00.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:29:00.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:29:00.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:29:00.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:29:01.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:29:01.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:29:01.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:29:01.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-28T10:29:01.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-28T10:29:01.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:29:01.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:29:31.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:29:31.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:29:31.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:29:31.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:29:31.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:29:32.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:29:32.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:29:32.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:29:32.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:29:32.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:29:32.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:29:32.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:29:32.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:29:34.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-28T10:29:34.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:29:34.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:29:34.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:29:34.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:29:34.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:29:34.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:29:34.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:29:34.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:29:34.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:29:34.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:29:34.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:29:34.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:29:34.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:29:34.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:29:34.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:29:34.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:29:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:29:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:29:34.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:29:34.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:29:34.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:29:34.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:29:34.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:29:34.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:29:06
2026-05-28T10:29:34.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68744, datetime.datetime(2026, 5, 28, 10, 29, 6), datetime.datetime(2026, 5, 28, 10, 29, 6), 'salt', 11.56, 27.36, None, 7.41, 287.17, 18.18, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:29:34.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:29:34.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:29:34.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:06, diff=28.822746s, valid=True
2026-05-28T10:29:34.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:29:34.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:29:34.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:12, diff=22.825578s, valid=True
2026-05-28T10:29:34.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:29:34.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:05, diff=29.832232s, valid=True
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:29:34.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:29:34.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:29:12, diff=22.835202s, valid=True
2026-05-28T10:29:34.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:29:34.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:29:34.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:29:34.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889616.835857s, valid=True
2026-05-28T10:29:34.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:29:34.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:29:34.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:29:34.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:29:34.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:29:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:29:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:29:34.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:29:34.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:29:34.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:29:35.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:29:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:29:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:29:35.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:29:35.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:29:35.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:29:35.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:29:35.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:29:35.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-28T10:29:35.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-28T10:29:35.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:29:35.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:30:06.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:30:06.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:30:06.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:30:06.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:30:06.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:30:06.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:30:06.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-28T10:30:06.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:30:06.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-28T10:30:06.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:30:06.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:30:06.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:30:06.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-28T10:30:08.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-28T10:30:08.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:30:08.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:30:08.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:30:08.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:30:08.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:30:08.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:30:08.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:30:08.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:30:08.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:30:08.993 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:30:08.993 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:30:09.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:30:09.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:30:09.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:30:09.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:30:09.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:30:09.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:30:09.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:30:09.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:30:09.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:30:09.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:30:09.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:30:09.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:30:09.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:30:07
2026-05-28T10:30:09.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68746, datetime.datetime(2026, 5, 28, 10, 30, 7), datetime.datetime(2026, 5, 28, 10, 30, 6), 'salt', 11.53, 33.9, None, 5.33, 256.91, 15.36, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:30:09.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:30:09.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:30:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:06, diff=3.312388s, valid=True
2026-05-28T10:30:09.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:30:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:30:09.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:12, diff=-2.684696s, valid=True
2026-05-28T10:30:09.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:30:09.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:06, diff=3.322035s, valid=True
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:30:09.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:30:09.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:12, diff=-2.674929s, valid=True
2026-05-28T10:30:09.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:30:09.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:30:09.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:30:09.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889651.325731s, valid=True
2026-05-28T10:30:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:30:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:30:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:30:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:30:09.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:30:09.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:30:09.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:30:09.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:30:09.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:30:09.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:30:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:30:09.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:30:09.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:30:09.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:30:09.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:30:10.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:30:10.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:30:10.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:30:10.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-28T10:30:10.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-28T10:30:10.655 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:30:10.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:30:40.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:30:40.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:30:40.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:30:41.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:30:41.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:30:41.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:30:41.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-28T10:30:41.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:30:41.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-28T10:30:41.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:30:41.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:30:41.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:30:41.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-28T10:30:43.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-28T10:30:43.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:30:43.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:30:43.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:30:43.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:30:43.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:30:43.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:30:43.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:30:43.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:30:43.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:30:43.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:30:43.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:30:43.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:30:43.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:30:43.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:30:43.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:30:43.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:30:44.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:30:44.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:30:44.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:30:44.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:30:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:30:44.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:30:44.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:30:44.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:30:37
2026-05-28T10:30:44.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68747, datetime.datetime(2026, 5, 28, 10, 30, 37), datetime.datetime(2026, 5, 28, 10, 30, 36), 'salt', 11.46, 33.24, None, 4.73, 323.06, 15.61, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:30:44.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:30:44.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:30:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:36, diff=8.123784s, valid=True
2026-05-28T10:30:44.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:30:44.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:30:44.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:12, diff=-27.873059s, valid=True
2026-05-28T10:30:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:30:44.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:30:36, diff=8.134281s, valid=True
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:30:44.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:30:44.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:12, diff=-27.862438s, valid=True
2026-05-28T10:30:44.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:30:44.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:30:44.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:30:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889686.138287s, valid=True
2026-05-28T10:30:44.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:30:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:30:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:30:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:30:44.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:30:44.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:30:44.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:30:44.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:30:44.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:30:44.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:30:44.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:30:44.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:30:44.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:30:44.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:30:44.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:30:45.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:30:45.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:30:45.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:30:45.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-28T10:30:45.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-28T10:30:45.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:30:45.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:31:15.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:31:15.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:31:15.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:31:15.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:31:15.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:31:15.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:31:15.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-28T10:31:15.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:31:15.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-28T10:31:15.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:31:15.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:31:15.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:31:15.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-28T10:31:18.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-28T10:31:18.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:31:18.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:31:18.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:31:18.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:31:18.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:31:18.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:31:18.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:31:18.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:31:18.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:31:18.197 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:31:18.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:31:18.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:31:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:31:18.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:31:18.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:31:18.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:31:18.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:31:18.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:31:18.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:31:18.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:31:18.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:31:18.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:31:18.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:31:18.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:31:07
2026-05-28T10:31:18.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68748, datetime.datetime(2026, 5, 28, 10, 31, 7), datetime.datetime(2026, 5, 28, 10, 31, 7), 'salt', 11.4, 34.33, None, 5.97, 316.21, 15.18, 830.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:31:18.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:31:18.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:31:18.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:07, diff=11.510317s, valid=True
2026-05-28T10:31:18.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:31:18.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:31:18.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:12, diff=6.513133s, valid=True
2026-05-28T10:31:18.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:31:18.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:31:18.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:06, diff=12.519797s, valid=True
2026-05-28T10:31:18.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:31:18.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:31:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:31:18.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:31:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:31:18.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:31:18.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:12, diff=6.522814s, valid=True
2026-05-28T10:31:18.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:31:18.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:31:18.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:31:18.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889720.523459s, valid=True
2026-05-28T10:31:18.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:31:18.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:31:18.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:31:18.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:31:18.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:31:18.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:31:18.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:31:18.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:31:18.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:31:18.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:31:18.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:31:18.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:31:18.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:31:18.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:31:19.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:31:19.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:31:19.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:31:19.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:31:19.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-28T10:31:19.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-28T10:31:19.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:31:19.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:31:49.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:31:49.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:31:49.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:31:50.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:31:50.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:31:50.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:31:50.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:31:50.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:31:50.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-28T10:31:50.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:31:50.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:31:50.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:31:50.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-28T10:31:52.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-28T10:31:52.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:31:52.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:31:52.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:31:52.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:31:52.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:31:52.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:31:52.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:31:52.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:31:52.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:31:52.800 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:31:52.800 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:31:52.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:31:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:31:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:31:52.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:31:52.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:31:53.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:31:53.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:31:53.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:31:53.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:31:53.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:31:53.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:31:53.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:31:53.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:31:37
2026-05-28T10:31:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68749, datetime.datetime(2026, 5, 28, 10, 31, 37), datetime.datetime(2026, 5, 28, 10, 31, 37), 'salt', 11.56, 34.73, None, 7.98, 335.45, 15.04, 830.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:31:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:31:53.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:31:53.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:37, diff=16.116299s, valid=True
2026-05-28T10:31:53.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:31:53.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:31:53.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:12, diff=-18.880856s, valid=True
2026-05-28T10:31:53.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:31:53.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:31:53.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:31:37, diff=16.125839s, valid=True
2026-05-28T10:31:53.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:31:53.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:31:53.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:31:53.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:31:53.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:31:53.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:31:53.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:12, diff=-18.871159s, valid=True
2026-05-28T10:31:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:31:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:31:53.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:31:53.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889755.129506s, valid=True
2026-05-28T10:31:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:31:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:31:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:31:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:31:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:31:53.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:31:53.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:31:53.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:31:53.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:31:53.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:31:53.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:31:53.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:31:53.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:31:53.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:31:53.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:31:54.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:31:54.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:31:54.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:31:54.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-28T10:31:54.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-28T10:31:55.222 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:31:55.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:32:25.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:32:25.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:32:25.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:32:25.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:32:25.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:32:25.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:32:25.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-28T10:32:26.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:32:26.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-28T10:32:26.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:32:26.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:32:26.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:32:26.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-28T10:32:28.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-28T10:32:28.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:32:28.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:32:28.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:32:28.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:32:28.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:32:28.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:32:28.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:32:28.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:32:28.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:32:28.409 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:32:28.409 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:32:28.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:32:28.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:32:28.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:32:28.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:32:28.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:32:28.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:32:28.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:32:28.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:32:28.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:32:28.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:32:28.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:32:28.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:32:28.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:32:07
2026-05-28T10:32:28.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68750, datetime.datetime(2026, 5, 28, 10, 32, 7), datetime.datetime(2026, 5, 28, 10, 32, 7), 'salt', 11.76, 33.6, None, 8.22, 337.21, 15.5, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:32:28.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:32:28.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:32:28.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:07, diff=21.728236s, valid=True
2026-05-28T10:32:28.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:32:28.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:32:28.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:12, diff=16.731087s, valid=True
2026-05-28T10:32:28.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:32:28.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:32:28.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:07, diff=21.737787s, valid=True
2026-05-28T10:32:28.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:32:28.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:32:28.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:32:28.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:32:28.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:32:28.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:32:28.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:12, diff=16.740892s, valid=True
2026-05-28T10:32:28.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:32:28.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:32:28.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:32:28.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889790.741553s, valid=True
2026-05-28T10:32:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:32:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:32:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:32:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:32:28.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:32:28.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:32:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:32:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:32:28.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:32:28.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:32:29.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:32:29.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:32:29.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:32:29.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:32:29.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:32:29.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:32:29.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:32:29.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:32:29.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-28T10:32:29.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-28T10:32:29.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:32:29.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:32:59.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:32:59.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:32:59.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:33:00.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:33:00.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:33:00.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:33:00.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-28T10:33:00.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:33:00.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-28T10:33:00.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:33:00.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:33:00.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:33:00.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-28T10:33:02.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-28T10:33:02.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:33:02.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:33:02.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:33:02.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:33:02.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:33:02.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:33:02.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:33:02.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:33:02.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:33:02.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:33:02.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:33:02.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:33:02.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:33:02.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:33:02.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:33:02.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:33:02.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:33:02.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:33:03.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:33:03.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:33:03.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:33:03.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:33:03.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:33:03.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:32:38
2026-05-28T10:33:03.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68751, datetime.datetime(2026, 5, 28, 10, 32, 38), datetime.datetime(2026, 5, 28, 10, 32, 37), 'salt', 11.76, 32.57, None, 7.77, 337.05, 15.92, 830.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:33:03.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:33:03.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:33:03.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:37, diff=26.091708s, valid=True
2026-05-28T10:33:03.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:33:03.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:33:03.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:12, diff=-8.905395s, valid=True
2026-05-28T10:33:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:33:03.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:32:37, diff=26.101421s, valid=True
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:33:03.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:33:03.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:12, diff=-8.895518s, valid=True
2026-05-28T10:33:03.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:33:03.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:33:03.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:33:03.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889825.105174s, valid=True
2026-05-28T10:33:03.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:33:03.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:33:03.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:33:03.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:33:03.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:33:03.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:33:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:33:03.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:33:03.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:33:03.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:33:03.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:33:03.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:33:03.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:33:03.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:33:03.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:33:03.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:33:04.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:33:04.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:33:04.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-28T10:33:04.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-28T10:33:04.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:33:04.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:33:34.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:33:34.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:33:34.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:33:34.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:33:34.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:33:34.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:33:34.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-28T10:33:34.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:33:34.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-28T10:33:34.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:33:34.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:33:34.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:33:34.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-28T10:33:37.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-28T10:33:37.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:33:37.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:33:37.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:33:37.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:33:37.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:33:37.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:33:37.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:33:37.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:33:37.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:33:37.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:33:37.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:33:37.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:33:37.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:33:37.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:33:37.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:33:37.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:33:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:33:37.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:33:37.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:33:37.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:33:37.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:33:37.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:33:37.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:33:37.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:33:08
2026-05-28T10:33:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68752, datetime.datetime(2026, 5, 28, 10, 33, 8), datetime.datetime(2026, 5, 28, 10, 33, 7), 'salt', 11.76, 29.19, None, 5.01, 318.48, 17.37, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:33:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:33:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:33:37.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:07, diff=30.674682s, valid=True
2026-05-28T10:33:37.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:33:37.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:33:37.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:12, diff=25.67746s, valid=True
2026-05-28T10:33:37.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:33:37.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:07, diff=30.683992s, valid=True
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:33:37.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:33:37.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:33:12, diff=25.686977s, valid=True
2026-05-28T10:33:37.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:33:37.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:33:37.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:33:37.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889859.687635s, valid=True
2026-05-28T10:33:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:33:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:33:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:33:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:33:37.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:33:37.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:33:37.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:33:37.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:33:37.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:33:37.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:33:37.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:33:37.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:33:37.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:33:38.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:33:38.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:33:38.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:33:38.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:33:38.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:33:38.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-28T10:33:38.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-28T10:33:38.825 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:33:38.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:34:08.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:34:08.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:34:08.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:34:09.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:34:09.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:34:09.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:34:09.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-28T10:34:09.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:34:09.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-28T10:34:09.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:34:09.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:34:09.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:34:09.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-28T10:34:12.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-28T10:34:12.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:34:12.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:34:12.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:34:12.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:34:12.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:34:12.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:34:12.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:34:12.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:34:12.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:34:12.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:34:12.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:34:12.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:34:12.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:34:12.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:34:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:34:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:34:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:34:12.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:34:12.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:34:12.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:34:12.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:34:12.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:34:12.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:34:12.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:34:08
2026-05-28T10:34:12.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68754, datetime.datetime(2026, 5, 28, 10, 34, 8), datetime.datetime(2026, 5, 28, 10, 34, 8), 'salt', 11.89, 29.06, None, 4.73, 333.64, 17.44, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:34:12.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:34:12.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:34:12.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:08, diff=4.398929s, valid=True
2026-05-28T10:34:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:34:12.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:34:12.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:12, diff=0.401745s, valid=True
2026-05-28T10:34:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:34:12.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:08, diff=4.40839s, valid=True
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:34:12.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:34:12.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:12, diff=0.411345s, valid=True
2026-05-28T10:34:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:34:12.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:34:12.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:34:12.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889894.411997s, valid=True
2026-05-28T10:34:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:34:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:34:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:34:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:34:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:34:12.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:34:12.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:34:12.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:34:12.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:34:12.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:34:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:34:12.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:34:12.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:34:12.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:34:13.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:34:13.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:34:13.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:34:13.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:34:13.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-28T10:34:13.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-28T10:34:13.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:34:13.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:34:43.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:34:43.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:34:43.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:34:44.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:34:44.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:34:44.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:34:44.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-28T10:34:44.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:34:44.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-28T10:34:44.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:34:44.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:34:44.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:34:44.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-28T10:34:46.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-28T10:34:46.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:34:46.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:34:46.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:34:46.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:34:46.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:34:46.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:34:46.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:34:46.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:34:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:34:46.808 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:34:46.808 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:34:46.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:34:46.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:34:46.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:34:46.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:34:46.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:34:47.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:34:47.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:34:47.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:34:47.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:34:47.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:34:47.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:34:47.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:34:47.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:34:38
2026-05-28T10:34:47.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68755, datetime.datetime(2026, 5, 28, 10, 34, 38), datetime.datetime(2026, 5, 28, 10, 34, 38), 'salt', 11.89, 30.18, None, 9.39, 329.89, 16.94, 830.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:34:47.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:34:47.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:34:47.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:38, diff=9.128945s, valid=True
2026-05-28T10:34:47.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:34:47.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:34:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:12, diff=-24.86824s, valid=True
2026-05-28T10:34:47.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:34:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:34:38, diff=9.138589s, valid=True
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:34:47.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:34:47.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:34:47.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:12, diff=-24.858388s, valid=True
2026-05-28T10:34:47.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:34:47.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:34:47.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:34:47.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889929.142267s, valid=True
2026-05-28T10:34:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:34:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:34:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:34:47.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:34:47.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:34:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:34:47.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:34:47.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:34:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:34:47.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:34:47.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:34:47.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:34:47.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:34:47.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:34:47.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:34:48.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:34:48.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:34:48.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:34:48.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-28T10:34:48.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-28T10:34:48.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:34:48.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:35:18.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:35:18.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:35:18.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:35:18.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:35:18.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:35:18.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:35:18.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-28T10:35:18.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:35:18.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-28T10:35:18.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:35:18.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:35:18.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:35:18.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-28T10:35:21.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-28T10:35:21.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:35:21.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:35:21.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:35:21.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:35:21.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:35:21.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:35:21.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:35:21.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:35:21.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:35:21.048 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:35:21.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:35:21.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:35:21.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:35:21.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:35:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:35:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:35:21.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:35:21.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:35:21.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:35:21.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:35:21.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:35:21.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:35:21.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:35:21.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:35:09
2026-05-28T10:35:21.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68756, datetime.datetime(2026, 5, 28, 10, 35, 9), datetime.datetime(2026, 5, 28, 10, 35, 8), 'salt', 11.96, 27.63, None, 8.61, 338.64, 18.11, 830.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:35:21.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:35:21.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:35:21.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:08, diff=13.362615s, valid=True
2026-05-28T10:35:21.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:35:21.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:35:21.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:12, diff=9.365441s, valid=True
2026-05-28T10:35:21.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:35:21.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:08, diff=13.37208s, valid=True
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:35:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:35:21.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:12, diff=9.375123s, valid=True
2026-05-28T10:35:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:35:21.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:35:21.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:35:21.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889963.375795s, valid=True
2026-05-28T10:35:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:35:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:35:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:35:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:35:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:35:21.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:35:21.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:35:21.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:35:21.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:35:21.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:35:21.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:35:21.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:35:21.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:35:21.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:35:22.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:35:22.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:35:22.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:35:22.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:35:22.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-28T10:35:22.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-28T10:35:22.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:35:22.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:35:52.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:35:52.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:35:52.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:35:52.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:35:52.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:35:52.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:35:52.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-28T10:35:52.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:35:52.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:35:52.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:35:52.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:35:52.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:35:52.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-28T10:35:55.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-28T10:35:55.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:35:55.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:35:55.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:35:55.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:35:55.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:35:55.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:35:55.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:35:55.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:35:55.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:35:55.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:35:55.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:35:55.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:35:55.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:35:55.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:35:55.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:35:55.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:35:55.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:35:55.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:35:55.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:35:55.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:35:55.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:35:55.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:35:55.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:35:55.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:35:39
2026-05-28T10:35:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68757, datetime.datetime(2026, 5, 28, 10, 35, 39), datetime.datetime(2026, 5, 28, 10, 35, 39), 'salt', 12.02, 29.02, None, 9.78, 333.0, 17.47, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:35:55.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:35:55.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:35:55.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:39, diff=16.75445s, valid=True
2026-05-28T10:35:55.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:35:55.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:35:55.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:12, diff=-16.242723s, valid=True
2026-05-28T10:35:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:35:55.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:35:55.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:35:39, diff=16.763848s, valid=True
2026-05-28T10:35:55.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:35:55.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:35:55.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:35:55.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:35:55.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:35:55.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:35:55.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:12, diff=-16.233171s, valid=True
2026-05-28T10:35:55.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:35:55.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:35:55.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:35:55.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=889997.767469s, valid=True
2026-05-28T10:35:55.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:35:55.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:35:55.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:35:55.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:35:55.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:35:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:35:55.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:35:55.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:35:55.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:35:55.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:35:55.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:35:56.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:35:56.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:35:56.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:35:56.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:35:56.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:35:56.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:35:56.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:35:56.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-28T10:35:56.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-28T10:35:56.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:35:56.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:36:26.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:36:26.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:36:26.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:36:27.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:36:27.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:36:27.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:36:27.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-28T10:36:27.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:36:27.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-28T10:36:27.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:36:27.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:36:27.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:36:27.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:36:30.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-28T10:36:30.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:36:30.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:36:30.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:36:30.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:36:30.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:36:30.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:36:30.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:36:30.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:36:30.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:36:30.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:36:30.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:36:30.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:36:30.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:36:30.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:36:30.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:36:30.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:36:30.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:36:30.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:36:30.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 659 rows from lcogt
2026-05-28T10:36:30.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:36:30.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:36:30.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:36:30.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:36:30.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:36:09
2026-05-28T10:36:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68758, datetime.datetime(2026, 5, 28, 10, 36, 9), datetime.datetime(2026, 5, 28, 10, 36, 9), 'salt', 12.09, 30.41, None, 6.28, 310.52, 16.87, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:36:30.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:36:30.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:36:30.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:09, diff=21.453932s, valid=True
2026-05-28T10:36:30.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:36:30.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:36:30.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:12, diff=18.456776s, valid=True
2026-05-28T10:36:30.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:36:30.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:09, diff=21.463393s, valid=True
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:36:30.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 659 rows. Structure expected: 10 fields
2026-05-28T10:36:30.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:12, diff=18.466458s, valid=True
2026-05-28T10:36:30.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:36:30.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:36:30.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:36:30.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890032.467143s, valid=True
2026-05-28T10:36:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:36:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:36:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:36:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:36:30.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:36:30.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:36:30.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:36:30.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:36:30.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:36:30.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:36:30.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:36:30.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:36:30.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:36:30.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:36:31.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:36:31.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:36:31.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:36:31.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:36:31.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-28T10:36:31.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-28T10:36:31.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:36:31.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:37:01.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:37:01.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:37:01.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:37:01.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:37:01.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:37:02.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:37:02.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-28T10:37:02.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:37:02.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-28T10:37:02.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:37:02.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:37:02.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:37:02.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-28T10:37:04.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-28T10:37:04.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:37:04.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:37:04.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:37:04.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:37:04.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:37:04.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:37:04.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:37:04.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:37:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:37:04.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:37:04.562 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:37:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:37:04.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:37:04.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:37:04.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:37:04.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:37:04.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:37:04.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:37:04.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:37:04.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:37:04.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:37:04.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:37:04.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:37:04.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:36:40
2026-05-28T10:37:04.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68759, datetime.datetime(2026, 5, 28, 10, 36, 40), datetime.datetime(2026, 5, 28, 10, 36, 39), 'salt', 12.09, 29.52, None, 7.02, 328.59, 17.26, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:37:04.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:37:04.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:37:04.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:39, diff=25.88433s, valid=True
2026-05-28T10:37:04.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:37:04.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:37:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:12, diff=-7.112823s, valid=True
2026-05-28T10:37:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:37:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:36:33, diff=31.894022s, valid=True
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:37:04.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:37:04.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:12, diff=-7.102936s, valid=True
2026-05-28T10:37:04.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:37:04.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:37:04.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:37:04.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890066.897747s, valid=True
2026-05-28T10:37:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:37:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:37:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:37:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:37:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:37:04.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:37:04.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:37:04.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:37:04.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:37:05.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:37:05.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:37:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:37:05.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:37:05.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:37:05.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:37:05.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:37:05.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:37:05.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:37:05.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-28T10:37:05.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:37:05.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:37:05.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:37:35.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:37:35.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:37:35.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:37:36.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:37:36.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:37:36.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:37:36.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-28T10:37:36.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:37: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-28T10:37:36.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:37:36.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:37:36.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:37:36.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-28T10:37:39.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-28T10:37:39.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:37:39.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:37:39.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:37:39.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:37:39.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:37:39.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:37:39.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:37:39.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:37:39.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:37:39.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:37:39.180 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:37:39.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:37:39.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:37:39.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:37:39.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:37:39.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:37:39.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:37:39.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:37:39.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-28T10:37:39.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:37:39.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:37:39.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:37:39.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:37:39.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:37:10
2026-05-28T10:37:39.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68760, datetime.datetime(2026, 5, 28, 10, 37, 10), datetime.datetime(2026, 5, 28, 10, 37, 9), 'salt', 11.92, 29.65, None, 8.4, 314.93, 17.18, 830.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:37:39.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:37:39.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:37:39.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:09, diff=30.51486s, valid=True
2026-05-28T10:37:39.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:37:39.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:37:39.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:12, diff=27.517683s, valid=True
2026-05-28T10:37:39.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:37:39.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:04, diff=35.524311s, valid=True
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:37:39.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-28T10:37:39.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:37:12, diff=27.527303s, valid=True
2026-05-28T10:37:39.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:37:39.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:37:39.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:37:39.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890101.52797s, valid=True
2026-05-28T10:37:39.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:37:39.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:37:39.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:37:39.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:37:39.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:37:39.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:37:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:37:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:37:39.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:37:39.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:37:39.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:37:39.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:37:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:37:39.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:37:40.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:37:40.488 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:37:40.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:37:40.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:37:40.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-28T10:37:40.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-28T10:37:40.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:37:40.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:38:10.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:38:10.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:38:10.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:38:11.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:38:11.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:38:11.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:38: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-28T10:38:11.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:38:11.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-28T10:38:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:38:11.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:38:11.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:38: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-28T10:38:13.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:38:13.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:38:13.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:38:13.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:38:13.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:38:13.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:38:13.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:38:13.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:38:13.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:38:13.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:38:13.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:38:13.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:38:13.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:38:13.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:38:13.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:38:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:38:13.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:38:14.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:38:14.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:38:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-28T10:38:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:38:14.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:38:14.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:38:14.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:38:14.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:38:10
2026-05-28T10:38:14.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68762, datetime.datetime(2026, 5, 28, 10, 38, 10), datetime.datetime(2026, 5, 28, 10, 38, 10), 'salt', 11.89, 31.18, None, 8.05, 320.82, 16.51, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:38:14.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:38:14.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:38:14.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:10, diff=4.109499s, valid=True
2026-05-28T10:38:14.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:38:14.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:38:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:12, diff=2.112296s, valid=True
2026-05-28T10:38:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:38:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:38:14.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:10, diff=4.118768s, valid=True
2026-05-28T10:38:14.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:38:14.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:38:14.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:38:14.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:38:14.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:38:14.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-28T10:38:14.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:12, diff=2.121738s, valid=True
2026-05-28T10:38:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:38:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:38:14.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:38:14.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890136.122384s, valid=True
2026-05-28T10:38:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:38:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:38:14.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:38:14.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:38:14.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:38:14.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:38:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:38:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:38:14.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:38:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:38:14.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:38:14.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:38:14.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:38:14.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:38:14.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:38:15.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:38:15.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:38:15.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:38:15.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-28T10:38:15.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-28T10:38:15.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:38:15.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:38:45.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:38:45.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:38:45.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:38:45.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:38:45.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:38:45.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:38:45.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:38:45.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:38:45.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-28T10:38:45.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:38:45.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:38:45.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:38:45.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-28T10:38:48.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-28T10:38:48.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:38:48.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:38:48.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:38:48.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:38:48.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:38:48.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:38:48.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:38:48.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:38:48.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:38:48.388 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:38:48.388 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:38:48.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:38:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:38:48.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:38:48.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:38:48.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:38:48.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:38:48.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:38:48.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:38:48.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:38:48.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:38:48.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:38:48.637 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:38:48.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:38:40
2026-05-28T10:38:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68763, datetime.datetime(2026, 5, 28, 10, 38, 40), datetime.datetime(2026, 5, 28, 10, 38, 40), 'salt', 11.89, 31.14, None, 6.95, 334.2, 16.53, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:38:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:38:48.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:38:48.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:40, diff=8.701591s, valid=True
2026-05-28T10:38:48.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:38:48.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:38:48.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:12, diff=-23.295589s, valid=True
2026-05-28T10:38:48.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:38:48.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:38:40, diff=8.710996s, valid=True
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:38:48.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:38:48.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:12, diff=-23.286047s, valid=True
2026-05-28T10:38:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:38:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:38:48.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:38:48.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890170.71459s, valid=True
2026-05-28T10:38:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:38:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:38:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:38:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:38:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:38:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:38:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:38:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:38:48.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:38:48.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:38:48.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:38:48.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:38:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:38:49.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:38:49.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:38:49.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:38:49.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:38:49.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:38:49.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-28T10:38:49.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-28T10:38:49.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:38:49.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:39:19.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:39:19.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:39:19.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:39:20.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:39:20.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:39:20.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:39:20.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-28T10:39:20.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:39:20.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-28T10:39:20.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:39:20.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:39:20.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:39:20.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:39:22.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-28T10:39:22.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:39:22.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:39:22.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:39:22.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:39:22.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:39:22.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:39:22.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:39:22.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:39:22.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:39:22.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:39:22.996 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:39:23.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:39:23.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:39:23.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:39:23.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:39:23.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:39:23.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:39:23.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:39:23.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T10:39:23.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:39:23.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:39:23.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:39:23.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:39:23.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:39:11
2026-05-28T10:39:23.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68764, datetime.datetime(2026, 5, 28, 10, 39, 11), datetime.datetime(2026, 5, 28, 10, 39, 10), 'salt', 11.96, 32.27, None, 5.61, 321.76, 16.07, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:39:23.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:39:23.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:39:23.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:10, diff=13.323138s, valid=True
2026-05-28T10:39:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:39:23.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:39:23.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:12, diff=11.325976s, valid=True
2026-05-28T10:39:23.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:39:23.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:11, diff=12.332607s, valid=True
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:39:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:39:23.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T10:39:23.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:12, diff=11.335592s, valid=True
2026-05-28T10:39:23.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:39:23.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:39:23.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:39:23.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890205.336247s, valid=True
2026-05-28T10:39:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:39:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:39:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:39:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:39:23.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:39:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:39:23.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:39:23.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:39:23.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:39:23.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:39:23.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:39:23.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:39:23.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:39:23.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:39:23.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:39:24.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:39:24.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:39:24.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:39:24.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-28T10:39:24.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-28T10:39:24.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:39:24.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:39:54.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:39:54.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:39:54.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:39:54.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:39:54.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:39:55.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:39:55.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-28T10:39:55.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:39:55.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-28T10:39:55.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:39:55.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:39:55.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:39:55.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-28T10:39:57.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-28T10:39:57.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:39:57.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:39:57.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:39:57.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:39:57.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:39:57.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:39:57.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:39:57.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:39:57.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:39:57.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:39:57.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:39:57.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:39:57.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:39:57.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:39:57.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:39:57.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:39:57.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:39:57.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:39:57.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:39:57.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:39:57.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:39:57.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:39:57.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:39:57.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:39:41
2026-05-28T10:39:57.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68765, datetime.datetime(2026, 5, 28, 10, 39, 41), datetime.datetime(2026, 5, 28, 10, 39, 40), 'salt', 12.02, 32.47, None, 5.61, 325.68, 15.99, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:39:57.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:39:57.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:39:57.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:40, diff=17.968954s, valid=True
2026-05-28T10:39:57.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:39:57.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:39:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:12, diff=-14.028177s, valid=True
2026-05-28T10:39:57.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:39:57.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:39:57.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:39:41, diff=16.978788s, valid=True
2026-05-28T10:39:57.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:39:57.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:39:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:39:57.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:39:57.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:39:57.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:39:57.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:12, diff=-14.01805s, valid=True
2026-05-28T10:39:57.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:39:57.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:39:57.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:39:57.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890239.982602s, valid=True
2026-05-28T10:39:57.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:39:57.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:39:57.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:39:57.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:39:57.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:39:58.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:39:58.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:39:58.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:39:58.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:39:58.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:39:58.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:39:58.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:39:58.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:39:58.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:39:58.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:39:58.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:39:59.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:39:59.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:39:59.007 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:39:59.007 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:39:59.074 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:39:59.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:40:29.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:40:29.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:40:29.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:40:29.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:40:29.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:40:29.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:40:29.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-28T10:40:29.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:40:29.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-28T10:40:29.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:40:29.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:40:29.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:40:29.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-28T10:40:31.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-28T10:40:31.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:40:31.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:40:31.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:40:31.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:40:31.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:40:31.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:40:31.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:40:31.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:40:31.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:40:31.868 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:40:31.868 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:40:31.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:40:31.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:40:31.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:40:32.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:40:32.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:40:32.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:40:32.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:40:32.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:40:32.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:40:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:40:32.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:40:32.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:40:32.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:40:11
2026-05-28T10:40:32.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68766, datetime.datetime(2026, 5, 28, 10, 40, 11), datetime.datetime(2026, 5, 28, 10, 40, 11), 'salt', 12.09, 35.36, None, 4.8, 315.09, 14.86, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:40:32.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:40:32.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:40:32.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:11, diff=21.179022s, valid=True
2026-05-28T10:40:32.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:40:32.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:40:32.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:12, diff=20.181856s, valid=True
2026-05-28T10:40:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:40:32.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:11, diff=21.188537s, valid=True
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:40:32.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:40:32.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:12, diff=20.191541s, valid=True
2026-05-28T10:40:32.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:40:32.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:40:32.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:40:32.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890274.192204s, valid=True
2026-05-28T10:40:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:40:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:40:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:40:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:40:32.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:40:32.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:40:32.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:40:32.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:40:32.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:40:32.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:40:32.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:40:32.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:40:32.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:40:32.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:40:32.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:40:33.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:40:33.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:40:33.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:40:33.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-28T10:40:33.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-28T10:40:33.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:40:33.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:41:03.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:41:03.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:41:03.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:41:03.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:41:03.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:41:03.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:41:03.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-28T10:41:03.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:41:03.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-28T10:41:03.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:41:03.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:41:03.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:41:03.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-28T10:41:06.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-28T10:41:06.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:41:06.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:41:06.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:41:06.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:41:06.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:41:06.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:41:06.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:41:06.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:41:06.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:41:06.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:41:06.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:41:06.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:41:06.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:41:06.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:41:06.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:41:06.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:41:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:41:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:41:06.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:41:06.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:41:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:41:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:41:06.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:41:06.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:40:41
2026-05-28T10:41:06.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68767, datetime.datetime(2026, 5, 28, 10, 40, 41), datetime.datetime(2026, 5, 28, 10, 40, 41), 'salt', 12.12, 35.95, None, 5.47, 277.62, 14.63, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:41:06.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:41:06.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:41:06.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:41, diff=25.733243s, valid=True
2026-05-28T10:41:06.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:41:06.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:41:06.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:12, diff=-5.263886s, valid=True
2026-05-28T10:41:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:41:06.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:41:06.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:40:41, diff=25.742863s, valid=True
2026-05-28T10:41:06.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:41:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:41:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:41:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:41:06.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:41:06.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:41:06.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:12, diff=-5.254079s, valid=True
2026-05-28T10:41:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:41:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:41:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:41:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890308.746584s, valid=True
2026-05-28T10:41:06.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:41:06.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:41:06.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:41:06.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:41:06.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:41:06.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:41:06.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:41:06.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:41:06.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:41:06.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:41:06.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:41:06.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:41:07.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:41:07.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:41:07.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:41:07.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:41:07.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:41:07.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:41:07.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:41:07.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-28T10:41:07.780 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:41:07.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:41:37.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:41:37.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:41:37.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:41:38.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:41:38.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:41:38.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:41:38.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-28T10:41:38.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:41:38.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:41:38.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:41:38.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:41:38.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:41:38.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-28T10:41:40.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-28T10:41:40.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:41:40.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:41:40.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:41:40.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:41:40.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:41:40.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:41:40.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:41:40.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:41:40.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:41:40.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:41:40.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:41:40.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:41:40.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:41:40.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:41:40.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:41:40.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:41:40.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:41:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:41:40.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:41:40.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:41:41.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:41:41.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:41:41.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:41:41.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:41:11
2026-05-28T10:41:41.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68768, datetime.datetime(2026, 5, 28, 10, 41, 11), datetime.datetime(2026, 5, 28, 10, 41, 11), 'salt', 12.09, 34.33, None, 8.15, 322.2, 15.26, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:41:41.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:41:41.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:41:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:11, diff=30.06824s, valid=True
2026-05-28T10:41:41.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:41:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:41:41.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:12, diff=29.071902s, valid=True
2026-05-28T10:41:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:41:41.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:05, diff=36.081023s, valid=True
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:41:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:41:41.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:41:12, diff=29.08498s, valid=True
2026-05-28T10:41:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:41:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:41:41.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:41:41.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890343.085825s, valid=True
2026-05-28T10:41:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:41:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:41:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:41:41.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:41:41.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:41:41.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:41:41.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:41:41.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:41:41.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:41:41.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:41:41.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:41:41.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:41:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:41:41.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:41:41.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:41:42.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:41:42.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:41:42.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:41:42.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-28T10:41:42.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-28T10:41:42.315 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:41:42.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:42:12.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:42:12.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:42:12.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:42:12.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:42:12.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:42:12.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:42:12.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-28T10:42:12.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:42:12.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-28T10:42:12.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:42:12.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:42:12.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:42:12.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-28T10:42:15.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-28T10:42:15.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:42:15.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:42:15.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:42:15.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:42:15.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:42:15.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:42:15.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:42:15.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:42:15.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:42:15.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:42:15.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:42:15.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:42:15.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:42:15.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:42:15.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:42:15.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:42:15.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:42:15.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:42:15.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:42:15.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:42:15.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:42:15.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:42:15.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:42:15.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:42:12
2026-05-28T10:42:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68770, datetime.datetime(2026, 5, 28, 10, 42, 12), datetime.datetime(2026, 5, 28, 10, 42, 11), 'salt', 12.09, 31.64, None, 5.82, 334.26, 16.34, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:42:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:42:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:42:15.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:11, diff=4.71627s, valid=True
2026-05-28T10:42:15.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:42:15.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:42:15.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:12, diff=3.720866s, valid=True
2026-05-28T10:42:15.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:42:15.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:42:15.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:12, diff=3.728804s, valid=True
2026-05-28T10:42:15.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:42:15.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:42:15.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:42:15.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:42:15.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:42:15.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:42:15.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:12, diff=3.731898s, valid=True
2026-05-28T10:42:15.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:42:15.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:42:15.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:42:15.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890377.732568s, valid=True
2026-05-28T10:42:15.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:42:15.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:42:15.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:42:15.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:42:15.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:42:15.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:42:15.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:42:15.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:42:15.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:42:15.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:42:15.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:42:15.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:42:16.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:42:16.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:42:16.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:42:16.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:42:16.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:42:16.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:42:16.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:42:16.728 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:42:16.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:42:16.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:42:46.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:42:46.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:42:46.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:42:47.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:42:47.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:42:47.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:42:47.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:42:47.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:42:47.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-28T10:42:47.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:42:47.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:42:47.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:42:47.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-28T10:42:49.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-28T10:42:49.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:42:49.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:42:49.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:42:49.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:42:49.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:42:49.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:42:49.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:42:49.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:42:49.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:42:49.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:42:49.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:42:49.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:42:49.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:42:49.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:42:50.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:42:50.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:42:50.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:42:50.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:42:50.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:42:50.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:42:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:42:50.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:42:50.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:42:50.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:42:42
2026-05-28T10:42:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68771, datetime.datetime(2026, 5, 28, 10, 42, 42), datetime.datetime(2026, 5, 28, 10, 42, 41), 'salt', 12.02, 29.85, None, 7.94, 294.06, 17.1, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:42:50.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:42:50.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:42:50.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:41, diff=9.304339s, valid=True
2026-05-28T10:42:50.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:42:50.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:42:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:12, diff=-21.692805s, valid=True
2026-05-28T10:42:50.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:42:50.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:42:50.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:42:39, diff=11.313846s, valid=True
2026-05-28T10:42:50.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:42:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:42:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:42:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:42:50.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:42:50.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:42:50.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:12, diff=-21.683137s, valid=True
2026-05-28T10:42:50.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:42:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:42:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:42:50.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890412.317539s, valid=True
2026-05-28T10:42:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:42:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:42:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:42:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:42:50.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:42:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:42:50.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:42:50.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:42:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:42:50.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:42:50.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:42:50.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:42:50.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:42:50.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:42:50.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:42:51.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:42:51.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:42:51.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:42:51.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-28T10:42:51.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-28T10:42:51.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:42:51.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:43:21.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:43:21.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:43: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-28T10:43:21.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:43:21.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:43:21.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:43:21.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-28T10:43:21.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:43:21.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-28T10:43:21.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:43:21.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:43:21.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:43:21.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-28T10:43:24.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-28T10:43:24.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:43:24.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:43:24.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:43:24.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:43:24.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:43:24.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:43:24.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:43:24.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:43:24.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:43:24.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:43:24.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:43:24.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:43:24.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:43:24.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:43:24.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:43:24.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:43:24.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:43:24.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:43:24.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:43:24.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:43:24.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:43:24.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:43:24.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:43:24.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:43:12
2026-05-28T10:43:24.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68772, datetime.datetime(2026, 5, 28, 10, 43, 12), datetime.datetime(2026, 5, 28, 10, 43, 12), 'salt', 12.05, 26.37, None, 5.68, 311.61, 18.73, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:43:24.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:43:24.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:43:24.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:12, diff=12.446182s, valid=True
2026-05-28T10:43:24.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:43:24.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:43:24.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:12, diff=12.45013s, valid=True
2026-05-28T10:43:24.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:43:24.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:11, diff=13.457358s, valid=True
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:43:24.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:43:24.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:12, diff=12.46039s, valid=True
2026-05-28T10:43:24.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:43:24.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:43:24.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:43:24.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890446.461065s, valid=True
2026-05-28T10:43:24.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:43:24.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:43:24.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:43:24.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:43:24.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:43:24.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:43:24.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:43:24.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:43:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:43:24.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:43:24.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:43:24.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:43:24.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:43:24.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:43:25.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:43:25.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:43:25.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:43:25.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:43:25.469 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:43:25.469 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:43:26.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:43:26.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:43:56.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:43:56.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:43:56.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:43:56.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:43:56.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:43:57.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:43:57.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-28T10:43:57.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:43:57.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-28T10:43:57.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:43:57.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:43:57.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:43:57.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:43:59.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-28T10:43:59.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:43:59.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:43:59.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:43:59.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:43:59.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:43:59.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:43:59.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:43:59.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:43:59.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:43:59.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:43:59.562 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:43:59.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:43:59.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:43:59.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:43:59.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:43:59.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:43:59.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:43:59.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:43:59.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:43:59.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:43:59.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:43:59.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:43:59.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:43:59.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:43:43
2026-05-28T10:43:59.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68773, datetime.datetime(2026, 5, 28, 10, 43, 43), datetime.datetime(2026, 5, 28, 10, 43, 42), 'salt', 11.86, 25.47, None, 6.25, 297.95, 19.16, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:43:59.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:43:59.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:43:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:42, diff=17.887316s, valid=True
2026-05-28T10:43:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:43:59.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:43:59.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:12, diff=-12.108027s, valid=True
2026-05-28T10:43:59.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:43:59.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:43:59.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:43:42, diff=17.901879s, valid=True
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:43:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:43:59.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:12, diff=-12.094907s, valid=True
2026-05-28T10:43:59.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:43:59.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:43:59.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:43:59.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890481.905814s, valid=True
2026-05-28T10:43:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:43:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:43:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:43:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:43:59.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:43:59.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:43:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:43:59.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:43:59.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:44:00.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:44:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:44:00.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:44:00.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:44:00.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:44:00.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:44:00.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:44:00.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:44:00.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:44:00.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-28T10:44:00.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-28T10:44:01.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:44:01.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:44:31.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:44:31.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:44: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-28T10:44:31.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:44:31.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:44:31.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:44:31.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:44:31.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:44:31.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-28T10:44:31.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:44:31.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:44:31.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:44:31.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-28T10:44:34.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-28T10:44:34.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:44:34.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:44:34.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:44:34.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:44:34.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:44:34.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:44:34.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:44:34.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:44:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:44:34.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:44:34.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:44:34.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:44:34.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:44:34.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:44:34.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:44:34.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:44:34.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:44:34.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:44:34.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:44:34.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:44:34.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:44:34.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:44:34.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:44:34.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:44:13
2026-05-28T10:44:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68774, datetime.datetime(2026, 5, 28, 10, 44, 13), datetime.datetime(2026, 5, 28, 10, 44, 12), 'salt', 11.92, 30.18, None, 7.02, 310.95, 16.95, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:44:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:44:34.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:44:34.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:12, diff=22.761812s, valid=True
2026-05-28T10:44:34.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:44:34.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:44:34.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:12, diff=22.764603s, valid=True
2026-05-28T10:44:34.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:44:34.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:03, diff=31.771254s, valid=True
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:44:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:44:34.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:12, diff=22.77424s, valid=True
2026-05-28T10:44:34.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:44:34.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:44:34.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:44:34.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890516.774902s, valid=True
2026-05-28T10:44:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:44:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:44:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:44:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:44:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:44:34.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:44:34.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:44:34.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:44:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:44:34.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:44:34.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:44:35.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:44:35.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:44:35.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:44:35.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:44:35.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:44:35.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:44:35.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:44:35.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-28T10:44:35.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-28T10:44:35.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:44:35.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:45:05.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:45:05.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:45:05.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:45:06.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:45:06.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:45:06.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:45:06.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-28T10:45:06.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:45:06.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-28T10:45:06.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:45:06.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:45:06.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:45:06.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-28T10:45:08.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-28T10:45:08.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:45:08.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:45:08.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:45:08.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:45:09.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:45:09.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:45:09.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:45:09.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:45:09.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:45:09.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:45:09.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:45:09.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:45:09.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:45:09.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:45:09.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:45:09.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:45:09.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:45:09.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:45:09.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:45:09.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:45:09.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:45:09.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:45:09.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:45:09.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:44:43
2026-05-28T10:45:09.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68775, datetime.datetime(2026, 5, 28, 10, 44, 43), datetime.datetime(2026, 5, 28, 10, 44, 42), 'salt', 11.95, 31.51, None, 7.02, 296.05, 16.38, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:45:09.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:45:09.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:45:09.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:42, diff=27.340034s, valid=True
2026-05-28T10:45:09.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:45:09.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:45:09.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:45:12, diff=-2.657101s, valid=True
2026-05-28T10:45:09.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:45:09.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:45:09.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:44:35, diff=34.349611s, valid=True
2026-05-28T10:45:09.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:45:09.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:45:09.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:45:09.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:45:09.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:45:09.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:45:09.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:45:12, diff=-2.647376s, valid=True
2026-05-28T10:45:09.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:45:09.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:45:09.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:45:09.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890551.353269s, valid=True
2026-05-28T10:45:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:45:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:45:09.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:45:09.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:45:09.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:45:09.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:45:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:45:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:45:09.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:45:09.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:45:09.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:45:09.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:45:09.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:45:09.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:45:09.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:45:10.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:45:10.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:45:10.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:45:10.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-28T10:45:10.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-28T10:45:10.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:45:10.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:45:40.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:45:40.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:45:40.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:45:40.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:45:40.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:45:41.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:45:41.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-28T10:45:41.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:45:41.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-28T10:45:41.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:45:41.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:45:41.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:45:41.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:45:43.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-28T10:45:43.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:45:43.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:45:43.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:45:43.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:45:43.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:45:43.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:45:43.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:45:43.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:45:43.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:45:43.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:45:43.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:45:43.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:45:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:45:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:45:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:45:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:45:44.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:45:44.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:45:44.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:45:44.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:45:44.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:45:44.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:45:44.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:45:44.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:45:43
2026-05-28T10:45:44.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68777, datetime.datetime(2026, 5, 28, 10, 45, 43), datetime.datetime(2026, 5, 28, 10, 45, 43), 'salt', 11.69, 31.34, None, 4.77, 330.59, 16.42, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:45:44.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:45:44.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:45:44.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:45:43, diff=1.135602s, valid=True
2026-05-28T10:45:44.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:45:44.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:45:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:12, diff=-27.861589s, valid=True
2026-05-28T10:45:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:45:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:45:38, diff=6.145141s, valid=True
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:45:44.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:45:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:12, diff=-27.851818s, valid=True
2026-05-28T10:45:44.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:45:44.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:45:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:45:44.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890586.148856s, valid=True
2026-05-28T10:45:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:45:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:45:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:45:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:45:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:45:44.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:45:44.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:45:44.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:45:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:45:44.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:45:44.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:45:44.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:45:44.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:45:44.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:45:44.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:45:45.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:45:45.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:45:45.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:45:45.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-28T10:45:45.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-28T10:45:45.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:45:45.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:46:15.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:46:15.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:46:15.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:46:15.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:46:15.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:46:15.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:46:15.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-28T10:46:15.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:46:15.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-28T10:46:15.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:46:15.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:46:15.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:46:15.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-28T10:46:18.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-28T10:46:18.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:46:18.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:46:18.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:46:18.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:46:18.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:46:18.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:46:18.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:46:18.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:46:18.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:46:18.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:46:18.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:46:18.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:46:18.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:46:18.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:46:18.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:46:18.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:46:18.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:46:18.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:46:18.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:46:18.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:46:18.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:46:18.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:46:18.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:46:18.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:46:14
2026-05-28T10:46:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68778, datetime.datetime(2026, 5, 28, 10, 46, 14), datetime.datetime(2026, 5, 28, 10, 46, 13), 'salt', 12.09, 33.36, None, 4.13, 334.95, 15.64, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:46:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:46:18.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:46:18.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:13, diff=5.787211s, valid=True
2026-05-28T10:46:18.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:46:18.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:46:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:12, diff=6.790042s, valid=True
2026-05-28T10:46:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:46:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:46:18.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:09, diff=9.796746s, valid=True
2026-05-28T10:46:18.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:46:18.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:46:18.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:46:18.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:46:18.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:46:18.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:46:18.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:12, diff=6.799788s, valid=True
2026-05-28T10:46:18.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:46:18.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:46:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:46:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890620.800452s, valid=True
2026-05-28T10:46:18.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:46:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:46:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:46:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:46:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:46:18.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:46:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:46:18.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:46:18.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:46:18.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:46:18.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:46:19.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:46:19.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:46:19.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:46:19.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:46:19.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:46:19.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:46:19.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:46:19.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-28T10:46:19.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-28T10:46:19.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:46:19.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:46:49.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:46:49.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:46:49.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:46:49.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:46:49.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:46:50.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:46:50.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-28T10:46:50.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:46:50.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-28T10:46:50.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:46:50.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:46:50.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:46:50.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-28T10:46:52.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-28T10:46:52.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:46:52.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:46:52.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:46:52.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:46:52.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:46:52.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:46:52.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:46:52.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:46:52.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:46:52.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:46:52.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:46:52.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:46:52.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:46:52.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:46:52.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:46:52.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:46:52.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:46:52.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:46:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:46:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:46:52.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:46:52.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:46:52.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:46:53.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:46:44
2026-05-28T10:46:53.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68779, datetime.datetime(2026, 5, 28, 10, 46, 44), datetime.datetime(2026, 5, 28, 10, 46, 43), 'salt', 11.89, 32.97, None, 5.4, 312.75, 15.77, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:46:53.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:46:53.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:46:53.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:43, diff=10.061445s, valid=True
2026-05-28T10:46:53.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:46:53.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:46:53.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:12, diff=-18.934787s, valid=True
2026-05-28T10:46:53.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:46:53.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:46:40, diff=13.074238s, valid=True
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:46:53.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:46:53.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:46:53.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:12, diff=-18.921532s, valid=True
2026-05-28T10:46:53.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:46:53.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:46:53.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:46:53.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890655.07957s, valid=True
2026-05-28T10:46:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:46:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:46:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:46:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:46:53.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:46:53.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:46:53.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:46:53.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:46:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:46:53.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:46:53.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:46:53.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:46:53.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:46:53.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:46:53.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:46:54.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:46:54.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:46:54.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:46:54.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-28T10:46:54.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-28T10:46:54.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:46:54.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:47:24.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:47:24.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:47:24.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:47:24.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:47:24.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:47:24.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:47:24.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:47:24.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:47:24.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-28T10:47:24.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:47:24.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:47:24.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:47:24.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-28T10:47:27.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:47:27.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:47:27.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:47:27.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:47:27.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:47:27.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:47:27.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:47:27.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:47:27.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:47:27.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:47:27.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:47:27.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:47:27.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:47:27.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:47:27.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:47:27.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:47:27.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:47:27.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:47:27.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:47:27.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:47:27.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:47:27.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:47:27.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:47:27.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:47:28.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:47:14
2026-05-28T10:47:28.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68780, datetime.datetime(2026, 5, 28, 10, 47, 14), datetime.datetime(2026, 5, 28, 10, 47, 14), 'salt', 11.95, 33.7, None, 7.62, 262.8, 15.48, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:47:28.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:47:28.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:47:28.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:14, diff=14.058058s, valid=True
2026-05-28T10:47:28.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:47:28.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:47:28.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:12, diff=16.060919s, valid=True
2026-05-28T10:47:28.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:47:28.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:12, diff=16.067587s, valid=True
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:47:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:47:28.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:47:28.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:12, diff=16.070633s, valid=True
2026-05-28T10:47:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:47:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:47:28.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:47:28.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890690.071299s, valid=True
2026-05-28T10:47:28.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:47:28.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:47:28.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:47:28.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:47:28.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:47:28.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:47:28.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:47:28.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:47:28.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:47:28.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:47:28.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:47:28.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:47:28.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:47:28.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:47:28.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:47:28.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:47:29.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:47:29.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:47:29.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-28T10:47:29.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-28T10:47:29.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:47:29.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:47:59.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:47:59.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:47:59.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:47:59.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:47:59.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:48:00.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:48:00.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-28T10:48:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:48:00.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:48:00.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:48:00.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:48:00.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:48:00.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-28T10:48: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-28T10:48:02.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:48:02.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:48:02.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:48:02.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:48:02.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:48:02.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:48:02.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:48:02.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:48:02.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:48:02.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:48:02.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:48:02.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:48:02.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:48:02.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:48:02.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:48:02.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:48:02.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:48:02.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:48:02.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:48:02.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:48:02.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:48:02.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:48:03.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:48:03.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:47:44
2026-05-28T10:48:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68781, datetime.datetime(2026, 5, 28, 10, 47, 44), datetime.datetime(2026, 5, 28, 10, 47, 44), 'salt', 11.95, 33.63, None, 8.29, 274.36, 15.51, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:48:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:48:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:48:03.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:44, diff=19.061711s, valid=True
2026-05-28T10:48:03.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:48:03.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:48:03.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:12, diff=-8.935419s, valid=True
2026-05-28T10:48:03.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:48:03.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:47:43, diff=20.071252s, valid=True
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:48:03.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:48:03.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:12, diff=-8.925692s, valid=True
2026-05-28T10:48:03.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:48:03.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:48:03.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:48:03.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890725.074977s, valid=True
2026-05-28T10:48:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:48:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:48:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:48:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:48:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:48:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:48:03.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:48:03.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:48:03.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:48:03.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:48:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:48:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:48:03.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:48:03.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:48:03.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:48:03.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:48:04.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:48:04.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:48:04.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-28T10:48:04.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-28T10:48:04.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:48:04.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:48:34.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:48:34.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:48:34.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:48:34.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:48:34.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:48:34.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:48:34.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:48:34.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:48:34.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-28T10:48:34.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:48:34.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:48:34.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:48:34.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-28T10:48:37.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-28T10:48:37.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:48:37.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:48:37.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:48:37.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:48:37.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:48:37.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:48:37.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:48:37.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:48:37.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:48:37.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:48:37.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:48:37.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:48:37.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:48:37.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:48:37.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:48:37.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:48:37.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:48:37.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:48:37.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:48:37.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:48:37.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:48:37.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:48:37.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:48:37.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:48:14
2026-05-28T10:48:37.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68782, datetime.datetime(2026, 5, 28, 10, 48, 14), datetime.datetime(2026, 5, 28, 10, 48, 14), 'salt', 11.95, 31.41, None, 4.98, 284.43, 16.42, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:48:37.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:48:37.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:48:37.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:14, diff=23.704553s, valid=True
2026-05-28T10:48:37.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:48:37.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:48:37.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:12, diff=25.707403s, valid=True
2026-05-28T10:48:37.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:48:37.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:06, diff=31.714025s, valid=True
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:48:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:48:37.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:12, diff=25.717066s, valid=True
2026-05-28T10:48:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:48:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:48:37.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:48:37.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890759.717741s, valid=True
2026-05-28T10:48:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:48:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:48:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:48:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:48:37.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:48:37.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:48:37.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:48:37.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:48:37.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:48:37.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:48:37.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:48:37.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:48:37.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:48:38.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:48:38.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:48:38.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:48:38.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:48:38.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:48:38.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-28T10:48:38.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-28T10:48:38.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:48:38.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:49:08.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:49:08.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:49:08.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:49:09.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:49:09.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:49:09.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:49:09.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-28T10:49:09.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:49:09.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-28T10:49:09.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:49:09.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:49:09.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:49:09.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-28T10:49:12.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-28T10:49:12.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:49:12.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:49:12.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:49:12.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:49:12.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:49:12.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:49:12.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:49:12.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:49:12.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:49:12.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:49:12.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:49:12.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:49:12.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:49:12.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:49:12.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:49:12.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:49:12.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:49:12.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:49:12.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:49:12.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:49:12.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:49:12.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:49:12.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:49:12.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:48:45
2026-05-28T10:49:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68783, datetime.datetime(2026, 5, 28, 10, 48, 45), datetime.datetime(2026, 5, 28, 10, 48, 44), 'salt', 11.99, 33.7, None, 6.88, 291.42, 15.49, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:49:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:49:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:49:12.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:44, diff=28.392794s, valid=True
2026-05-28T10:49:12.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:49:12.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:49:12.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:49:12, diff=0.395686s, valid=True
2026-05-28T10:49:12.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:49:12.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:48:36, diff=36.402461s, valid=True
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:49:12.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:49:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:49:12, diff=0.40556s, valid=True
2026-05-28T10:49:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:49:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:49:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:49:12.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890794.406232s, valid=True
2026-05-28T10:49:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:49:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:49:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:49:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:49:12.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:49:12.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:49:12.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:49:12.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:49:12.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:49:12.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:49:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:49:12.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:49:12.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:49:12.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:49:12.944 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:49:13.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:49:13.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:49:13.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:49:13.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-28T10:49:13.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-28T10:49:13.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:49:13.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:49:43.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:49:43.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:49:43.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:49:43.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:49:43.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:49:43.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:49:43.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-28T10:49:43.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:49:43.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-28T10:49:43.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:49:43.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:49:43.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:49:43.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-28T10:49:46.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-28T10:49:46.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:49:46.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:49:46.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:49:46.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:49:46.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:49:46.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:49:46.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:49:46.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:49:46.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:49:46.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:49:46.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:49:46.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:49:46.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:49:46.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:49:46.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:49:46.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:49:46.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:49:46.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:49:46.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:49:46.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:49:46.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:49:46.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:49:46.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:49:46.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:49:45
2026-05-28T10:49:46.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68785, datetime.datetime(2026, 5, 28, 10, 49, 45), datetime.datetime(2026, 5, 28, 10, 49, 45), 'salt', 11.89, 30.48, None, 7.31, 292.64, 16.82, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:49:46.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:49:46.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:49:46.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:49:45, diff=1.572446s, valid=True
2026-05-28T10:49:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:49:46.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:49:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:12, diff=-25.424744s, valid=True
2026-05-28T10:49:46.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:49:46.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:49:46.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:49:38, diff=8.581831s, valid=True
2026-05-28T10:49:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:49:46.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:49:46.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:49:46.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:49:46.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:49:46.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:49:46.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:12, diff=-25.41491s, valid=True
2026-05-28T10:49:46.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:49:46.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:49:46.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:49:46.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890828.586053s, valid=True
2026-05-28T10:49:46.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:49:46.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:49:46.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:49:46.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:49:46.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:49:46.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:49:46.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:49:46.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:49:46.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:49:46.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:49:46.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:49:46.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:49:46.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:49:46.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:49:47.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:49:47.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:49:47.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:49:47.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:49: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-28T10:49: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-28T10:49:47.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:49:47.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:50:17.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:50:17.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:50:17.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:50:17.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:50:17.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:50:18.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:50:18.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-28T10:50:18.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:50:18.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-28T10:50:18.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:50:18.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:50:18.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:50:18.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:50:20.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-28T10:50:20.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:50:20.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:50:20.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:50:20.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:50:20.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:50:20.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:50:20.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:50:20.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:50:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:50:20.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:50:20.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:50:20.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:50:20.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:50:20.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:50:20.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:50:20.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:50:20.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:50:20.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:50:20.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:50:20.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:50:20.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:50:20.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:50:20.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:50:20.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:50:15
2026-05-28T10:50:20.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68786, datetime.datetime(2026, 5, 28, 10, 50, 15), datetime.datetime(2026, 5, 28, 10, 50, 15), 'salt', 12.05, 31.24, None, 5.23, 298.29, 16.5, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:50:20.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:50:20.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:50:20.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:15, diff=5.837045s, valid=True
2026-05-28T10:50:20.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:50:20.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:50:20.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:12, diff=8.839913s, valid=True
2026-05-28T10:50:20.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:50:20.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:50:20.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:10, diff=10.846643s, valid=True
2026-05-28T10:50:20.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:50:20.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:50:20.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:50:20.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:50:20.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:50:20.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:50:20.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:12, diff=8.849668s, valid=True
2026-05-28T10:50:20.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:50:20.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:50:20.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:50:20.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890862.850322s, valid=True
2026-05-28T10:50:20.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:50:20.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:50:20.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:50:20.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:50:20.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:50:20.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:50:20.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:50:20.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:50:20.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:50:20.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:50:21.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:50:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:50:21.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:50:21.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:50:21.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:50:21.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:50:21.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:50:21.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:50:21.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-28T10:50:21.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-28T10:50:22.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:50:22.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:50:52.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:50:52.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:50:52.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:50:52.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:50:52.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:50:52.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:50:52.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-28T10:50:52.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:50:52.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-28T10:50:52.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:50:52.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:50:52.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:50:52.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-28T10:50:55.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-28T10:50:55.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:50:55.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:50:55.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:50:55.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:50:55.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:50:55.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:50:55.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:50:55.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:50:55.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:50:55.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:50:55.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:50:55.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:50:55.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:50:55.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:50:55.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:50:55.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:50:55.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:50:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:50:55.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:50:55.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:50:55.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:50:55.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:50:55.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:50:55.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:50:46
2026-05-28T10:50:55.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68787, datetime.datetime(2026, 5, 28, 10, 50, 46), datetime.datetime(2026, 5, 28, 10, 50, 45), 'salt', 11.95, 30.25, None, 4.24, 297.12, 16.92, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:50:55.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:50:55.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:50:55.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:45, diff=10.512668s, valid=True
2026-05-28T10:50:55.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:50:55.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:50:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:12, diff=-16.484523s, valid=True
2026-05-28T10:50:55.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:50:55.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:50:41, diff=14.52226s, valid=True
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:50:55.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:50:55.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:12, diff=-16.474735s, valid=True
2026-05-28T10:50:55.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:50:55.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:50:55.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:50:55.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890897.525927s, valid=True
2026-05-28T10:50:55.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:50:55.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:50:55.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:50:55.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:50:55.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:50:55.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:50:55.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:50:55.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:50:55.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:50:55.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:50:55.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:50:55.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:50:55.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:50:55.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:50:56.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:50:56.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:50:56.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:50:56.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:50:56.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:50:56.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:50:56.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:50:56.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:51:26.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:51:26.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:51:26.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:51:27.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:51:27.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:51:27.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:51:27.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-28T10:51:27.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:51:27.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-28T10:51:27.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:51:27.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:51:27.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:51:27.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-28T10:51:30.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-28T10:51:30.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:51:30.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:51:30.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:51:30.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:51:30.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:51:30.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:51:30.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:51:30.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:51:30.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:51:30.332 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:51:30.332 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:51:30.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:51:30.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:51:30.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:51:30.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:51:30.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:51:30.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:51:30.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:51:30.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:51:30.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:51:30.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:51:30.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:51:30.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:51:30.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:51:16
2026-05-28T10:51:30.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68788, datetime.datetime(2026, 5, 28, 10, 51, 16), datetime.datetime(2026, 5, 28, 10, 51, 15), 'salt', 11.98, 32.8, None, 3.14, 293.64, 15.85, 830.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:51:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:51:30.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:51:30.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:15, diff=15.64492s, valid=True
2026-05-28T10:51:30.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:51:30.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:51:30.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:12, diff=18.647776s, valid=True
2026-05-28T10:51:30.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:51:30.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:13, diff=17.654527s, valid=True
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:51:30.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:51:30.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:12, diff=18.657631s, valid=True
2026-05-28T10:51:30.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:51:30.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:51:30.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:51:30.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890932.658286s, valid=True
2026-05-28T10:51:30.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:51:30.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:51:30.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:51:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:51:30.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:51:30.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:51:30.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:51:30.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:51:30.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:51:30.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:51:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:51:30.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:51:30.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:51:30.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:51:31.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:51:31.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:51:31.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:51:31.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:51:31.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-28T10:51:31.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-28T10:51:31.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:51:31.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:52:01.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:52:01.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:52:01.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:52:02.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:52:02.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:52:02.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:52:02.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-28T10:52:02.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:52:02.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-28T10:52:02.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:52:02.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:52:02.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:52:02.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-28T10:52:04.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-28T10:52:04.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:52:04.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:52:04.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:52:04.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:52:04.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:52:04.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:52:04.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:52:04.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:52:04.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:52:04.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:52:04.894 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:52:04.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:52:04.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:52:04.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:52:05.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:52:05.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:52:05.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:52:05.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:52:05.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:52:05.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:52:05.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:52:05.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:52:05.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:52:05.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:51:46
2026-05-28T10:52:05.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68789, datetime.datetime(2026, 5, 28, 10, 51, 46), datetime.datetime(2026, 5, 28, 10, 51, 46), 'salt', 12.02, 32.53, None, 6.57, 239.47, 15.96, 830.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:52:05.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:52:05.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:52:05.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:46, diff=19.215637s, valid=True
2026-05-28T10:52:05.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:52:05.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:52:05.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:12, diff=-6.781506s, valid=True
2026-05-28T10:52:05.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:52:05.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:51:44, diff=21.225231s, valid=True
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:52:05.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:52:05.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:12, diff=-6.771709s, valid=True
2026-05-28T10:52:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:52:05.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:52:05.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:52:05.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=890967.228967s, valid=True
2026-05-28T10:52:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:52:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:52:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:52:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:52:05.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:52:05.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:52:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:52:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:52:05.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:52:05.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:52:05.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:52:05.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:52:05.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:52:05.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:52:05.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:52:06.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:52:06.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:52:06.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:52:06.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-28T10:52:06.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-28T10:52:06.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:52:06.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:52:36.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:52:36.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:52:36.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:52:36.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:52:36.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:52:36.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:52:36.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:52:36.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:52:36.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-28T10:52:36.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:52:36.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:52:36.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:52:36.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-28T10:52:39.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-28T10:52:39.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:52:39.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:52:39.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:52:39.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:52:39.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:52:39.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:52:39.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:52:39.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:52:39.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:52:39.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:52:39.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:52:39.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:52:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:52:39.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:52:39.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:52:39.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:52:39.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:52:39.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:52:39.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:52:39.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:52:39.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:52:39.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:52:39.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:52:39.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:52:16
2026-05-28T10:52:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68790, datetime.datetime(2026, 5, 28, 10, 52, 16), datetime.datetime(2026, 5, 28, 10, 52, 16), 'salt', 11.98, 32.34, None, 7.17, 238.98, 16.04, 830.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:52:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:52:39.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:52:39.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:16, diff=23.602055s, valid=True
2026-05-28T10:52:39.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:52:39.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:52:39.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:12, diff=27.604886s, valid=True
2026-05-28T10:52:39.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:52:39.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:16, diff=23.611503s, valid=True
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:52:39.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:52:39.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:12, diff=27.614558s, valid=True
2026-05-28T10:52:39.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:52:39.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:52:39.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:52:39.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891001.61522s, valid=True
2026-05-28T10:52:39.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:52:39.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:52:39.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:52:39.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:52:39.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:52:39.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:52:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:52:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:52:39.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:52:39.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:52:39.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:52:39.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:52:39.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:52:39.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:52:40.164 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:52:40.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:52:40.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:52:40.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:52:40.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T10:52:40.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:52:40.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:52:40.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:53:10.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:53:10.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:53:10.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:53:11.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:53:11.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:53:11.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:53:11.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-28T10:53:11.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:53:11.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:53:11.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:53:11.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:53:11.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:53:11.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T10:53:13.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-28T10:53:13.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:53:13.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:53:13.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:53:13.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:53:13.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:53:13.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:53:13.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:53:13.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:53:13.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:53:13.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:53:13.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:53:13.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:53:13.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:53:13.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:53:14.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:53:14.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:53:14.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:53:14.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:53:14.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:53:14.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:53:14.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:53:14.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:53:14.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:53:14.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:52:46
2026-05-28T10:53:14.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68791, datetime.datetime(2026, 5, 28, 10, 52, 46), datetime.datetime(2026, 5, 28, 10, 52, 46), 'salt', 11.75, 32.34, None, 5.4, 251.57, 16.01, 830.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:53:14.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:53:14.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:53:14.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:46, diff=28.216828s, valid=True
2026-05-28T10:53:14.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:53:14.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:53:14.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:53:12, diff=2.219636s, valid=True
2026-05-28T10:53:14.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:53:14.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:52:38, diff=36.226228s, valid=True
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:53:14.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:53:14.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:53:12, diff=2.229243s, valid=True
2026-05-28T10:53:14.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:53:14.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:53:14.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:53:14.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891036.229903s, valid=True
2026-05-28T10:53:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:53:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:53:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:53:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:53:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:53:14.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:53:14.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:53:14.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:53:14.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:53:14.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:53:14.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:53:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:53:14.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:53:14.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:53:14.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:53:15.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:53:15.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:53:15.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:53:15.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-28T10:53:15.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-28T10:53:15.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:53:15.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:53:45.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:53:45.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:53:45.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:53:45.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:53:45.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:53:45.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:53:45.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T10:53:45.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:53:45.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-28T10:53:45.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:53:45.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:53:45.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:53:45.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-28T10:53:48.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:53:48.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:53:48.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:53:48.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:53:48.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:53:48.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:53:48.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:53:48.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:53:48.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:53:48.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:53:48.588 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:53:48.588 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:53:48.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:53:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:53:48.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:53:48.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:53:48.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:53:48.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:53:48.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:53:48.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:53:48.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:53:48.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:53:48.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:53:48.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:53:48.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:53:47
2026-05-28T10:53:48.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68793, datetime.datetime(2026, 5, 28, 10, 53, 47), datetime.datetime(2026, 5, 28, 10, 53, 47), 'salt', 11.78, 32.6, None, 6.32, 238.36, 15.9, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:53:48.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:53:48.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:53:48.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:53:47, diff=1.914593s, valid=True
2026-05-28T10:53:48.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:53:48.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:53:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:12, diff=-23.08262s, valid=True
2026-05-28T10:53:48.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:53:48.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:53:40, diff=8.92401s, valid=True
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:53:48.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:53:48.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:12, diff=-23.073044s, valid=True
2026-05-28T10:53:48.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:53:48.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:53:48.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:53:48.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891070.927602s, valid=True
2026-05-28T10:53:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:53:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:53:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:53:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:53:48.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:53:48.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:53:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:53:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:53:49.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:53:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:53:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:53:49.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:53:49.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:53:49.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:53:49.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:53:49.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:53:49.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:53:49.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:53:49.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-28T10:53:49.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-28T10:53:50.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:53:50.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:54:20.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:54:20.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:54:20.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:54:20.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:54:20.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:54:20.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:54:20.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-28T10:54:20.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:54:20.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-28T10:54:20.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:54:20.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:54:20.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:54:20.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-28T10:54:23.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-28T10:54:23.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:54:23.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:54:23.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:54:23.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:54:23.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:54:23.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:54:23.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:54:23.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:54:23.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:54:23.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:54:23.061 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:54:23.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:54:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:54:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:54:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:54:23.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:54:23.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:54:23.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:54:23.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:54:23.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:54:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:54:23.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:54:23.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:54:23.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:54:17
2026-05-28T10:54:23.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68794, datetime.datetime(2026, 5, 28, 10, 54, 17), datetime.datetime(2026, 5, 28, 10, 54, 17), 'salt', 11.82, 33.89, None, 5.47, 240.17, 15.39, 830.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:54:23.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:54:23.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:54:23.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:17, diff=6.389827s, valid=True
2026-05-28T10:54:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:54:23.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:54:23.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:12, diff=11.392646s, valid=True
2026-05-28T10:54:23.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:54:23.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:11, diff=12.39913s, valid=True
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:54:23.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:54:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:12, diff=11.402109s, valid=True
2026-05-28T10:54:23.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:54:23.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:54:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:54:23.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891105.402768s, valid=True
2026-05-28T10:54:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:54:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:54:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:54:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:54:23.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:54:23.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:54:23.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:54:23.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:54:23.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:54:23.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:54:23.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:54:23.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:54:23.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:54:23.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:54:23.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:54:24.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:54:24.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:54:24.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:54:24.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-28T10:54:24.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-28T10:54:26.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:54:26.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:54:56.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:54:56.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:54:56.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:54:57.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:54:57.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:54:57.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:54:57.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-28T10:54:57.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:54:57.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-28T10:54:57.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:54:57.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:54:57.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:54:57.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-28T10:54:59.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:54:59.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:54:59.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:54:59.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:54:59.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:54:59.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:54:59.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:54:59.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:54:59.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:54:59.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:54:59.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:54:59.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:54:59.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:55:00.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:55:00.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:55:00.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:55:00.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:55:00.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:55:00.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:55:00.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:55:00.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:55:00.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:55:00.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:55:00.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:55:00.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:54:47
2026-05-28T10:55:00.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68795, datetime.datetime(2026, 5, 28, 10, 54, 47), datetime.datetime(2026, 5, 28, 10, 54, 47), 'salt', 11.95, 32.96, None, 9.04, 267.83, 15.78, 830.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:55:00.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:55:00.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:55:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:47, diff=13.317366s, valid=True
2026-05-28T10:55:00.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:55:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:55:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:12, diff=-11.679786s, valid=True
2026-05-28T10:55:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:55:00.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:55:00.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:54:42, diff=18.326894s, valid=True
2026-05-28T10:55:00.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:55:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:55:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:55:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:55:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:55:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:55:00.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:12, diff=-11.670055s, valid=True
2026-05-28T10:55:00.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:55:00.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:55:00.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:55:00.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891142.330586s, valid=True
2026-05-28T10:55:00.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:55:00.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:55:00.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:55:00.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:55:00.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:55:00.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:55:00.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:55:00.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:55:00.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:55:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:55:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:55:00.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:55:00.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:55:00.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:55:00.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:55:01.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:55:01.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:55:01.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:55:01.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-28T10:55:01.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-28T10:55:01.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:55:01.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:55:31.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:55:31.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:55:31.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:55:31.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:55:31.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:55:32.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:55:32.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-28T10:55:32.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:55:32.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-28T10:55:32.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:55:32.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:55:32.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:55:32.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-28T10:55:34.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:55:34.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:55:34.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:55:34.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:55:34.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:55:34.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:55:34.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:55:34.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:55:34.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:55:34.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:55:34.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:55:34.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:55:34.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:55:34.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:55:34.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:55:34.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:55:34.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:55:34.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:55:34.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:55:34.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:55:34.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:55:34.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:55:34.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:55:34.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:55:35.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:55:18
2026-05-28T10:55:35.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68796, datetime.datetime(2026, 5, 28, 10, 55, 18), datetime.datetime(2026, 5, 28, 10, 55, 17), 'salt', 11.95, 30.48, None, 8.15, 243.81, 16.82, 830.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:55:35.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:55:35.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:55:35.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:17, diff=18.048613s, valid=True
2026-05-28T10:55:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:55:35.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:55:35.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:12, diff=23.051435s, valid=True
2026-05-28T10:55:35.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:55:35.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:14, diff=21.058142s, valid=True
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:55:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:55:35.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:12, diff=23.061145s, valid=True
2026-05-28T10:55:35.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:55:35.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:55:35.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:55:35.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891177.061813s, valid=True
2026-05-28T10:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:55:35.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:55:35.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:55:35.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:55:35.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:55:35.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:55:35.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:55:35.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:55:35.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:55:35.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:55:35.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:55:35.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:55:35.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:55:36.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:55:36.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:55:36.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-28T10:55:36.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-28T10:55:36.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:55:36.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:56:06.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:56:06.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:56:06.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:56:06.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:56:06.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:56:06.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:56:06.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-28T10:56:06.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:56:06.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-28T10:56:06.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:56:06.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:56:06.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:56:06.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-28T10:56:09.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-28T10:56:09.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:56:09.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:56:09.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:56:09.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:56:09.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:56:09.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:56:09.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:56:09.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:56:09.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:56:09.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:56:09.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:56:09.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:56:09.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:56:09.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:56:09.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:56:09.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:56:09.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:56:09.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:56:09.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:56:09.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:56:09.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:56:09.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:56:09.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:56:09.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:55:48
2026-05-28T10:56:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68797, datetime.datetime(2026, 5, 28, 10, 55, 48), datetime.datetime(2026, 5, 28, 10, 55, 47), 'salt', 12.02, 30.05, None, 7.69, 235.01, 17.02, 830.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:56:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:56:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:56:09.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:47, diff=22.595554s, valid=True
2026-05-28T10:56:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:56:09.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:56:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:12, diff=-2.401573s, valid=True
2026-05-28T10:56:09.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:56:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:55:45, diff=24.60507s, valid=True
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:56:09.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:56:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:12, diff=-2.391947s, valid=True
2026-05-28T10:56:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:56:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:56:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:56:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891211.608699s, valid=True
2026-05-28T10:56:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:56:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:56:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:56:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:56:09.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:56:09.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:56:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:56:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:56:09.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:56:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:56:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:56:09.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:56:09.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:56:10.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:56:10.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:56:10.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:56:10.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:56:10.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:56:10.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-28T10:56:10.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-28T10:56:10.942 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:56:10.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:56:40.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:56:40.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:56:40.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:56:41.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:56:41.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:56:41.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:56:41.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-28T10:56:41.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:56:41.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-28T10:56:41.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:56:41.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:56:41.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:56:41.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-28T10:56:43.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:56:43.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:56:43.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:56:43.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:56:43.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:56:43.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:56:43.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:56:43.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:56:43.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:56:43.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:56:43.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:56:43.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:56:43.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:56:43.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:56:43.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:56:43.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:56:43.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:56:43.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:56:43.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:56:44.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:56:44.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:56:44.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:56:44.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:56:44.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:56:44.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:56:18
2026-05-28T10:56:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68798, datetime.datetime(2026, 5, 28, 10, 56, 18), datetime.datetime(2026, 5, 28, 10, 56, 18), 'salt', 11.98, 29.25, None, 7.62, 239.35, 17.36, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:56:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:56:44.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:56:44.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:18, diff=26.112309s, valid=True
2026-05-28T10:56:44.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:56:44.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:56:44.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:12, diff=32.115202s, valid=True
2026-05-28T10:56:44.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:56:44.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:56:44.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:17, diff=27.121848s, valid=True
2026-05-28T10:56:44.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:56:44.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:56:44.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:56:44.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:56:44.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:56:44.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:56:44.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:12, diff=32.124891s, valid=True
2026-05-28T10:56:44.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:56:44.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:56:44.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:56:44.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891246.125538s, valid=True
2026-05-28T10:56:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:56:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:56:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:56:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:56:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:56:44.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:56:44.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:56:44.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:56:44.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:56:44.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:56:44.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:56:44.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:56:44.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:56:44.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:56:44.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:56:45.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:56:45.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:56:45.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:56:45.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-28T10:56:45.121 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T10:56:45.188 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:56:45.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:57:15.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:57:15.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:57:15.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:57:15.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:57:15.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:57:15.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:57:15.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-28T10:57:15.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:57:15.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-28T10:57:15.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:57:15.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:57:15.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:57:15.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-28T10:57:17.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-28T10:57:17.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:57:17.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:57:17.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:57:17.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:57:17.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:57:18.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:57:18.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:57:18.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:57:18.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:57:18.006 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:57:18.006 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:57:18.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:57:18.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:57:18.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:57:18.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:57:18.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:57:18.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:57:18.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:57:18.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:57:18.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:57:18.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:57:18.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:57:18.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:57:18.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:56:48
2026-05-28T10:57:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68799, datetime.datetime(2026, 5, 28, 10, 56, 48), datetime.datetime(2026, 5, 28, 10, 56, 48), 'salt', 11.98, 27.82, None, 6.74, 253.49, 18.02, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:57:18.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:57:18.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:57:18.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:48, diff=30.32941s, valid=True
2026-05-28T10:57:18.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:57:18.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:57:18.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:57:12, diff=6.332285s, valid=True
2026-05-28T10:57:18.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:57:18.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:56:48, diff=30.339081s, valid=True
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:57:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:57:18.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:57:12, diff=6.342179s, valid=True
2026-05-28T10:57:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:57:18.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:57:18.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:57:18.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891280.342861s, valid=True
2026-05-28T10:57:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:57:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:57:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:57:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:57:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:57:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:57:18.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:57:18.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:57:18.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:57:18.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:57:18.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:57:18.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:57:18.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:57:18.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:57:18.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:57:19.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:57:19.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:57:19.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:57:19.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-28T10:57:19.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-28T10:57:19.463 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:57:19.463 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:57:49.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:57:49.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:57:49.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:57:49.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:57:49.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:57:49.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:57:49.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-28T10:57:49.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:57:49.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-28T10:57:49.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:57:49.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:57:49.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:57:49.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-28T10:57: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-28T10:57:52.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:57:52.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:57:52.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:57:52.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:57:52.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:57:52.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:57:52.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:57:52.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:57:52.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:57:52.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:57:52.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:57:52.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:57:52.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T10:57:52.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:57:52.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T10:57:52.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:57:52.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:57:52.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:57:52.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T10:57:52.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:57:52.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:57:52.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:57:52.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:57:52.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:57:49
2026-05-28T10:57:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68801, datetime.datetime(2026, 5, 28, 10, 57, 49), datetime.datetime(2026, 5, 28, 10, 57, 48), 'salt', 11.98, 26.56, None, 5.82, 242.67, 18.63, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:57:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:57:52.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T10:57:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:57:48, diff=4.921218s, valid=True
2026-05-28T10:57:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:57:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:57:52.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:12, diff=-19.075883s, valid=True
2026-05-28T10:57:52.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:57:52.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T10:57:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:57:41, diff=11.930828s, valid=True
2026-05-28T10:57:52.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:57:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:57:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:57:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:57:52.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:57:52.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T10:57:52.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:12, diff=-19.06616s, valid=True
2026-05-28T10:57:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:57:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:57:52.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:57:52.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891314.934503s, valid=True
2026-05-28T10:57:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:57:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:57:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:57:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:57:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:57:52.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:57:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:57:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:57:53.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:57:53.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:57:53.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:57:53.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:57:53.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:57:53.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:57:53.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:57:53.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:57:53.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:57:53.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:57:53.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-28T10:57:53.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-28T10:57:54.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:57:54.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:58:24.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:58:24.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:58:24.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:58:24.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:58:24.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:58:24.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:58:24.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-28T10:58:24.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:58:24.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T10:58:24.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:58:24.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:58:24.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:58:24.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-28T10:58:27.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-28T10:58:27.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:58:27.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:58:27.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:58:27.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:58:27.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:58:27.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:58:27.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:58:27.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:58:27.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:58:27.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:58:27.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:58:27.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:58:27.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:58:27.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:58:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:58:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:58:27.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:58:27.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:58:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:58:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:58:27.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:58:27.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:58:27.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:58:27.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:58:19
2026-05-28T10:58:27.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68802, datetime.datetime(2026, 5, 28, 10, 58, 19), datetime.datetime(2026, 5, 28, 10, 58, 19), 'salt', 11.85, 26.66, None, 5.75, 250.68, 18.56, 830.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:58:27.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:58:27.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:58:27.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:19, diff=8.525801s, valid=True
2026-05-28T10:58:27.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:58:27.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:58:27.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:12, diff=15.528694s, valid=True
2026-05-28T10:58:27.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:58:27.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:58:27.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:12, diff=15.535367s, valid=True
2026-05-28T10:58:27.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:58:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:58:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:58:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:58:27.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:58:27.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:58:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:12, diff=15.53901s, valid=True
2026-05-28T10:58:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:58:27.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:58:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:58:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891349.539756s, valid=True
2026-05-28T10:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:58:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:58:27.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:58:27.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:58:27.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:58:27.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:58:27.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:58:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:58:27.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:58:27.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:58:27.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:58:28.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:58:28.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:58:28.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:58:28.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:58:28.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-28T10:58:28.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-28T10:58:28.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:58:28.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:58:58.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:58:58.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:58:58.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:58:59.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:58:59.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:58:59.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:58:59.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-28T10:58:59.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:58:59.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-28T10:58:59.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:58:59.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:58:59.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:58:59.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-28T10:59:02.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T10:59:02.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:59:02.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:59:02.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:59:02.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:59:02.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:59:02.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:59:02.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:59:02.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:59:02.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:59:02.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:59:02.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:59:02.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:59:02.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:59:02.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:59:02.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:59:02.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:59:02.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:59:02.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:59:02.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:59:02.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:59:02.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:59:02.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:59:02.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:59:02.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:58:49
2026-05-28T10:59:02.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68803, datetime.datetime(2026, 5, 28, 10, 58, 49), datetime.datetime(2026, 5, 28, 10, 58, 49), 'salt', 11.85, 28.06, None, 3.36, 223.34, 17.9, 830.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:59:02.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:59:02.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:59:02.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:49, diff=13.849332s, valid=True
2026-05-28T10:59:02.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:59:02.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:59:02.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:12, diff=-9.147567s, valid=True
2026-05-28T10:59:02.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:59:02.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:58:44, diff=18.859386s, valid=True
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:59:02.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:59:02.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:12, diff=-9.137532s, valid=True
2026-05-28T10:59:02.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:59:02.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:59:02.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:59:02.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891384.863138s, valid=True
2026-05-28T10:59:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:59:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:59:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:59:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:59:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:59:02.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:59:02.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:59:02.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:59:02.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:59:03.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:59:03.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:59:03.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:59:03.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:59:03.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:59:03.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:59:03.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:59:03.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:59:03.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:59:03.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-28T10:59:03.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-28T10:59:04.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:59:04.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T10:59:34.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T10:59:34.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T10:59:34.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T10:59:34.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T10:59:34.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T10:59:34.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T10:59:34.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-28T10:59:34.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T10:59:34.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-28T10:59:34.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T10:59:34.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T10:59:34.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T10:59:34.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-28T10:59:37.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-28T10:59:37.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T10:59:37.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T10:59:37.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T10:59:37.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T10:59:37.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T10:59:37.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T10:59:37.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T10:59:37.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T10:59:37.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T10:59:37.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T10:59:37.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T10:59:37.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T10:59:37.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T10:59:37.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T10:59:37.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T10:59:37.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:59:37.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:59:37.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T10:59:37.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T10:59:37.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T10:59:37.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T10:59:37.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T10:59:37.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T10:59:37.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:59:19
2026-05-28T10:59:37.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68804, datetime.datetime(2026, 5, 28, 10, 59, 19), datetime.datetime(2026, 5, 28, 10, 59, 19), 'salt', 12.02, 28.65, None, 3.07, 243.49, 17.65, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T10:59:37.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T10:59:37.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T10:59:37.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:19, diff=18.55313s, valid=True
2026-05-28T10:59:37.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T10:59:37.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:59:37.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:12, diff=25.555931s, valid=True
2026-05-28T10:59:37.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T10:59:37.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:15, diff=22.562561s, valid=True
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T10:59:37.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T10:59:37.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T10:59:37.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:12, diff=25.565541s, valid=True
2026-05-28T10:59:37.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T10:59:37.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T10:59:37.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T10:59:37.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891419.566208s, valid=True
2026-05-28T10:59:37.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T10:59:37.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T10:59:37.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T10:59:37.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T10:59:37.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T10:59:37.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T10:59:37.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T10:59:37.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T10:59:37.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T10:59:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T10:59:37.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T10:59:37.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T10:59:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T10:59:37.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T10:59:38.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:59:38.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T10:59:38.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T10:59:38.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T10:59:38.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-28T10:59:38.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-28T10:59:38.805 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T10:59:38.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:00:08.807 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:00:08.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:00:08.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:00:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:00:09.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:00:09.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:00:09.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-28T11:00:09.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:00:09.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-28T11:00:09.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:00:09.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:00:09.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:00:09.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-28T11:00:12.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-28T11:00:12.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:00:12.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:00:12.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:00:12.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:00:12.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:00:12.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:00:12.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:00:12.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:00:12.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:00:12.119 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:00:12.119 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:00:12.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:00:12.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:00:12.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:00:12.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:00:12.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:00:12.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:00:12.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:00:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:00:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:00:12.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:00:12.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:00:12.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:00:12.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 10:59:50
2026-05-28T11:00:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68805, datetime.datetime(2026, 5, 28, 10, 59, 50), datetime.datetime(2026, 5, 28, 10, 59, 49), 'salt', 12.11, 28.82, None, 2.61, 239.46, 17.58, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:00:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:00:12.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:00:12.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:49, diff=23.44032s, valid=True
2026-05-28T11:00:12.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:00:12.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:00:12.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:12, diff=0.443275s, valid=True
2026-05-28T11:00:12.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:00:12.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:00:12.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 10:59:47, diff=25.449905s, valid=True
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:00:12.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:00:12.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:12, diff=0.452872s, valid=True
2026-05-28T11:00:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:00:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:00:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:00:12.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891454.453527s, valid=True
2026-05-28T11:00:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:00:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:00:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:00:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:00:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:00:12.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:00:12.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:00:12.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:00:12.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:00:12.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:00:12.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:00:12.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:00:12.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:00:12.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:00:13.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:00:13.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:00:13.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:00:13.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:00:13.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-28T11:00:13.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-28T11:00:13.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:00:13.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:00:43.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:00:43.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:00:43.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:00:44.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:00:44.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:00:44.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:00:44.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-28T11:00:44.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:00:44.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-28T11:00:44.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:00:44.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:00:44.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:00:44.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-28T11:00:48.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-28T11:00:48.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:00:48.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:00:48.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:00:48.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:00:48.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:00:48.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:00:48.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:00:48.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:00:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:00:48.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:00:48.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:00:48.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:00:48.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:00:48.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:00:48.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:00:48.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:00:48.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:00:48.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:00:48.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:00:48.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:00:48.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:00:48.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:00:48.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:00:48.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:00:20
2026-05-28T11:00:48.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68806, datetime.datetime(2026, 5, 28, 11, 0, 20), datetime.datetime(2026, 5, 28, 11, 0, 20), 'salt', 12.15, 28.85, None, 4.38, 192.42, 17.57, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:00:48.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:00:48.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:00:48.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:20, diff=28.488476s, valid=True
2026-05-28T11:00:48.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:00:48.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:00:48.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:12, diff=36.491311s, valid=True
2026-05-28T11:00:48.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:00:48.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:18, diff=30.500021s, valid=True
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:00:48.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:00:48.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:00:12, diff=36.504559s, valid=True
2026-05-28T11:00:48.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:00:48.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:00:48.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:00:48.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891490.505238s, valid=True
2026-05-28T11:00:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:00:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:00:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:00:48.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:00:48.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:00:48.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:00:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:00:48.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:00:48.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:00:48.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:00:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:00:48.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:00:48.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:00:48.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:00:49.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:00:49.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:00:49.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:00:49.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:00:49.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-28T11:00:49.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-28T11:00:49.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:00:49.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:01:19.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:01:19.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:01:19.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:01:20.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:01:20.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:01:20.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:01:20.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-28T11:01:20.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:01:20.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-28T11:01:20.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:01:20.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:01:20.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:01:20.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-28T11:01:22.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:01:22.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:01:22.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:01:22.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:01:22.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:01:22.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:01:22.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:01:22.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:01:22.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:01:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:01:22.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:01:22.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:01:22.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:01:22.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:01:22.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:01:22.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:01:22.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:01:23.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:01:23.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:01:23.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:01:23.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:01:23.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:01:23.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:01:23.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:01:23.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:01:20
2026-05-28T11:01:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68808, datetime.datetime(2026, 5, 28, 11, 1, 20), datetime.datetime(2026, 5, 28, 11, 1, 20), 'salt', 12.15, 29.38, None, 4.2, 190.23, 17.33, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:01:23.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:01:23.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:01:23.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:20, diff=3.114018s, valid=True
2026-05-28T11:01:23.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:01:23.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:01:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:12, diff=11.116825s, valid=True
2026-05-28T11:01:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:01:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:13, diff=10.123586s, valid=True
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:01:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:01:23.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:01:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:12, diff=11.126611s, valid=True
2026-05-28T11:01:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:01:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:01:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:01:23.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891525.127276s, valid=True
2026-05-28T11:01:23.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:01:23.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:01:23.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:01:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:01:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:01:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:01:23.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:01:23.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:01:23.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:01:23.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:01:23.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:01:23.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:01:23.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:01:23.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:01:23.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:01:24.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:01:24.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:01:24.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:01:24.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:01:24.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:01:24.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:01:24.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:01:54.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:01:54.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:01:54.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:01:54.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:01:54.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:01:54.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:01:54.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-28T11:01:54.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:01:54.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-28T11:01:54.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:01:54.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:01:54.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:01:54.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-28T11:01:57.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-28T11:01:57.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:01:57.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:01:57.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:01:57.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:01:57.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:01:57.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:01:57.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:01:57.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:01:57.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:01:57.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:01:57.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:01:57.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:01:57.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:01:57.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:01:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:01:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:01:57.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:01:57.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:01:57.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:01:57.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:01:57.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:01:57.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:01:57.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:01:57.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:01:51
2026-05-28T11:01:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68809, datetime.datetime(2026, 5, 28, 11, 1, 51), datetime.datetime(2026, 5, 28, 11, 1, 50), 'salt', 12.31, 28.75, None, 3.04, 203.86, 17.63, 830.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:01:57.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:01:57.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:01:57.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:50, diff=7.684239s, valid=True
2026-05-28T11:01:57.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:01:57.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:01:57.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:12, diff=-14.312892s, valid=True
2026-05-28T11:01:57.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:01:57.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:01:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:01:43, diff=14.693826s, valid=True
2026-05-28T11:01:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:01:57.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:01:57.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:01:57.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:01:57.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:01:57.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:01:57.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:12, diff=-14.303164s, valid=True
2026-05-28T11:01:57.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:01:57.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:01:57.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:01:57.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891559.697498s, valid=True
2026-05-28T11:01:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:01:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:01:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:01:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:01:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:01:57.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:01:57.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:01:57.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:01:57.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:01:57.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:01:57.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:01:57.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:01:57.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:01:58.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:01:58.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:01:58.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:01:58.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:01:58.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:01:58.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-28T11:01:58.702 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:01:58.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:01:58.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:02:28.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:02:28.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:02:28.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:02:29.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:02:29.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:02:29.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:02:29.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-28T11:02:29.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:02:29.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-28T11:02:29.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:02:29.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:02:29.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:02:29.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-28T11:02:32.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-28T11:02:32.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:02:32.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:02:32.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:02:32.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:02:32.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:02:32.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:02:32.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:02:32.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:02:32.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:02:32.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:02:32.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:02:32.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:02:32.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:02:32.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:02:32.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:02:32.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:02:32.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:02:32.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:02:32.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:02:32.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:02:32.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:02:32.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:02:32.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:02:32.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:02:21
2026-05-28T11:02:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68810, datetime.datetime(2026, 5, 28, 11, 2, 21), datetime.datetime(2026, 5, 28, 11, 2, 20), 'salt', 12.31, 29.55, None, 6.18, 248.89, 17.27, 830.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:02:32.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:02:32.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:02:32.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:20, diff=12.763674s, valid=True
2026-05-28T11:02:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:02:32.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:02:32.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:12, diff=20.76652s, valid=True
2026-05-28T11:02:32.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:02:32.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:14, diff=18.773168s, valid=True
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:02:32.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:02:32.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:12, diff=20.776203s, valid=True
2026-05-28T11:02:32.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:02:32.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:02:32.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:02:32.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891594.776875s, valid=True
2026-05-28T11:02:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:02:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:02:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:02:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:02:32.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:02:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:02:32.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:02:32.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:02:32.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:02:32.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:02:33.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:02:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:02:33.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:02:33.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:02:33.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:02:33.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:02:33.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:02:33.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:02:33.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:02:33.825 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:02:33.892 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:02:33.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:03:03.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:03:03.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:03:03.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:03:04.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:03:04.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:03:04.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:03:04.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-28T11:03:04.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:03:04.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-28T11:03:04.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:03:04.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:03:04.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:03:04.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-28T11:03:07.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-28T11:03:07.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:03:07.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:03:07.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:03:07.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:03:07.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:03:07.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:03:07.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:03:07.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:03:07.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:03:07.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:03:07.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:03:07.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:03:07.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:03:07.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:03:07.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:03:07.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:03:07.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:03:07.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:03:07.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:03:07.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:03:07.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:03:07.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:03:07.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:03:07.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:02:51
2026-05-28T11:03:07.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68811, datetime.datetime(2026, 5, 28, 11, 2, 51), datetime.datetime(2026, 5, 28, 11, 2, 51), 'salt', 12.38, 30.51, None, 6.92, 239.01, 16.86, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:03:07.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:03:07.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:03:07.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:51, diff=16.632494s, valid=True
2026-05-28T11:03:07.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:03:07.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:03:07.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:12, diff=-4.364681s, valid=True
2026-05-28T11:03:07.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:03:07.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:02:45, diff=22.6421s, valid=True
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:03:07.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:03:07.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:12, diff=-4.35487s, valid=True
2026-05-28T11:03:07.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:03:07.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:03:07.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:03:07.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891629.645812s, valid=True
2026-05-28T11:03:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:03:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:03:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:03:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:03:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:03:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:03:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:03:07.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:03:07.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:03:07.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:03:07.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:03:07.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:03:07.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:03:07.968 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:03:08.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:03:08.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:03:08.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:03:08.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:03:08.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-28T11:03: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-28T11:03:08.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:03:08.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:03:38.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:03:38.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:03:38.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:03:39.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:03:39.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:03:39.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:03:39.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-28T11:03:39.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:03:39.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-28T11:03:39.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:03:39.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:03:39.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:03:39.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-28T11:03:42.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-28T11:03:42.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:03:42.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:03:42.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:03:42.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:03:42.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:03:42.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:03:42.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:03:42.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:03:42.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:03:42.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:03:42.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:03:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:03:42.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:03:42.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:03:42.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:03:42.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:03:42.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:03:42.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:03:42.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:03:42.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:03:42.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:03:42.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:03:42.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:03:42.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:03:21
2026-05-28T11:03:42.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68812, datetime.datetime(2026, 5, 28, 11, 3, 21), datetime.datetime(2026, 5, 28, 11, 3, 21), 'salt', 12.28, 30.11, None, 5.93, 258.83, 17.02, 830.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:03:42.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:03:42.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:03:42.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:21, diff=21.427225s, valid=True
2026-05-28T11:03:42.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:03:42.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:03:42.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:12, diff=30.430111s, valid=True
2026-05-28T11:03:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:03:42.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:03:42.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:16, diff=26.436743s, valid=True
2026-05-28T11:03:42.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:03:42.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:03:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:03:42.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:03:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:03:42.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:03:42.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:12, diff=30.439942s, valid=True
2026-05-28T11:03:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:03:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:03:42.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:03:42.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891664.44064s, valid=True
2026-05-28T11:03:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:03:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:03:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:03:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:03:42.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:03:42.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:03:42.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:03:42.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:03:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:03:42.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:03:42.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:03:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:03:42.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:03:42.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:03:42.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:03:43.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:03:43.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:03:43.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:03:43.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-28T11:03:43.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-28T11:03:43.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:03:43.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:04:13.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:04:13.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:04: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-28T11:04:13.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:04:13.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:04:14.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:04:14.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-28T11:04:14.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:04:14.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-28T11:04:14.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:04:14.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:04:14.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:04:14.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-28T11:04:16.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-28T11:04:16.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:04:16.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:04:16.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:04:16.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:04:16.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:04:16.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:04:16.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:04:16.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:04:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:04:16.377 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:04:16.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:04:16.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:04:16.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:04:16.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:04:16.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:04:16.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:04:16.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:04:16.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:04:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:04:16.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:04:16.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:04:16.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:04:16.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:04:16.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:03:51
2026-05-28T11:04:16.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68813, datetime.datetime(2026, 5, 28, 11, 3, 51), datetime.datetime(2026, 5, 28, 11, 3, 51), 'salt', 12.25, 30.58, None, 4.59, 244.75, 16.82, 830.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:04:16.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:04:16.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:04:16.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:51, diff=25.692919s, valid=True
2026-05-28T11:04:16.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:04:16.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:04:16.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:12, diff=4.695759s, valid=True
2026-05-28T11:04:16.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:04:16.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:03:48, diff=28.70239s, valid=True
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:04:16.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:04:16.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:12, diff=4.705367s, valid=True
2026-05-28T11:04:16.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:04:16.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:04:16.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:04:16.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891698.706039s, valid=True
2026-05-28T11:04:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:04:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:04:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:04:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:04:16.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:04:16.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:04:16.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:04:16.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:04:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:04:16.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:04:16.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:04:16.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:04:16.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:04:17.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:04:17.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:04:17.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:04:17.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:04:17.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:04:17.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:04:17.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-28T11:04:17.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:04:17.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:04:48.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:04:48.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:04:48.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:04:48.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:04:48.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:04:48.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:04:48.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:04:48.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:04:48.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-28T11:04:48.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:04:48.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:04:48.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:04:48.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-28T11:04:51.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-28T11:04:51.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:04:51.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:04:51.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:04:51.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:04:51.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:04:51.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:04:51.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:04:51.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:04:51.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:04:51.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:04:51.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:04:51.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:04:51.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:04:51.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:04:51.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:04:51.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:04:51.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:04:51.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:04:51.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:04:51.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:04:51.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:04:51.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:04:51.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:04:51.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:04:22
2026-05-28T11:04:51.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68814, datetime.datetime(2026, 5, 28, 11, 4, 22), datetime.datetime(2026, 5, 28, 11, 4, 21), 'salt', 12.28, 31.47, None, 4.77, 232.79, 16.44, 830.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:04:51.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:04:51.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:04:51.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:21, diff=30.526578s, valid=True
2026-05-28T11:04:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:04:51.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:04:51.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:12, diff=39.529421s, valid=True
2026-05-28T11:04:51.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:04:51.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:19, diff=32.536242s, valid=True
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:04:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:04:51.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:04:12, diff=39.539375s, valid=True
2026-05-28T11:04:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:04:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:04:51.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:04:51.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891733.540328s, valid=True
2026-05-28T11:04:51.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:04:51.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:04:51.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:04:51.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:04:51.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:04:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:04:51.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:04:51.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:04:51.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:04:51.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:04:51.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:04:51.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:04:51.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:04:51.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:04:52.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:04:52.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:04:52.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:04:52.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:04:52.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-28T11:04:52.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-28T11:04:52.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:04:52.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:05:22.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:05:22.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:05:22.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:05:23.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:05:23.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:05:23.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:05:23.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:05:23.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:05:23.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-28T11:05:23.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:05:23.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:05:23.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:05:23.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-28T11:05:26.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-28T11:05:26.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:05:26.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:05:26.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:05:26.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:05:26.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:05:26.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:05:26.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:05:26.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:05:26.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:05:26.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:05:26.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:05:26.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:05:26.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:05:26.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:05:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:05:26.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:05:26.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:05:26.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:05:26.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:05:26.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:05:26.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:05:26.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:05:26.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:05:26.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:05:22
2026-05-28T11:05:26.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68816, datetime.datetime(2026, 5, 28, 11, 5, 22), datetime.datetime(2026, 5, 28, 11, 5, 22), 'salt', 12.34, 32.47, None, 6.35, 255.61, 16.03, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:05:26.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:05:26.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:05:26.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:22, diff=4.784196s, valid=True
2026-05-28T11:05:26.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:05:26.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:05:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:12, diff=14.787042s, valid=True
2026-05-28T11:05:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:05:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:05:26.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:15, diff=11.793676s, valid=True
2026-05-28T11:05:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:05:26.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:05:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:05:26.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:05:26.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:05:26.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:05:26.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:12, diff=14.796699s, valid=True
2026-05-28T11:05:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:05:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:05:26.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:05:26.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891768.797349s, valid=True
2026-05-28T11:05:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:05:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:05:26.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:05:26.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:05:26.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:05:26.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:05:26.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:05:26.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:05:26.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:05:26.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:05:26.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:05:27.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:05:27.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:05:27.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:05:27.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:05:27.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:05:27.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:05:27.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:05:27.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-28T11:05:27.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:05:28.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:05:28.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:05:58.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:05:58.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:05:58.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:05:58.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:05:58.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:05:58.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:05:58.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-28T11:05:58.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:05:58.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-28T11:05:58.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:05:58.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:05:58.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:05:58.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-28T11:06:01.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-28T11:06:01.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:06:01.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:06:01.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:06:01.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:06:01.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:06:01.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:06:01.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:06:01.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:06:01.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:06:01.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:06:01.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:06:01.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:06:01.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:06:01.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:06:01.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:06:01.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:06:02.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:06:02.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:06:02.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:06:02.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:06:02.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:06:02.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:06:02.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:06:02.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:05:52
2026-05-28T11:06:02.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68817, datetime.datetime(2026, 5, 28, 11, 5, 52), datetime.datetime(2026, 5, 28, 11, 5, 52), 'salt', 12.24, 31.21, None, 4.27, 229.69, 16.54, 830.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:06:02.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:06:02.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:06:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:52, diff=10.14603s, valid=True
2026-05-28T11:06:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:06:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:06:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:12, diff=-9.851035s, valid=True
2026-05-28T11:06:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:06:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:06:02.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:05:46, diff=16.15582s, valid=True
2026-05-28T11:06:02.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:06:02.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:06:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:06:02.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:06:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:06:02.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:06:02.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:12, diff=-9.840923s, valid=True
2026-05-28T11:06:02.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:06:02.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:06:02.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:06:02.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891804.159771s, valid=True
2026-05-28T11:06:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:06:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:06:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:06:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:06:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:06:02.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:06:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:06:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:06:02.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:06:02.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:06:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:06:02.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:06:02.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:06:02.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:06:02.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:06:03.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:06:03.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:06:03.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:06:03.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-28T11:06:03.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-28T11:06:03.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:06:03.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:06:33.328 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:06:33.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:06:33.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:06:33.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:06:33.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:06:33.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:06:33.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-28T11:06:33.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:06:33.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:06:33.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:06:33.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:06:33.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:06: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-28T11:06:36.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-28T11:06:36.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:06:36.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:06:36.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:06:36.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:06:36.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:06:36.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:06:36.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:06:36.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:06:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:06:36.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:06:36.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:06:36.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:06:36.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:06:36.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:06:36.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:06:36.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:06:36.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:06:36.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:06:36.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:06:36.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:06:36.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:06:36.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:06:36.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:06:36.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:06:22
2026-05-28T11:06:36.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68818, datetime.datetime(2026, 5, 28, 11, 6, 22), datetime.datetime(2026, 5, 28, 11, 6, 22), 'salt', 12.21, 31.3, None, 3.18, 323.2, 16.5, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:06:36.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:06:36.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:06:36.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:22, diff=14.799647s, valid=True
2026-05-28T11:06:36.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:06:36.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:06:36.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:12, diff=24.80267s, valid=True
2026-05-28T11:06:36.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:06:36.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:16, diff=20.809374s, valid=True
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:06:36.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:06:36.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:12, diff=24.812412s, valid=True
2026-05-28T11:06:36.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:06:36.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:06:36.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:06:36.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891838.813107s, valid=True
2026-05-28T11:06:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:06:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:06:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:06:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:06:36.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:06:36.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:06:36.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:06:36.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:06:36.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:06:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:06:37.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:06:37.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:06:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:06:37.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:06:37.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:06:37.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:06:37.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:06:37.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:06:37.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-28T11:06:37.864 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:06:40.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:06:40.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:07:10.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:07:10.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:07:10.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:07:10.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:07:10.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:07:10.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:07:10.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-28T11:07:10.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:07:10.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-28T11:07:10.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:07:10.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:07:10.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:07:10.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-28T11:07:13.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:07:13.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:07:13.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:07:13.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:07:13.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:07:13.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:07:13.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:07:13.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:07:13.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:07:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:07:13.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:07:13.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:07:13.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:07:13.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:07:13.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:07:13.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:07:13.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:07:13.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:07:13.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:07:13.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:07:13.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:07:13.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:07:13.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:07:13.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:07:13.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:06:53
2026-05-28T11:07:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68819, datetime.datetime(2026, 5, 28, 11, 6, 53), datetime.datetime(2026, 5, 28, 11, 6, 52), 'salt', 12.34, 32.0, None, 5.79, 263.17, 16.22, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:07:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:07:13.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:07:13.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:52, diff=21.481148s, valid=True
2026-05-28T11:07:13.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:07:13.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:07:13.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:12, diff=1.483951s, valid=True
2026-05-28T11:07:13.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:07:13.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:07:13.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:06:46, diff=27.490636s, valid=True
2026-05-28T11:07:13.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:07:13.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:07:13.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:07:13.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:07:13.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:07:13.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:07:13.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:12, diff=1.493636s, valid=True
2026-05-28T11:07:13.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:07:13.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:07:13.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:07:13.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891875.494286s, valid=True
2026-05-28T11:07:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:07:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:07:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:07:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:07:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:07:13.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:07:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:07:13.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:07:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:07:13.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:07:13.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:07:13.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:07:13.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:07:13.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:07:14.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:07:14.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:07:14.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:07:14.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:07:14.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-28T11:07:14.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-28T11:07:14.772 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:07:14.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:07:44.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:07:44.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:07:44.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:07:45.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:07:45.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:07:45.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:07:45.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-28T11:07:45.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:07:45.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-28T11:07:45.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:07:45.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:07:45.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:07:45.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-28T11:07:47.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:07:47.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:07:47.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:07:47.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:07:47.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:07:47.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:07:47.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:07:47.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:07:47.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:07:47.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:07:47.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:07:47.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:07:47.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:07:47.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:07:47.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:07:47.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:07:47.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:07:47.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:07:47.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:07:47.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:07:47.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:07:47.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:07:47.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:07:47.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:07:48.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:07:23
2026-05-28T11:07:48.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68820, datetime.datetime(2026, 5, 28, 11, 7, 23), datetime.datetime(2026, 5, 28, 11, 7, 22), 'salt', 12.31, 32.13, None, 8.33, 260.54, 16.16, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:07:48.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:07:48.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:07:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:22, diff=26.017562s, valid=True
2026-05-28T11:07:48.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:07:48.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:07:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:12, diff=36.020399s, valid=True
2026-05-28T11:07:48.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:07:48.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:17, diff=31.02707s, valid=True
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:07:48.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:07:48.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:12, diff=36.030057s, valid=True
2026-05-28T11:07:48.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:07:48.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:07:48.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:07:48.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891910.030732s, valid=True
2026-05-28T11:07:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:07:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:07:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:07:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:07:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:07:48.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:07:48.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:07:48.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:07:48.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:07:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:07:48.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:07:48.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:07:48.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:07:48.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:07:48.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:07:48.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:07:49.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:07:49.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:07:49.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-28T11:07:49.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-28T11:07:49.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:07:49.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:08:19.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:08:19.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:08:19.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:08:19.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:08:19.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:08:19.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:08:19.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-28T11:08:19.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:08:19.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:08:19.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:08:19.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:08:19.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:08:19.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-28T11:08:22.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-28T11:08:22.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:08:22.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:08:22.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:08:22.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:08:22.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:08:22.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:08:22.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:08:22.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:08:22.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:08:22.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:08:22.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:08:22.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:08:23.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:08:23.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:08:23.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:08:23.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:08:23.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:08:23.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:08:23.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:08:23.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:08:23.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:08:23.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:08:23.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:08:23.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:07:53
2026-05-28T11:08:23.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68821, datetime.datetime(2026, 5, 28, 11, 7, 53), datetime.datetime(2026, 5, 28, 11, 7, 53), 'salt', 12.34, 29.58, None, 6.35, 241.09, 17.26, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:08:23.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:08:23.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:08:23.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:53, diff=30.290231s, valid=True
2026-05-28T11:08:23.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:08:23.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:08:23.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:08:12, diff=11.293151s, valid=True
2026-05-28T11:08:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:08:23.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:08:23.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:07:49, diff=34.299917s, valid=True
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:08:23.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:08:23.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:08:12, diff=11.303011s, valid=True
2026-05-28T11:08:23.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:08:23.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:08:23.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:08:23.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891945.303697s, valid=True
2026-05-28T11:08:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:08:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:08:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:08:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:08:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:08:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:08:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:08:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:08:23.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:08:23.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:08:23.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:08:23.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:08:23.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:08:23.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:08:23.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:08:24.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:08:24.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:08:24.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:08:24.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-28T11:08:24.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:08:24.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:08:24.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:08:54.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:08:54.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:08:54.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:08:54.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:08:54.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:08:55.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:08:55.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:08:55.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:08:55.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-28T11:08:55.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:08:55.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:08:55.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:08:55.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-28T11:08:57.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-28T11:08:57.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:08:57.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:08:57.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:08:57.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:08:57.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:08:57.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:08:57.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:08:57.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:08:57.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:08:57.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:08:57.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:08:57.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:08:57.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:08:57.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:08:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:08:57.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:08:57.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:08:57.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:08:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:08:57.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:08:57.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:08:57.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:08:57.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:08:57.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:08:54
2026-05-28T11:08:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68823, datetime.datetime(2026, 5, 28, 11, 8, 54), datetime.datetime(2026, 5, 28, 11, 8, 54), 'salt', 12.44, 30.84, None, 5.51, 248.64, 16.72, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:08:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:08:57.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:08:57.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:08:54, diff=3.781774s, valid=True
2026-05-28T11:08:57.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:08:57.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:08:57.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:12, diff=-14.215436s, valid=True
2026-05-28T11:08:57.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:08:57.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:08:52, diff=5.791152s, valid=True
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:08:57.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:08:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:12, diff=-14.205844s, valid=True
2026-05-28T11:08:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:08:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:08:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:08:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=891979.794817s, valid=True
2026-05-28T11:08:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:08:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:08:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:08:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:08:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:08:57.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:08:57.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:08:57.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:08:57.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:08:57.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:08:57.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:08:58.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:08:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:08:58.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:08:58.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:08:58.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:08:58.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:08:58.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:08:58.765 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:08:58.765 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:08:59.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:08:59.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:09:29.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:09:29.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:09:29.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:09:29.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:09:29.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:09:29.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:09:29.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-28T11:09:29.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:09:29.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-28T11:09:29.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:09:29.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:09:29.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:09:29.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-28T11:09:32.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-28T11:09:32.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:09:32.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:09:32.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:09:32.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:09:32.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:09:32.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:09:32.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:09:32.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:09:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:09:32.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:09:32.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:09:32.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:09:32.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T11:09:32.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:09:32.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T11:09:32.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:09:32.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:09:32.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:09:32.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:09:32.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:09:32.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:09:32.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:09:32.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:09:32.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:09:04
2026-05-28T11:09:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68824, datetime.datetime(2026, 5, 28, 11, 9, 4), datetime.datetime(2026, 5, 28, 11, 9, 4), 'salt', 12.44, 30.84, None, 5.51, 248.64, 16.72, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:09:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:09:32.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T11:09:32.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:04, diff=28.49482s, valid=True
2026-05-28T11:09:32.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:09:32.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:09:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:12, diff=20.497987s, valid=True
2026-05-28T11:09:32.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:09:32.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:02, diff=30.505357s, valid=True
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:09:32.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:09:32.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:12, diff=20.508682s, valid=True
2026-05-28T11:09:32.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:09:32.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:09:32.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:09:32.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892014.509391s, valid=True
2026-05-28T11:09:32.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:09:32.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:09:32.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:09:32.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:09:32.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:09:32.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:09:32.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:09:32.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:09:32.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:09:32.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:09:32.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:09:32.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:09:32.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:09:32.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:09:33.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:09:33.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:09:33.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:09:33.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:09:33.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-28T11:09:33.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-28T11:09:33.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:09:33.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:10:03.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:10:03.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:10:03.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:10:03.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:10:03.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:10:04.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:10:04.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-28T11:10:04.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:10:04.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-28T11:10:04.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:10:04.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:10:04.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:10:04.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-28T11:10:06.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-28T11:10:06.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:10:06.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:10:06.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:10:06.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:10:06.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:10:06.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:10:06.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:10:06.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:10:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:10:06.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:10:06.528 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:10:06.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:10:06.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:10:06.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:10:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:10:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:10:06.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:10:06.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:10:06.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:10:06.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:10:06.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:10:06.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:10:06.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:10:06.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:10:02
2026-05-28T11:10:06.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68826, datetime.datetime(2026, 5, 28, 11, 10, 2), datetime.datetime(2026, 5, 28, 11, 10, 2), 'salt', 12.38, 30.31, None, 5.65, 307.38, 16.95, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:10:06.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:10:06.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:10:06.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:02, diff=4.843156s, valid=True
2026-05-28T11:10:06.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:10:06.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:10:06.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=-5.154057s, valid=True
2026-05-28T11:10:06.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:10:06.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:09:57, diff=9.852544s, valid=True
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:10:06.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:10:06.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:10:06.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=-5.144452s, valid=True
2026-05-28T11:10:06.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:10:06.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:10:06.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:10:06.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892048.856199s, valid=True
2026-05-28T11:10:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:10:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:10:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:10:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:10:06.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:10:06.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:10:06.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:10:06.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:10:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:10:06.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:10:07.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:10:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:10:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:10:07.175 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:10:07.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:10:07.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:10:07.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:10:07.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:10:07.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-28T11:10:07.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-28T11:10:08.076 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:10:08.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:10:38.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:10:38.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:10:38.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:10:38.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:10:38.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:10:39.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:10:39.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-28T11:10:39.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:10:39.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-28T11:10:39.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:10:39.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:10:39.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:10:39.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-28T11:10:41.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-28T11:10:41.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:10:41.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:10:41.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:10:41.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:10:41.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:10:41.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:10:41.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:10:41.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:10:41.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:10:41.651 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:10:41.651 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:10:41.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:10:41.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:10:41.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:10:41.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:10:41.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:10:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:10:41.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:10:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:10:41.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:10:41.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:10:41.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:10:41.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:10:41.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:10:33
2026-05-28T11:10:41.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68827, datetime.datetime(2026, 5, 28, 11, 10, 33), datetime.datetime(2026, 5, 28, 11, 10, 32), 'salt', 12.38, 31.67, None, 5.51, 274.47, 16.37, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:10:41.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:10:41.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:10:41.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:32, diff=9.968718s, valid=True
2026-05-28T11:10:41.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:10:41.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:10:41.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=29.971692s, valid=True
2026-05-28T11:10:41.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:10:41.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:28, diff=13.978478s, valid=True
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:10:41.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:10:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=29.981481s, valid=True
2026-05-28T11:10:41.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:10:41.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:10:41.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:10:41.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892083.982146s, valid=True
2026-05-28T11:10:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:10:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:10:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:10:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:10:41.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:10:42.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:10:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:10:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:10:42.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:10:42.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:10:42.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:10:42.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:10:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:10:42.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:10:42.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:10:42.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:10:43.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:10:43.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:10:43.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-28T11:10:43.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-28T11:10:43.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:10:43.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:11:13.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:11:13.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:11:13.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:11:13.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:11:13.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:11:13.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:11:13.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-28T11:11:13.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:11:13.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-28T11:11:13.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:11:13.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:11:13.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:11:13.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-28T11:11:16.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-28T11:11:16.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:11:16.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:11:16.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:11:16.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:11:16.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:11:16.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:11:16.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:11:16.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:11:16.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:11:16.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:11:16.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:11:16.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:11:16.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:11:16.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:11:16.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:11:16.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:11:16.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:11:16.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:11:16.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:11:16.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:11:16.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:11:16.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:11:16.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:11:17.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:11:03
2026-05-28T11:11:17.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68828, datetime.datetime(2026, 5, 28, 11, 11, 3), datetime.datetime(2026, 5, 28, 11, 11, 2), 'salt', 12.24, 31.34, None, 6.28, 270.76, 16.49, 830.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:11:17.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:11:17.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:11:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:11:02, diff=15.053329s, valid=True
2026-05-28T11:11:17.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:11:17.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:11:17.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=65.056125s, valid=True
2026-05-28T11:11:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:11:17.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:11:17.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:58, diff=19.062771s, valid=True
2026-05-28T11:11:17.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:11:17.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:11:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:11:17.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:11:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:11:17.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:11:17.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=65.0658s, valid=True
2026-05-28T11:11:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:11:17.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:11:17.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:11:17.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892119.066459s, valid=True
2026-05-28T11:11:17.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:11:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:11:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:11:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:11:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:11:17.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:11:17.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:11:17.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:11:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:11:17.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:11:17.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:11:17.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:11:17.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:11:17.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:11:17.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:11:17.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:11:18.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:11:18.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:11:18.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-28T11:11:18.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-28T11:11:18.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:11:18.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:11:48.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:11:48.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:11:48.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:11:48.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:11:48.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:11:48.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:11:48.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-28T11:11:48.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:11:48.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-28T11:11:48.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:11:48.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:11:48.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:11:48.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-28T11:11:51.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-28T11:11:51.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:11:51.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:11:51.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:11:51.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:11:51.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:11:51.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:11:51.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:11:51.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:11:51.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:11:51.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:11:51.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:11:51.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:11:51.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:11:51.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:11:51.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:11:51.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:11:51.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:11:51.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:11:51.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:11:51.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:11:51.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:11:51.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:11:51.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:11:51.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:11:23
2026-05-28T11:11:51.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68829, datetime.datetime(2026, 5, 28, 11, 11, 23), datetime.datetime(2026, 5, 28, 11, 11, 22), 'salt', 12.21, 32.17, None, 6.46, 266.12, 16.14, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:11:51.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:11:51.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:11:51.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:11:22, diff=29.386385s, valid=True
2026-05-28T11:11:51.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:11:51.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:11:51.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=99.389178s, valid=True
2026-05-28T11:11:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:11:51.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:11:51.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:11:18, diff=33.395729s, valid=True
2026-05-28T11:11:51.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:11:51.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:11:51.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:11:51.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:11:51.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:11:51.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:11:51.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:10:12, diff=99.398707s, valid=True
2026-05-28T11:11:51.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:11:51.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:11:51.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:11:51.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892153.399353s, valid=True
2026-05-28T11:11:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:11:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:11:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:11:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:11:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:11:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:11:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:11:51.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:11:51.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:11:51.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:11:51.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:11:51.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:11:51.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:11:51.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:11:52.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:11:52.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:11:52.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:11:52.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:11:52.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-28T11:11:52.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-28T11:11:52.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:11:52.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:12:22.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:12:22.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:12:22.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:12:23.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:12:23.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:12:23.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:12:23.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-28T11:12:23.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:12:23.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-28T11:12:23.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:12:23.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:12:23.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:12: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-28T11:12:26.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-28T11:12:26.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:12:26.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:12:26.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:12:26.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:12:26.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:12:26.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:12:26.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:12:26.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:12:26.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:12:26.278 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:12:26.278 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:12:26.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:12:26.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:12:26.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:12:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:12:26.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:12:26.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:12:26.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:12:26.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:12:26.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:12:26.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:12:26.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:12:26.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:12:26.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:12:14
2026-05-28T11:12:26.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68831, datetime.datetime(2026, 5, 28, 11, 12, 14), datetime.datetime(2026, 5, 28, 11, 12, 14), 'salt', 12.14, 32.9, None, 5.82, 290.89, 15.83, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:12:26.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:12:26.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:12:26.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:14, diff=12.583625s, valid=True
2026-05-28T11:12:26.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:12:26.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:12:26.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:12, diff=14.58647s, valid=True
2026-05-28T11:12:26.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:12:26.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:11, diff=15.59316s, valid=True
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:12:26.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:12:26.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:12, diff=14.596135s, valid=True
2026-05-28T11:12:26.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:12:26.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:12:26.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:12:26.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892188.596798s, valid=True
2026-05-28T11:12:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:12:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:12:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:12:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:12:26.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:12:26.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:12:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:12:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:12:26.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:12:26.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:12:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:12:26.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:12:26.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:12:26.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:12:27.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:12:27.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:12:27.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:12:27.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:12:27.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-28T11:12:27.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-28T11:12:27.634 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:12:27.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:12:57.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:12:57.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:12:57.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:12:57.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:12:57.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:12:58.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:12:58.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-28T11:12:58.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:12:58.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-28T11:12:58.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:12:58.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:12:58.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:12:58.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-28T11:13:00.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-28T11:13:00.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:13:00.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:13:00.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:13:00.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:13:00.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:13:00.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:13:00.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:13:00.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:13:00.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:13:00.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:13:00.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:13:00.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:13:00.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:13:00.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:13:00.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:13:00.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:13:00.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:13:00.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:13:00.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:13:00.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:13:00.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:13:00.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:13:00.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:13:00.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:12:44
2026-05-28T11:13:00.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68832, datetime.datetime(2026, 5, 28, 11, 12, 44), datetime.datetime(2026, 5, 28, 11, 12, 44), 'salt', 12.11, 32.86, None, 4.06, 286.29, 15.84, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:13:00.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:13:00.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:13:00.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:44, diff=16.991509s, valid=True
2026-05-28T11:13:00.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:13:00.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:13:00.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:12, diff=-11.005632s, valid=True
2026-05-28T11:13:00.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:13:00.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:12:42, diff=19.001213s, valid=True
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:13:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:13:01.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:12, diff=-10.995697s, valid=True
2026-05-28T11:13:01.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:13:01.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:13:01.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:13:01.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892223.004987s, valid=True
2026-05-28T11:13:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:13:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:13:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:13:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:13:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:13:01.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:13:01.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:13:01.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:13:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:13:01.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:13:01.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:13:01.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:13:01.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:13:01.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:13:01.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:13:02.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:13:02.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:13:02.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:13:02.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-28T11:13:02.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-28T11:13:02.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:13:02.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:13:32.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:13:32.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:13:32.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:13:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:13:32.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:13:33.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:13:33.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-28T11:13:33.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:13:33.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-28T11:13:33.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:13:33.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:13:33.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:13:33.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-28T11:13:36.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-28T11:13:36.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:13:36.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:13:36.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:13:36.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:13:36.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:13:36.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:13:36.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:13:36.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:13:36.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:13:36.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:13:36.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:13:36.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:13:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:13:36.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:13:36.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:13:36.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:13:36.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:13:36.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:13:36.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:13:36.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:13:36.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:13:36.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:13:36.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:13:36.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:13:14
2026-05-28T11:13:36.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68833, datetime.datetime(2026, 5, 28, 11, 13, 14), datetime.datetime(2026, 5, 28, 11, 13, 14), 'salt', 12.14, 33.06, None, 2.65, 246.52, 15.76, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:13:36.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:13:36.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:13:36.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:14, diff=22.356297s, valid=True
2026-05-28T11:13:36.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:13:36.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:13:36.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:12, diff=24.359132s, valid=True
2026-05-28T11:13:36.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:13:36.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:13:36.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:13, diff=23.365921s, valid=True
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:13:36.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:13:36.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:12, diff=24.368978s, valid=True
2026-05-28T11:13:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:13:36.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:13:36.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:13:36.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892258.36964s, valid=True
2026-05-28T11:13:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:13:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:13:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:13:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:13:36.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:13:36.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:13:36.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:13:36.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:13:36.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:13:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:13:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:13:36.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:13:36.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:13:36.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:13:36.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:13:37.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:13:37.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:13:37.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:13:37.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-28T11:13:37.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-28T11:13:37.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:13:37.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:14:07.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:14:07.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:14:07.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:14:07.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:14:07.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:14:08.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:14:08.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:14:08.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:14:08.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-28T11:14:08.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:14:08.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:14:08.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:14:08.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-28T11:14:10.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-28T11:14:10.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:14:10.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:14:10.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:14:10.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:14:10.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:14:10.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:14:10.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:14:10.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:14:10.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:14:10.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:14:10.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:14:10.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:14:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:14:10.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:14:10.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:14:10.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:14:10.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:14:10.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:14:10.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:14:10.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:14:10.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:14:10.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:14:10.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:14:10.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:13:45
2026-05-28T11:14:10.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68834, datetime.datetime(2026, 5, 28, 11, 13, 45), datetime.datetime(2026, 5, 28, 11, 13, 44), 'salt', 12.18, 32.93, None, 1.41, 272.33, 15.83, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:14:10.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:14:10.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:14:10.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:44, diff=26.878925s, valid=True
2026-05-28T11:14:10.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:14:10.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:14:10.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:14:12, diff=-1.118281s, valid=True
2026-05-28T11:14:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:14:10.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:13:39, diff=31.888333s, valid=True
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:14:10.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:14:10.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:14:12, diff=-1.108682s, valid=True
2026-05-28T11:14:10.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:14:10.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:14:10.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:14:10.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892292.891976s, valid=True
2026-05-28T11:14:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:14:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:14:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:14:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:14:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:14:10.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:14:10.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:14:10.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:14:10.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:14:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:14:11.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:14:11.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:14:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:14:11.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:14:11.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:14:11.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:14:11.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:14:11.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:14:11.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:14:11.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-28T11:14:13.134 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:14:13.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:14:43.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:14:43.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:14:43.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:14:43.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:14:43.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:14:43.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:14:43.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-28T11:14:43.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:14:43.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-28T11:14:43.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:14:43.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:14:43.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:14:43.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-28T11:14:46.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-28T11:14:46.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:14:46.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:14:46.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:14:46.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:14:46.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:14:46.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:14:46.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:14:46.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:14:46.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:14:46.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:14:46.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:14:46.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:14:46.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:14:46.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:14:46.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:14:46.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:14:46.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:14:46.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:14:46.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:14:46.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:14:46.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:14:46.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:14:46.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:14:46.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:14:45
2026-05-28T11:14:46.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68836, datetime.datetime(2026, 5, 28, 11, 14, 45), datetime.datetime(2026, 5, 28, 11, 14, 45), 'salt', 12.24, 31.73, None, 1.98, 117.16, 16.32, 830.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:14:46.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:14:46.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:14:46.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:14:45, diff=1.71296s, valid=True
2026-05-28T11:14:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:14:46.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:12, diff=-25.28427s, valid=True
2026-05-28T11:14:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:14:39, diff=7.722372s, valid=True
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:14:46.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:14:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:12, diff=-25.274628s, valid=True
2026-05-28T11:14:46.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:14:46.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:14:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:14:46.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892328.72603s, valid=True
2026-05-28T11:14:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:14:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:14:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:14:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:14:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:14:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:14:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:14:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:14:46.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:14:46.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:14:46.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:14:46.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:14:47.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:14:47.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:14:47.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:14:47.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:14:47.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:14:47.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:14:47.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-28T11:14:47.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-28T11:14:47.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:14:47.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:15:17.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:15:17.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:15:17.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:15:18.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:15:18.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:15:18.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:15:18.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:15:18.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:15:18.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-28T11:15:18.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:15:18.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:15:18.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:15:18.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-28T11:15:21.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-28T11:15:21.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:15:21.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:15:21.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:15:21.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:15:21.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:15:21.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:15:21.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:15:21.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:15:21.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:15:21.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:15:21.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:15:21.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:15:21.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:15:21.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:15:21.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:15:21.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:15:21.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:15:21.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:15:21.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:15:21.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:15:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:15:21.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:15:21.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:15:21.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:15:16
2026-05-28T11:15:21.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68837, datetime.datetime(2026, 5, 28, 11, 15, 16), datetime.datetime(2026, 5, 28, 11, 15, 15), 'salt', 12.47, 39.1, None, 1.56, 58.73, 13.53, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:15:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:15:21.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:15:21.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:15, diff=6.379854s, valid=True
2026-05-28T11:15:21.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:15:21.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:15:21.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:12, diff=9.382727s, valid=True
2026-05-28T11:15:21.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:15:21.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:10, diff=11.389369s, valid=True
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:15:21.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:15:21.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:12, diff=9.392372s, valid=True
2026-05-28T11:15:21.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:15:21.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:15:21.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:15:21.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892363.393045s, valid=True
2026-05-28T11:15:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:15:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:15:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:15:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:15:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:15:21.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:15:21.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:15:21.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:15:21.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:15:21.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:15:21.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:15:21.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:15:21.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:15:21.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:15:21.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:15:22.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:15:22.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:15:22.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:15:22.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-28T11:15:22.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-28T11:15:22.450 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:15:22.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:15:52.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:15:52.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:15:52.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:15:52.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:15:52.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:15:53.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:15: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-28T11:15:53.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:15:53.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-28T11:15:53.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:15:53.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:15:53.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:15:53.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-28T11:15:55.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-28T11:15:55.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:15:55.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:15:55.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:15:55.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:15:55.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:15:55.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:15:55.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:15:55.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:15:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:15:55.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:15:55.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:15:55.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:15:55.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:15:55.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:15:55.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:15:55.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:15:55.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:15:55.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:15:55.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:15:55.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:15:55.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:15:55.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:15:55.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:15:55.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:15:46
2026-05-28T11:15:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68838, datetime.datetime(2026, 5, 28, 11, 15, 46), datetime.datetime(2026, 5, 28, 11, 15, 45), 'salt', 12.64, 45.36, None, 2.33, 26.82, 11.5, 830.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:15:55.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:15:55.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:15:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:45, diff=10.742425s, valid=True
2026-05-28T11:15:55.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:15:55.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:15:55.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:12, diff=-16.254439s, valid=True
2026-05-28T11:15:55.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:15:55.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:15:40, diff=15.752291s, valid=True
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:15:55.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:15:55.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:12, diff=-16.244681s, valid=True
2026-05-28T11:15:55.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:15:55.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:15:55.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:15:55.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892397.755984s, valid=True
2026-05-28T11:15:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:15:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:15:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:15:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:15:55.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:15:55.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:15:55.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:15:55.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:15:55.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:15:55.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:15:55.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:15:55.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:15:56.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:15:56.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:15:56.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:15:56.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:15:56.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:15:56.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:15:56.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-28T11:15:56.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-28T11:15:56.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:15:56.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:16:26.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:16:26.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:16:26.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:16:27.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:16:27.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:16:27.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:16:27.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-28T11:16:27.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:16:27.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-28T11:16:27.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:16:27.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:16:27.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:16:27.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-28T11:16: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-28T11:16:30.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:16:30.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:16:30.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:16:30.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:16:30.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:16:30.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:16:30.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:16:30.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:16:30.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:16:30.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:16:30.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:16:30.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:16:30.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:16:30.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:16:30.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:16:30.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:16:30.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:16:30.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:16:30.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:16:30.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:16:30.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:16:30.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:16:30.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:16:30.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:16:16
2026-05-28T11:16:30.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68839, datetime.datetime(2026, 5, 28, 11, 16, 16), datetime.datetime(2026, 5, 28, 11, 16, 16), 'salt', 12.57, 51.03, None, 5.19, 61.94, 9.85, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:16:30.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:16:30.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:16:30.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:16, diff=14.437838s, valid=True
2026-05-28T11:16:30.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:16:30.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:16:30.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:12, diff=18.440696s, valid=True
2026-05-28T11:16:30.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:16:30.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:11, diff=19.447466s, valid=True
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:16:30.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:16:30.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:12, diff=18.450479s, valid=True
2026-05-28T11:16:30.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:16:30.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:16:30.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:16:30.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892432.451136s, valid=True
2026-05-28T11:16:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:16:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:16:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:16:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:16:30.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:16:30.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:16:30.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:16:30.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:16:30.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:16:30.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:16:30.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:16:30.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:16:30.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:16:30.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:16:30.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:16:31.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:16:31.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:16:31.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:16:31.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-28T11:16:31.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-28T11:16:31.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:16:31.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:17:01.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:17:01.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:17:01.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:17:01.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:17:01.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:17:02.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:17:02.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-28T11:17:02.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:17:02.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-28T11:17:02.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:17:02.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:17:02.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:17:02.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-28T11:17:04.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-28T11:17:04.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:17:04.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:17:04.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:17:04.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:17:04.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:17:04.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:17:04.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:17:04.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:17:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:17:04.683 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:17:04.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:17:04.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:17:04.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:17:04.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:17:04.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:17:04.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:17:04.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:17:04.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:17:04.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:17:04.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:17:04.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:17:04.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:17:04.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:17:04.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:16:46
2026-05-28T11:17:04.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68840, datetime.datetime(2026, 5, 28, 11, 16, 46), datetime.datetime(2026, 5, 28, 11, 16, 46), 'salt', 12.37, 52.49, None, 3.78, 61.38, 9.43, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:17:04.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:17:04.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:17:04.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:46, diff=18.997049s, valid=True
2026-05-28T11:17:04.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:17:04.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:17:04.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:12, diff=-7.000175s, valid=True
2026-05-28T11:17:04.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:17:04.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:16:43, diff=22.006376s, valid=True
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:17:05.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:17:05.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:12, diff=-6.990652s, valid=True
2026-05-28T11:17:05.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:17:05.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:17:05.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:17:05.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892467.009994s, valid=True
2026-05-28T11:17:05.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:17:05.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:17:05.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:17:05.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:17:05.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:17:05.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:17:05.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:17:05.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:17:05.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:17:05.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:17:05.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:17:05.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:17:05.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:17:05.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:17:05.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:17:05.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:17:06.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:17:06.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:17:06.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-28T11:17:06.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-28T11:17:06.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:17:06.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:17:36.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:17:36.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:17:36.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:17:36.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:17:36.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:17:36.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:17:36.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-28T11:17:36.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:17:36.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-28T11:17:36.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:17:36.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:17:36.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:17:36.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:17:39.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:17:39.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:17:39.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:17:39.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:17:39.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:17:39.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:17:39.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:17:39.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:17:39.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:17:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:17:39.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:17:39.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:17:39.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:17:39.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:17:39.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:17:39.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:17:39.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:17:39.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:17:39.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:17:39.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:17:39.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:17:39.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:17:39.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:17:39.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:17:39.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:17:17
2026-05-28T11:17:39.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68841, datetime.datetime(2026, 5, 28, 11, 17, 17), datetime.datetime(2026, 5, 28, 11, 17, 16), 'salt', 12.31, 53.09, None, 2.47, 34.63, 9.28, 830.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:17:39.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:17:39.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:17:39.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:16, diff=23.917786s, valid=True
2026-05-28T11:17:39.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:17:39.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:17:39.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:12, diff=27.920753s, valid=True
2026-05-28T11:17:39.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:17:39.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:17:39.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:15, diff=24.927944s, valid=True
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:17:39.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:17:39.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:12, diff=27.931367s, valid=True
2026-05-28T11:17:39.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:17:39.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:17:39.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:17:39.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892501.932102s, valid=True
2026-05-28T11:17:39.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:17:39.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:17:39.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:17:39.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:17:39.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:17:40.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:17:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:17:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:17:40.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:17:40.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:17:40.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:17:40.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:17:40.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:17:40.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:17:40.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:17:40.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:17:40.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:17:40.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:17:40.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-28T11:17:40.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-28T11:17:41.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:17:41.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:18:11.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:18:11.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:18:11.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:18:11.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:18:11.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:18:11.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:18:11.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-28T11:18:11.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:18:11.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-28T11:18:11.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:18:11.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:18:11.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:18:11.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-28T11:18:13.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-28T11:18:13.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:18:13.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:18:13.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:18:13.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:18:13.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:18:13.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:18:13.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:18:13.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:18:13.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:18:13.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:18:13.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:18:13.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:18:14.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:18:14.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:18:14.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:18:14.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:18:14.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:18:14.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:18:14.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:18:14.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:18:14.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:18:14.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:18:14.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:18:14.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:17:47
2026-05-28T11:18:14.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68842, datetime.datetime(2026, 5, 28, 11, 17, 47), datetime.datetime(2026, 5, 28, 11, 17, 46), 'salt', 12.37, 54.05, None, 1.45, 49.46, 9.02, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:18:14.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:18:14.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:18:14.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:46, diff=28.269582s, valid=True
2026-05-28T11:18:14.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:18:14.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:18:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:18:12, diff=2.272402s, valid=True
2026-05-28T11:18:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:18:14.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:18:14.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:17:46, diff=28.278967s, valid=True
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:18:14.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:18:14.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:18:12, diff=2.281951s, valid=True
2026-05-28T11:18:14.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:18:14.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:18:14.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:18:14.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892536.282741s, valid=True
2026-05-28T11:18:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:18:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:18:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:18:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:18:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:18:14.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:18:14.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:18:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:18:14.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:18:14.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:18:14.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:18:14.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:18:14.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:18:14.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:18:14.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:18:15.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:18:15.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:18:15.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:18:15.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-28T11:18:15.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-28T11:18:15.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:18:15.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:18:45.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:18:45.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:18:45.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:18:45.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:18:45.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:18:45.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:18:45.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-28T11:18:45.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:18:45.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-28T11:18:45.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:18:45.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:18:45.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:18:45.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-28T11:18:49.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-28T11:18:49.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:18:49.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:18:49.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:18:49.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:18:49.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:18:49.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:18:49.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:18:49.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:18:49.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:18:49.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:18:49.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:18:49.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:18:49.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:18:49.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:18:49.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:18:49.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:18:49.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:18:49.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:18:49.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:18:49.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:18:49.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:18:49.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:18:49.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:18:49.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:18:47
2026-05-28T11:18:49.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68844, datetime.datetime(2026, 5, 28, 11, 18, 47), datetime.datetime(2026, 5, 28, 11, 18, 47), 'salt', 12.3, 54.65, None, 2.65, 70.22, 8.86, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:18:49.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:18:49.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:18:49.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:18:47, diff=2.891079s, valid=True
2026-05-28T11:18:49.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:18:49.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:18:49.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:12, diff=-22.105705s, valid=True
2026-05-28T11:18:49.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:18:49.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:18:42, diff=7.901193s, valid=True
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:18:49.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:18:49.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:12, diff=-22.09566s, valid=True
2026-05-28T11:18:49.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:18:49.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:18:49.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:18:49.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892571.90503s, valid=True
2026-05-28T11:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:18:49.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:18:49.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:18:49.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:18:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:18:50.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:18:50.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:18:50.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:18:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:18:50.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:18:50.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:18:50.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:18:50.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:18:50.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:18:50.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-28T11:18:50.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-28T11:18:51.728 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:18:51.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:19:21.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:19:21.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:19:21.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:19:22.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:19:22.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:19:22.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:19:22.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-28T11:19:22.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:19:22.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-28T11:19:22.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:19:22.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:19:22.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:19:22.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-28T11:19:24.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-28T11:19:24.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:19:24.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:19:24.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:19:24.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:19:24.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:19:24.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:19:24.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:19:24.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:19:24.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:19:24.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:19:24.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:19:24.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:19:24.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:19:24.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:19:24.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:19:24.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:19:24.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:19:24.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:19:24.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:19:24.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:19:24.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:19:24.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:19:24.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:19:24.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:19:17
2026-05-28T11:19:24.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68845, datetime.datetime(2026, 5, 28, 11, 19, 17), datetime.datetime(2026, 5, 28, 11, 19, 17), 'salt', 12.27, 54.31, None, 3.39, 62.38, 8.94, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:19:24.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:19:24.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:19:25.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:17, diff=8.002134s, valid=True
2026-05-28T11:19:25.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:19:25.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:19:25.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:12, diff=13.004973s, valid=True
2026-05-28T11:19:25.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:19:25.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:19:25.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:12, diff=13.011672s, valid=True
2026-05-28T11:19:25.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:19:25.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:19:25.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:19:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:19:25.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:19:25.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:19:25.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:12, diff=13.014784s, valid=True
2026-05-28T11:19:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:19:25.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:19:25.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:19:25.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892607.015447s, valid=True
2026-05-28T11:19:25.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:19:25.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:19:25.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:19:25.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:19:25.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:19:25.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:19:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:19:25.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:19:25.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:19:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:19:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:19:25.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:19:25.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:19:25.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:19:25.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:19:25.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:19:26.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:19:26.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:19:26.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-28T11:19:26.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-28T11:19:26.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:19:26.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:19:56.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:19:56.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:19:56.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:19:56.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:19:56.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:19:56.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:19:56.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-28T11:19:56.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:19:56.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-28T11:19:56.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:19:56.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:19:56.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:19:56.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-28T11:19:58.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-28T11:19:58.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:19:58.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:19:58.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:19:58.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:19:58.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:19:58.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:19:58.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:19:58.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:19:58.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:19:58.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:19:58.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:19:58.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:19:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:19:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:19:59.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:19:59.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:19:59.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:19:59.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:19:59.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:19:59.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:19:59.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:19:59.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:19:59.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:19:59.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:19:48
2026-05-28T11:19:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68846, datetime.datetime(2026, 5, 28, 11, 19, 48), datetime.datetime(2026, 5, 28, 11, 19, 47), 'salt', 11.84, 54.38, None, 3.39, 58.54, 8.9, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:19:59.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:19:59.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:19:59.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:47, diff=12.258829s, valid=True
2026-05-28T11:19:59.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:19:59.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:19:59.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:12, diff=-12.738268s, valid=True
2026-05-28T11:19:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:19:59.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:19:42, diff=17.268482s, valid=True
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:19:59.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:19:59.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:12, diff=-12.728398s, valid=True
2026-05-28T11:19:59.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:19:59.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:19:59.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:19:59.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892641.272284s, valid=True
2026-05-28T11:19:59.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:19:59.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:19:59.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:19:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:19:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:19:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:19:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:19:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:19:59.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:19:59.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:19:59.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:19:59.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:19:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:19:59.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:19:59.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:20:00.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:20:00.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:20:00.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:20:00.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-28T11:20:00.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-28T11:20:00.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:20:00.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:20:30.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:20:30.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:20:30.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:20:30.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:20:30.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:20:31.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:20:31.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:20:31.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:20:31.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-28T11:20:31.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:20:31.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:20:31.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:20:31.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-28T11:20:33.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-28T11:20:33.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:20:33.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:20:33.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:20:33.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:20:33.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:20:33.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:20:33.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:20:33.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:20:33.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:20:33.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:20:33.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:20:33.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:20:33.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:20:33.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:20:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:20:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:20:33.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:20:33.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:20:33.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:20:33.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:20:33.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:20:33.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:20:33.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:20:33.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:20:18
2026-05-28T11:20:33.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68847, datetime.datetime(2026, 5, 28, 11, 20, 18), datetime.datetime(2026, 5, 28, 11, 20, 17), 'salt', 11.71, 54.71, None, 4.45, 65.97, 8.81, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:20:33.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:20:33.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:20:33.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:17, diff=16.826679s, valid=True
2026-05-28T11:20:33.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:20:33.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:20:33.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:12, diff=21.829504s, valid=True
2026-05-28T11:20:33.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:20:33.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:13, diff=20.836034s, valid=True
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:20:33.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:20:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:12, diff=21.839045s, valid=True
2026-05-28T11:20:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:20:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:20:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:20:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892675.839708s, valid=True
2026-05-28T11:20:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:20:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:20:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:20:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:20:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:20:33.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:20:33.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:20:33.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:20:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:20:33.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:20:34.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:20:34.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:20:34.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:20:34.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:20:34.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:20:34.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:20:34.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:20:34.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:20:34.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-28T11:20:34.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-28T11:20:34.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:20:34.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:21:05.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:21:05.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:21:05.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:21:05.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:21:05.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:21:05.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:21:05.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-28T11:21:05.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:21:05.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-28T11:21:05.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:21:05.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:21:05.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:21:05.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:21:09.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-28T11:21:09.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:21:09.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:21:09.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:21:09.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:21:09.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:21:09.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:21:09.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:21:09.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:21:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:21:09.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:21:09.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:21:09.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:21:09.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:21:09.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:21:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:21:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:21:09.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:21:09.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:21:09.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:21:09.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:21:09.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:21:09.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:21:09.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:21:09.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:20:48
2026-05-28T11:21:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68848, datetime.datetime(2026, 5, 28, 11, 20, 48), datetime.datetime(2026, 5, 28, 11, 20, 48), 'salt', 11.54, 55.67, None, 3.32, 73.76, 8.55, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:21:09.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:21:09.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:21:09.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:48, diff=21.487681s, valid=True
2026-05-28T11:21:09.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:21:09.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:21:09.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:12, diff=-2.509477s, valid=True
2026-05-28T11:21:09.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:21:09.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:20:44, diff=25.497323s, valid=True
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:21:09.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:21:09.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:12, diff=-2.499629s, valid=True
2026-05-28T11:21:09.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:21:09.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:21:09.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:21:09.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892711.50106s, valid=True
2026-05-28T11:21:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:21:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:21:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:21:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:21:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:21:09.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:21:09.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:21:09.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:21:09.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:21:09.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:21:09.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:21:09.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:21:09.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:21:09.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:21:10.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:21:10.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:21:10.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:21:10.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:21:10.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-28T11:21:10.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-28T11:21:10.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:21:10.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:21:40.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:21:40.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:21:40.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:21:41.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:21:41.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:21:41.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:21:41.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-28T11:21:41.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:21:41.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-28T11:21:41.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:21:41.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:21:41.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:21:41.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:21:44.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-28T11:21:44.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:21:44.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:21:44.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:21:44.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:21:44.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:21:44.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:21:44.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:21:44.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:21:44.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:21:44.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:21:44.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:21:44.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:21:44.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:21:44.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:21:44.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:21:44.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:21:44.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:21:44.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:21:44.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:21:44.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:21:44.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:21:44.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:21:44.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:21:44.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:21:18
2026-05-28T11:21:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68849, datetime.datetime(2026, 5, 28, 11, 21, 18), datetime.datetime(2026, 5, 28, 11, 21, 18), 'salt', 11.51, 56.63, None, 2.76, 56.85, 8.31, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:21:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:21:44.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:21:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:18, diff=26.809662s, valid=True
2026-05-28T11:21:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:21:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:21:44.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:12, diff=32.812559s, valid=True
2026-05-28T11:21:44.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:21:44.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:15, diff=29.819246s, valid=True
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:21:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:21:44.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:21:12, diff=32.82231s, valid=True
2026-05-28T11:21:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:21:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:21:44.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:21:44.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892746.823037s, valid=True
2026-05-28T11:21:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:21:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:21:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:21:44.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:21:44.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:21:44.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:21:44.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:21:44.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:21:44.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:21:44.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:21:45.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:21:45.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:21:45.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:21:45.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:21:45.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:21:45.743 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:21:45.842 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:21:45.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:21:45.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:21:45.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-28T11:21:46.006 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:21:46.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:22:16.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:22:16.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:22:16.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:22:16.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:22:16.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:22:16.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:22:16.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:22:16.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:22:16.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-28T11:22:16.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:22:16.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:22:16.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:22:16.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-28T11:22:18.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-28T11:22:18.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:22:18.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:22:18.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:22:18.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:22:18.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:22:18.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:22:18.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:22:18.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:22:18.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:22:18.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:22:18.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:22:18.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:22:18.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:22:18.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:22:18.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:22:18.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:22:19.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:22:19.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:22:19.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:22:19.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:22:19.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:22:19.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:22:19.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:22:19.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:22:19
2026-05-28T11:22:19.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68851, datetime.datetime(2026, 5, 28, 11, 22, 19), datetime.datetime(2026, 5, 28, 11, 22, 18), 'salt', 11.51, 55.64, None, 4.41, 53.26, 8.56, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:22:19.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:22:19.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:22:19.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:18, diff=1.120664s, valid=True
2026-05-28T11:22:19.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:22:19.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:22:19.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:12, diff=7.123519s, valid=True
2026-05-28T11:22:19.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:22:19.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:14, diff=5.130142s, valid=True
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:12, diff=7.133185s, valid=True
2026-05-28T11:22:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:22:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892781.133855s, valid=True
2026-05-28T11:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:22:19.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:22:19.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:22:19.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:22:19.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:22:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:22:19.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:22:19.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:22:19.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:22:19.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:22:19.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:22:20.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:22:20.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:22:20.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:22:20.237 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:22:20.237 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:22:20.304 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:22:20.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:22:50.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:22:50.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:22:50.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:22:50.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:22:50.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:22:50.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:22:50.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-28T11:22:50.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:22:50.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-28T11:22:50.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:22:50.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:22:50.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:22:50.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-28T11:22:53.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-28T11:22:53.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:22:53.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:22:53.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:22:53.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:22:53.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:22:53.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:22:53.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:22:53.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:22:53.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:22:53.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:22:53.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:22:53.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:22:53.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:22:53.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:22:53.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:22:53.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:22:53.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:22:53.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:22:53.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:22:53.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:22:53.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:22:53.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:22:53.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:22:53.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:22:49
2026-05-28T11:22:53.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68852, datetime.datetime(2026, 5, 28, 11, 22, 49), datetime.datetime(2026, 5, 28, 11, 22, 49), 'salt', 11.57, 56.77, None, 5.82, 62.38, 8.27, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:22:53.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:22:53.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:22:53.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:49, diff=4.840953s, valid=True
2026-05-28T11:22:53.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:22:53.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:22:53.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:12, diff=-18.156168s, valid=True
2026-05-28T11:22:53.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:22:53.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:22:44, diff=9.850522s, valid=True
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:22:53.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:22:53.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:12, diff=-18.146412s, valid=True
2026-05-28T11:22:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:22:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:22:53.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:22:53.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892815.854247s, valid=True
2026-05-28T11:22:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:22:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:22:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:22:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:22:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:22:53.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:22:53.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:22:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:22:53.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:22:53.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:22:54.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:22:54.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:22:54.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:22:54.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:22:54.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:22:54.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:22:54.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:22:54.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:22:54.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-28T11:22:54.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-28T11:22:55.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:22:55.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:23:25.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:23:25.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:23:25.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:23:25.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:23:25.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:23:25.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:23:25.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-28T11:23:25.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:23:25.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-28T11:23:25.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:23:25.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:23:25.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:23:25.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-28T11:23:28.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-28T11:23:28.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:23:28.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:23:28.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:23:28.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:23:28.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:23:28.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:23:28.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:23:28.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:23:28.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:23:28.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:23:28.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:23:28.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:23:28.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:23:28.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:23:28.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:23:28.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:23:28.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:23:28.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:23:28.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:23:28.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:23:28.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:23:28.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:23:28.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:23:28.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:23:19
2026-05-28T11:23:28.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68853, datetime.datetime(2026, 5, 28, 11, 23, 19), datetime.datetime(2026, 5, 28, 11, 23, 19), 'salt', 11.47, 56.53, None, 5.47, 67.1, 8.32, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:23:28.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:23:28.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:23:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:19, diff=9.431981s, valid=True
2026-05-28T11:23:28.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:23:28.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:23:28.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:12, diff=16.434819s, valid=True
2026-05-28T11:23:28.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:23:28.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:14, diff=14.441549s, valid=True
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:23:28.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:23:28.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:23:28.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:12, diff=16.444535s, valid=True
2026-05-28T11:23:28.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:23:28.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:23:28.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:23:28.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892850.445215s, valid=True
2026-05-28T11:23:28.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:23:28.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:23:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:23:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:23:28.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:23:28.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:23:28.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:23:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:23:28.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:23:28.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:23:28.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:23:28.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:23:28.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:23:28.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:23:29.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:23:29.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:23:29.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:23:29.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:23:29.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-28T11:23:29.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-28T11:23:29.525 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:23:29.525 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:23:59.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:23:59.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:23:59.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:24:00.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:24:00.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:24:00.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:24:00.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:24:00.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:24:00.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-28T11:24:00.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:24:00.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:24:00.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:24:00.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-28T11:24:02.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-28T11:24:02.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:24:02.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:24:02.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:24:02.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:24:02.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:24:02.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:24:02.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:24:02.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:24:02.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:24:02.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:24:02.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:24:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:24:02.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:24:02.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:24:03.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:24:03.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:24:03.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:24:03.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:24:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:24:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:24:03.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:24:03.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:24:03.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:24:03.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:23:49
2026-05-28T11:24:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68854, datetime.datetime(2026, 5, 28, 11, 23, 49), datetime.datetime(2026, 5, 28, 11, 23, 49), 'salt', 11.47, 56.3, None, 1.94, 0.95, 8.38, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:24:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:24:03.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:24:03.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:49, diff=14.172713s, valid=True
2026-05-28T11:24:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:24:03.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:24:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:12, diff=-8.824502s, valid=True
2026-05-28T11:24:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:24:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:23:44, diff=19.182261s, valid=True
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:24:03.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:24:03.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:12, diff=-8.814701s, valid=True
2026-05-28T11:24:03.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:24:03.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:24:03.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:24:03.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892885.185971s, valid=True
2026-05-28T11:24:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:24:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:24:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:24:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:24:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:24:03.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:24:03.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:24:03.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:24:03.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:24:03.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:24:03.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:24:03.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:24:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:24:03.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:24:03.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:24:04.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:24:04.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:24:04.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:24:04.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-28T11:24:04.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-28T11:24:04.286 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:24:04.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:24:34.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:24:34.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:24:34.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:24:34.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:24:34.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:24:34.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:24:34.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:24:34.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:24:34.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-28T11:24:34.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:24:34.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:24:34.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:24:34.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-28T11:24:37.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-28T11:24:37.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:24:37.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:24:37.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:24:37.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:24:37.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:24:37.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:24:37.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:24:37.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:24:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:24:37.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:24:37.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:24:37.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:24:37.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:24:37.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:24:37.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:24:37.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:24:37.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:24:37.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:24:37.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:24:37.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:24:37.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:24:37.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:24:37.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:24:37.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:24:20
2026-05-28T11:24:37.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68855, datetime.datetime(2026, 5, 28, 11, 24, 20), datetime.datetime(2026, 5, 28, 11, 24, 19), 'salt', 11.47, 57.0, None, 2.16, 147.75, 8.21, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:24:37.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:24:37.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:24:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:19, diff=18.39319s, valid=True
2026-05-28T11:24:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:24:37.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:24:37.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:12, diff=25.396006s, valid=True
2026-05-28T11:24:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:24:37.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:24:37.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:15, diff=22.402756s, valid=True
2026-05-28T11:24:37.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:24:37.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:24:37.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:24:37.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:24:37.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:24:37.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:24:37.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:12, diff=25.405747s, valid=True
2026-05-28T11:24:37.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:24:37.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:24:37.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:24:37.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892919.406403s, valid=True
2026-05-28T11:24:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:24:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:24:37.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:24:37.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:24:37.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:24:37.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:24:37.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:24:37.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:24:37.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:24:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:24:37.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:24:37.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:24:38.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:24:38.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:24:38.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:24:38.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-28T11:24:38.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-28T11:24:38.454 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:24:38.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:25:08.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:25:08.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:25:08.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:25:08.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:25:08.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:25:09.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:25:09.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:25:09.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:25:09.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-28T11:25:09.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:25:09.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:25:09.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:25:09.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-28T11:25:12.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-28T11:25:12.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:25:12.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:25:12.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:25:12.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:25:12.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:25:12.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:25:12.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:25:12.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:25:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:25:12.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:25:12.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:25:12.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:25:12.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:25:12.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:25:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:25:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:25:12.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:25:12.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:25:12.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:25:12.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:25:12.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:25:12.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:25:12.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:25:12.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:24:50
2026-05-28T11:25:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68856, datetime.datetime(2026, 5, 28, 11, 24, 50), datetime.datetime(2026, 5, 28, 11, 24, 49), 'salt', 11.61, 57.53, None, 5.19, 120.09, 8.09, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:25:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:25:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:25:12.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:49, diff=23.368954s, valid=True
2026-05-28T11:25:12.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:25:12.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:25:12.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:12, diff=0.371822s, valid=True
2026-05-28T11:25:12.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:25:12.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:24:46, diff=26.378552s, valid=True
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:25:12.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:25:12.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:25:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:12, diff=0.381559s, valid=True
2026-05-28T11:25:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:25:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:25:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:25:12.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892954.382215s, valid=True
2026-05-28T11:25:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:25:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:25:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:25:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:25:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:25:12.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:25:12.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:25:12.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:25:12.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:25:12.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:25:12.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:25:12.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:25:12.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:25:12.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:25:12.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:25:13.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:25:13.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:25:13.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:25:13.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-28T11:25:13.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-28T11:25:13.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:25:13.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:25:43.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:25:43.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:25:43.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:25:44.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:25:44.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:25:44.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:25:44.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-28T11:25:44.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:25:44.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-28T11:25:44.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:25:44.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:25:44.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:25: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-28T11:25:46.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-28T11:25:46.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:25:46.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:25:46.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:25:46.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:25:46.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:25:46.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:25:46.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:25:46.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:25:46.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:25:46.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:25:46.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:25:46.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:25:46.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:25:46.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:25:47.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:25:47.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:25:47.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:25:47.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:25:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:25:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:25:47.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:25:47.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:25:47.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:25:47.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:25:20
2026-05-28T11:25:47.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68857, datetime.datetime(2026, 5, 28, 11, 25, 20), datetime.datetime(2026, 5, 28, 11, 25, 20), 'salt', 11.61, 57.3, None, 4.13, 139.4, 8.15, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:25:47.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:25:47.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:25:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:20, diff=27.215134s, valid=True
2026-05-28T11:25:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:25:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:25:47.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:12, diff=35.218056s, valid=True
2026-05-28T11:25:47.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:25:47.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:25:47.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:17, diff=30.224837s, valid=True
2026-05-28T11:25:47.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:25:47.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:25:47.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:25:47.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:25:47.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:25:47.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:25:47.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:25:12, diff=35.227912s, valid=True
2026-05-28T11:25:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:25:47.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:25:47.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:25:47.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=892989.228586s, valid=True
2026-05-28T11:25:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:25:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:25:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:25:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:25:47.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:25:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:25:47.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:25:47.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:25:47.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:25:47.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:25:47.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:25:47.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:25:47.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:25:47.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:25:47.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:25:48.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:25:48.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:25:48.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:25:48.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-28T11:25:48.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-28T11:25:48.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:25:48.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:26:18.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:26:18.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:26:18.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:26:18.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:26:18.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:26:18.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:26:18.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-28T11:26:18.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:26:18.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:26:18.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:26:18.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:26:18.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:26:18.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-28T11:26:21.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-28T11:26:21.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:26:21.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:26:21.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:26:21.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:26:21.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:26:21.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:26:21.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:26:21.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:26:21.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:26:21.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:26:21.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:26:21.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:26:21.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:26:21.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:26:21.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:26:21.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:26:21.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:26:21.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:26:21.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:26:21.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:26:21.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:26:21.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:26:21.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:26:21.783 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:26:20
2026-05-28T11:26:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68859, datetime.datetime(2026, 5, 28, 11, 26, 20), datetime.datetime(2026, 5, 28, 11, 26, 20), 'salt', 11.64, 56.73, None, 3.67, 127.66, 8.29, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:26:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:26:21.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:26:21.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:20, diff=1.789493s, valid=True
2026-05-28T11:26:21.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:26:21.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:26:21.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:12, diff=9.79245s, valid=True
2026-05-28T11:26:21.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:26:21.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:20, diff=1.799297s, valid=True
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:26:21.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:26:21.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:12, diff=9.80241s, valid=True
2026-05-28T11:26:21.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:26:21.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:26:21.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:26:21.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893023.803087s, valid=True
2026-05-28T11:26:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:26:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:26:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:26:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:26:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:26:21.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:26:21.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:26:21.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:26:21.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:26:21.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:26:21.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:26:22.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:26:22.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:26:22.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:26:22.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:26:22.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:26:22.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:26:22.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:26:22.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-28T11:26:22.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-28T11:26:23.091 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:26:23.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:26:53.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:26:53.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:26:53.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:26:53.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:26:53.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:26:53.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:26:53.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-28T11:26:53.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:26:53.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:26:53.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:26:53.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:26:53.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:26:53.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-28T11:26:56.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-28T11:26:56.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:26:56.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:26:56.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:26:56.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:26:56.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:26:56.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:26:56.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:26:56.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:26:56.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:26:56.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:26:56.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:26:56.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:26:56.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:26:56.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:26:56.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:26:56.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:26:56.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:26:56.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:26:56.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:26:56.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:26:56.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:26:56.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:26:56.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:26:56.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:26:51
2026-05-28T11:26:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68860, datetime.datetime(2026, 5, 28, 11, 26, 51), datetime.datetime(2026, 5, 28, 11, 26, 50), 'salt', 11.61, 56.77, None, 1.84, 346.97, 8.28, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:26:56.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:26:56.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:26:56.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:50, diff=6.447172s, valid=True
2026-05-28T11:26:56.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:26:56.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:26:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:12, diff=-15.550012s, valid=True
2026-05-28T11:26:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:26:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:26:46, diff=10.456602s, valid=True
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:26:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:26:56.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:26:56.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:12, diff=-15.54039s, valid=True
2026-05-28T11:26:56.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:26:56.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:26:56.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:26:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893058.460271s, valid=True
2026-05-28T11:26:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:26:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:26:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:26:56.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:26:56.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:26:56.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:26:56.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:26:56.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:26:56.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:26:56.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:26:56.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:26:56.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:26:56.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:26:56.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:26:57.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:26:57.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:26:57.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:26:57.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:26:57.460 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:26:57.460 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:26:57.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:26:57.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:27:27.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:27:27.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:27:27.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:27:27.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:27:27.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:27:28.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:27: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-28T11:27:28.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:27: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-28T11:27:28.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:27:28.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:27:28.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:27: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-28T11:27:30.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-28T11:27:30.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:27:30.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:27:30.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:27:30.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:27:30.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:27:30.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:27:30.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:27:30.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:27:30.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:27:30.410 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:27:30.410 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:27:30.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:27:30.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:27:30.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:27:30.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:27:30.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:27:30.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:27:30.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:27:30.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:27:30.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:27:30.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:27:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:27:30.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:27:30.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:27:21
2026-05-28T11:27:30.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68861, datetime.datetime(2026, 5, 28, 11, 27, 21), datetime.datetime(2026, 5, 28, 11, 27, 20), 'salt', 11.61, 56.4, None, 1.41, 354.76, 8.37, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:27:30.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:27:30.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:27:30.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:20, diff=10.717906s, valid=True
2026-05-28T11:27:30.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:27:30.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:27:30.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:12, diff=18.720779s, valid=True
2026-05-28T11:27:30.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:27:30.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:16, diff=14.727446s, valid=True
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:27:30.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:27:30.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:12, diff=18.730481s, valid=True
2026-05-28T11:27:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:27:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:27:30.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:27:30.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893092.731155s, valid=True
2026-05-28T11:27:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:27:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:27:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:27:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:27:30.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:27:30.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:27:30.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:27:30.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:27:30.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:27:30.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:27:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:27:31.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:27:31.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:27:31.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:27:31.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:27:31.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:27:31.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:27:31.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:27:31.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-28T11:27:31.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-28T11:27:32.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:27:32.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:28:02.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:28:02.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:28:02.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:28:02.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:28:02.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:28:02.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:28:02.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-28T11:28:02.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:28:02.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-28T11:28:02.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:28:02.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:28:02.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:28:02.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-28T11:28:04.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-28T11:28:04.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:28:04.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:28:04.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:28:04.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:28:04.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:28:04.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:28:04.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:28:04.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:28:04.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:28:04.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:28:04.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:28:04.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:28:05.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:28:05.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:28:05.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:28:05.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:28:05.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:28:05.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:28:05.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:28:05.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:28:05.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:28:05.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:28:05.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:28:05.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:27:51
2026-05-28T11:28:05.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68862, datetime.datetime(2026, 5, 28, 11, 27, 51), datetime.datetime(2026, 5, 28, 11, 27, 51), 'salt', 11.67, 56.5, None, 1.8, 1.2, 8.35, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:28:05.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:28:05.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:28:05.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:51, diff=14.257122s, valid=True
2026-05-28T11:28:05.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:28:05.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:28:05.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:12, diff=-6.740051s, valid=True
2026-05-28T11:28:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:28:05.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:28:05.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:27:46, diff=19.26666s, valid=True
2026-05-28T11:28:05.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:28:05.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:28:05.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:28:05.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:28:05.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:28:05.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:28:05.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:12, diff=-6.730338s, valid=True
2026-05-28T11:28:05.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:28:05.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:28:05.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:28:05.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893127.270314s, valid=True
2026-05-28T11:28:05.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:28:05.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:28:05.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:28:05.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:28:05.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:28:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:28:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:28:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:28:05.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:28:05.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:28:05.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:28:05.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:28:05.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:28:05.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:28:05.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:28:06.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:28:06.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:28:06.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:28:06.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-28T11:28:06.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-28T11:28:06.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:28:06.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:28:36.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:28:36.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:28: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-28T11:28:36.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:28:36.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:28:37.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:28: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-28T11:28:37.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:28:37.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-28T11:28:37.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:28:37.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:28:37.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:28:37.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:28:39.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-28T11:28:39.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:28:39.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:28:39.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:28:39.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:28:39.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:28:39.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:28:39.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:28:39.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:28:39.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:28:39.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:28:39.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:28:39.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:28:39.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:28:39.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:28:40.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:28:40.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:28:40.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:28:40.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:28:40.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-28T11:28:40.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:28:40.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:28:40.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:28:40.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:28:40.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:28:21
2026-05-28T11:28:40.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68863, datetime.datetime(2026, 5, 28, 11, 28, 21), datetime.datetime(2026, 5, 28, 11, 28, 21), 'salt', 11.64, 56.86, None, 2.9, 274.93, 8.26, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:28:40.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:28:40.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:28:40.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:21, diff=19.176764s, valid=True
2026-05-28T11:28:40.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:28:40.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:28:40.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:12, diff=28.179652s, valid=True
2026-05-28T11:28:40.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:28:40.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:16, diff=24.186372s, valid=True
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:28:40.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-28T11:28:40.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:12, diff=28.189449s, valid=True
2026-05-28T11:28:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:28:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:28:40.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:28:40.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893162.190118s, valid=True
2026-05-28T11:28:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:28:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:28:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:28:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:28:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:28:40.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:28:40.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:28:40.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:28:40.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:28:40.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:28:40.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:28:40.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:28:40.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:28:40.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:28:40.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:28:41.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:28:41.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:28:41.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:28:41.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-28T11:28:41.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-28T11:28:41.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:28:41.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:29:11.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:29:11.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:29:11.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:29:11.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:29:11.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:29:11.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:29:11.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-28T11:29:11.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:29:11.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-28T11:29:11.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:29:11.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:29:11.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:29:11.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-28T11:29:14.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-28T11:29:14.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:29:14.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:29:14.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:29:14.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:29:14.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:29:14.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:29:14.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:29:14.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:29:14.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:29:14.953 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:29:14.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:29:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:29:15.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:29:15.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:29:15.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:29:15.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:29:15.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:29:15.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:29:15.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:29:15.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:29:15.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:29:15.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:29:15.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:29:15.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:28:52
2026-05-28T11:29:15.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68864, datetime.datetime(2026, 5, 28, 11, 28, 52), datetime.datetime(2026, 5, 28, 11, 28, 51), 'salt', 11.67, 56.13, None, 3.18, 191.14, 8.44, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:29:15.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:29:15.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:29:15.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:51, diff=24.272935s, valid=True
2026-05-28T11:29:15.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:29:15.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:29:15.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:12, diff=3.275844s, valid=True
2026-05-28T11:29:15.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:29:15.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:29:15.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:28:47, diff=28.282673s, valid=True
2026-05-28T11:29:15.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:29:15.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:29:15.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:29:15.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:29:15.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:29:15.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:29:15.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:12, diff=3.28576s, valid=True
2026-05-28T11:29:15.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:29:15.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:29:15.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:29:15.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893197.28643s, valid=True
2026-05-28T11:29:15.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:29:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:29:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:29:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:29:15.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:29:15.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:29:15.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:29:15.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:29:15.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:29:15.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:29:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:29:15.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:29:15.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:29:15.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:29:15.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:29:16.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:29:16.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:29:16.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:29:16.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-28T11:29:16.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-28T11:29:16.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:29:16.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:29:46.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:29:46.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:29:46.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:29:46.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:29:46.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:29:46.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:29:46.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-28T11:29:46.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:29:46.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-28T11:29:46.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:29:46.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:29:46.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:29:46.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-28T11:29:49.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-28T11:29:49.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:29:49.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:29:49.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:29:49.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:29:49.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:29:49.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:29:49.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:29:49.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:29:49.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:29:49.493 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:29:49.493 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:29:49.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:29:49.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:29:49.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:29:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:29:49.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:29:49.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:29:49.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:29:49.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T11:29:49.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:29:49.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:29:49.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:29:49.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:29:49.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:29:22
2026-05-28T11:29:49.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68865, datetime.datetime(2026, 5, 28, 11, 29, 22), datetime.datetime(2026, 5, 28, 11, 29, 21), 'salt', 11.7, 55.84, None, 2.9, 206.22, 8.51, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:29:49.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:29:49.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:29:49.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:21, diff=28.815361s, valid=True
2026-05-28T11:29:49.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:29:49.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:29:49.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:12, diff=37.818239s, valid=True
2026-05-28T11:29:49.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:29:49.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:18, diff=31.825157s, valid=True
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:29:49.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T11:29:49.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:29:12, diff=37.828346s, valid=True
2026-05-28T11:29:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:29:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:29:49.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:29:49.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893231.829072s, valid=True
2026-05-28T11:29:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:29:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:29:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:29:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:29:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:29:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:29:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:29:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:29:49.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:29:50.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:29:50.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:29:50.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:29:50.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:29:50.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:29:50.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:29:50.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:29:50.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:29:50.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:29:50.867 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:29:50.867 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:29:51.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:29:51.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:30:21.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:30:21.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:30:21.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:30:21.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:30:21.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:30:21.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:30:21.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-28T11:30:21.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:30:21.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-28T11:30:21.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:30:21.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:30:21.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:30:21.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:30:23.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-28T11:30:23.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:30:23.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:30:23.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:30:23.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:30:23.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:30:23.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:30:23.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:30:23.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:30:23.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:30:23.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:30:23.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:30:23.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:30:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:30:24.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:30:24.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:30:24.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:30:24.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:30:24.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:30:24.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:30:24.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:30:24.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:30:24.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:30:24.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:30:24.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:30:22
2026-05-28T11:30:24.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68867, datetime.datetime(2026, 5, 28, 11, 30, 22), datetime.datetime(2026, 5, 28, 11, 30, 22), 'salt', 11.7, 38.56, None, 5.68, 210.86, 13.64, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:30:24.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:30:24.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:30:24.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:22, diff=2.288084s, valid=True
2026-05-28T11:30:24.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:30:24.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:30:24.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:12, diff=12.290895s, valid=True
2026-05-28T11:30:24.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:30:24.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:21, diff=3.297606s, valid=True
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:30:24.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:30:24.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:30:24.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:12, diff=12.300582s, valid=True
2026-05-28T11:30:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:30:24.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:30:24.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:30:24.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893266.301245s, valid=True
2026-05-28T11:30:24.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:30:24.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:30:24.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:30:24.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:30:24.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:30:24.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:30:24.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:30:24.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:30:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:30:24.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:30:24.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:30:24.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:30:24.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:30:24.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:30:24.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:30:25.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:30:25.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:30:25.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:30:25.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-28T11:30:25.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-28T11:30:25.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:30:25.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:30:55.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:30:55.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:30:55.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:30:55.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:30:55.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:30:56.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:30:56.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-28T11:30:56.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:30:56.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-28T11:30:56.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:30:56.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:30:56.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:30:56.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:30:59.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-28T11:30:59.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:30:59.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:30:59.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:30:59.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:30:59.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:30:59.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:30:59.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:30:59.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:30:59.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:30:59.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:30:59.466 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:30:59.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:30:59.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:30:59.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:30:59.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:30:59.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:30:59.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:30:59.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:30:59.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:30:59.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:30:59.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:30:59.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:30:59.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:30:59.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:30:52
2026-05-28T11:30:59.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68868, datetime.datetime(2026, 5, 28, 11, 30, 52), datetime.datetime(2026, 5, 28, 11, 30, 52), 'salt', 11.9, 34.45, None, 5.58, 184.64, 15.18, 830.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:30:59.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:30:59.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:30:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:52, diff=7.791313s, valid=True
2026-05-28T11:30:59.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:30:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:30:59.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:12, diff=-12.20582s, valid=True
2026-05-28T11:30:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:30:59.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:30:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:30:48, diff=11.800937s, valid=True
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:30:59.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:30:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:12, diff=-12.196034s, valid=True
2026-05-28T11:30:59.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:30:59.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:30:59.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:30:59.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893301.804639s, valid=True
2026-05-28T11:30:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:30:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:30:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:30:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:30:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:30:59.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:30:59.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:30:59.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:30:59.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:30:59.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:31:00.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:31:00.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:31:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:31:00.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:31:00.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:31:00.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:31:00.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:31:00.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:31:00.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-28T11:31:00.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-28T11:31:01.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:31:01.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:31:31.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:31:31.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:31:31.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:31:31.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:31:31.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:31:31.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:31:31.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-28T11:31:31.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:31:31.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-28T11:31:31.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:31:31.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:31:31.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:31:31.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-28T11:31:34.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-28T11:31:34.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:31:34.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:31:34.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:31:34.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:31:34.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:31:34.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:31:34.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:31:34.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:31:34.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:31:34.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:31:34.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:31:34.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:31:34.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:31:34.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:31:34.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:31:34.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:31:34.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:31:34.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:31:34.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:31:34.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:31:34.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:31:34.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:31:34.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:31:34.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:31:23
2026-05-28T11:31:34.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68869, datetime.datetime(2026, 5, 28, 11, 31, 23), datetime.datetime(2026, 5, 28, 11, 31, 22), 'salt', 12.07, 32.46, None, 5.47, 181.24, 16.0, 830.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:31:34.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:31:34.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:31:34.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:22, diff=12.403022s, valid=True
2026-05-28T11:31:34.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:31:34.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:31:34.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:12, diff=22.405855s, valid=True
2026-05-28T11:31:34.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:31:34.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:18, diff=16.412526s, valid=True
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:31:34.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:31:34.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:12, diff=22.415538s, valid=True
2026-05-28T11:31:34.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:31:34.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:31:34.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:31:34.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893336.416208s, valid=True
2026-05-28T11:31:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:31:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:31:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:31:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:31:34.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:31:34.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:31:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:31:34.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:31:34.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:31:34.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:31:34.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:31:34.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:31:34.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:31:34.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:31:35.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:31:35.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:31:35.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:31:35.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:31:35.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-28T11:31:35.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-28T11:31:35.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:31:35.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:32:05.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:32:05.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:32:05.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:32:06.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:32:06.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:32:06.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:32:06.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-28T11:32:06.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:32:06.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-28T11:32:06.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:32:06.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:32:06.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:32:06.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-28T11:32:08.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-28T11:32:08.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:32:08.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:32:08.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:32:08.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:32:08.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:32:08.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:32:08.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:32:08.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:32:08.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:32:08.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:32:08.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:32:08.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:32:08.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:32:08.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:32:09.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:32:09.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:32:09.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:32:09.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:32:09.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:32:09.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:32:09.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:32:09.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:32:09.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:32:09.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:31:53
2026-05-28T11:32:09.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68870, datetime.datetime(2026, 5, 28, 11, 31, 53), datetime.datetime(2026, 5, 28, 11, 31, 52), 'salt', 12.33, 30.7, None, 4.1, 222.59, 16.77, 830.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:32:09.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:32:09.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:32:09.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:52, diff=17.160289s, valid=True
2026-05-28T11:32:09.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:32:09.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:32:09.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:12, diff=-2.836816s, valid=True
2026-05-28T11:32:09.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:32:09.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:31:48, diff=21.170024s, valid=True
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:32:09.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:32:09.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:12, diff=-2.826879s, valid=True
2026-05-28T11:32:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:32:09.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:32:09.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:32:09.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893371.173796s, valid=True
2026-05-28T11:32:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:32:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:32:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:32:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:32:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:32:09.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:32:09.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:32:09.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:32:09.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:32:09.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:32:09.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:32:09.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:32:09.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:32:09.492 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:32:09.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:32:10.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:32:10.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:32:10.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:32:10.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-28T11:32:10.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-28T11:32:10.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:32:10.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:32:40.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:32:40.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:32:40.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:32:40.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:32:40.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:32:40.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:32:40.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-28T11:32:40.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:32:40.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-28T11:32:40.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:32:40.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:32:41.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:32:41.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-28T11:32:43.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:32:43.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:32:43.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:32:43.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:32:43.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:32:43.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:32:43.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:32:43.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:32:43.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:32:43.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:32:43.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:32:43.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:32:43.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:32:43.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:32:43.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:32:43.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:32:43.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:32:43.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:32:43.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:32:43.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:32:43.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:32:43.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:32:43.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:32:43.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:32:43.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:32:23
2026-05-28T11:32:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68871, datetime.datetime(2026, 5, 28, 11, 32, 23), datetime.datetime(2026, 5, 28, 11, 32, 23), 'salt', 12.43, 31.6, None, 7.31, 216.82, 16.4, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:32:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:32:43.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:32:43.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:23, diff=20.711323s, valid=True
2026-05-28T11:32:43.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:32:43.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:32:43.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:12, diff=31.714196s, valid=True
2026-05-28T11:32:43.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:32:43.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:32:43.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:18, diff=25.720807s, valid=True
2026-05-28T11:32:43.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:32:43.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:32:43.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:32:43.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:32:43.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:32:43.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:32:43.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:12, diff=31.723885s, valid=True
2026-05-28T11:32:43.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:32:43.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:32:43.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:32:43.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893405.724533s, valid=True
2026-05-28T11:32:43.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:32:43.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:32:43.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:32:43.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:32:43.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:32:43.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:32:43.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:32:43.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:32:43.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:32:43.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:32:43.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:32:44.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:32:44.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:32:44.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:32:44.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:32:44.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:32:44.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:32:44.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:32:44.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-28T11:32:44.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-28T11:32:44.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:32:44.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:33:14.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:33:14.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:33:14.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:33:15.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:33:15.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:33:15.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:33:15.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-28T11:33:15.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:33:15.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:33:15.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:33:15.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:33:15.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:33:15.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:33: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-28T11:33:18.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:33:18.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:33:18.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:33:18.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:33:18.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:33:18.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:33:18.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:33:18.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:33:18.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:33:18.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:33:18.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:33:18.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:33:18.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:33:18.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:33:18.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:33:18.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:33:18.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:33:18.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:33:18.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:33:18.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:33:18.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:33:18.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:33:18.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:33:18.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:32:53
2026-05-28T11:33:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68872, datetime.datetime(2026, 5, 28, 11, 32, 53), datetime.datetime(2026, 5, 28, 11, 32, 53), 'salt', 12.63, 29.18, None, 7.91, 227.51, 17.48, 830.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:33:18.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:33:18.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:33:18.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:53, diff=25.409336s, valid=True
2026-05-28T11:33:18.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:33:18.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:33:18.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:12, diff=6.41218s, valid=True
2026-05-28T11:33:18.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:33:18.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:33:18.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:32:49, diff=29.418875s, valid=True
2026-05-28T11:33:18.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:33:18.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:33:18.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:33:18.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:33:18.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:33:18.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:33:18.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:12, diff=6.42189s, valid=True
2026-05-28T11:33:18.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:33:18.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:33:18.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:33:18.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893440.42255s, valid=True
2026-05-28T11:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:33:18.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:33:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:33:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:33:18.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:33:18.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:33:18.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:33:18.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:33:18.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:33:18.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:33:18.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:33:19.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:33:19.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:33:19.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:33:19.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-28T11:33:19.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-28T11:33:19.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:33:19.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:33:49.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:33:49.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:33:49.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:33:49.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:33:49.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:33:50.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:33:50.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-28T11:33:50.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:33:50.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-28T11:33:50.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:33:50.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:33:50.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:33:50.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-28T11:33:52.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-28T11:33:52.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:33:52.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:33:52.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:33:52.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:33:52.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:33:52.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:33:52.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:33:52.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:33:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:33:52.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:33:52.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:33:52.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:33:52.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:33:52.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:33:52.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:33:52.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:33:52.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:33:52.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:33:52.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:33:52.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:33:52.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:33:52.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:33:52.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:33:52.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:33:23
2026-05-28T11:33:52.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68873, datetime.datetime(2026, 5, 28, 11, 33, 23), datetime.datetime(2026, 5, 28, 11, 33, 23), 'salt', 12.66, 29.48, None, 8.89, 218.34, 17.35, 830.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:33:52.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:33:52.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:33:52.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:23, diff=29.909174s, valid=True
2026-05-28T11:33:52.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:33:52.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:33:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:12, diff=40.911992s, valid=True
2026-05-28T11:33:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:33:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:19, diff=33.918529s, valid=True
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:33:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:33:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:33:12, diff=40.921511s, valid=True
2026-05-28T11:33:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:33:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:33:52.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:33:52.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893474.922181s, valid=True
2026-05-28T11:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:33:52.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:33:52.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:33:52.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:33:52.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:33:53.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:33:53.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:33:53.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:33:53.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:33:53.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:33:53.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:33:53.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:33:53.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:33:53.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:33:53.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:33:53.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-28T11:33:53.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-28T11:33:54.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:33:54.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:34:24.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:34:24.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:34:24.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:34:24.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:34:24.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:34:24.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:34:24.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-28T11:34:24.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:34:24.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-28T11:34:24.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:34:24.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:34:24.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:34:24.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-28T11:34:27.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-28T11:34:27.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:34:27.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:34:27.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:34:27.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:34:27.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:34:27.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:34:27.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:34:27.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:34:27.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:34:27.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:34:27.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:34:27.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:34:27.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:34:27.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:34:27.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:34:27.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:34:27.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:34:27.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:34:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:34:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:34:27.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:34:27.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:34:27.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:34:27.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:34:24
2026-05-28T11:34:27.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68875, datetime.datetime(2026, 5, 28, 11, 34, 24), datetime.datetime(2026, 5, 28, 11, 34, 23), 'salt', 12.73, 29.31, None, 11.5, 219.42, 17.44, 830.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:34:27.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:34:27.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:34:27.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:23, diff=4.575988s, valid=True
2026-05-28T11:34:27.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:34:27.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:34:27.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:12, diff=15.578816s, valid=True
2026-05-28T11:34:27.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:34:27.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:22, diff=5.585434s, valid=True
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:34:27.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:34:27.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:12, diff=15.588467s, valid=True
2026-05-28T11:34:27.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:34:27.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:34:27.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:34:27.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893509.589137s, valid=True
2026-05-28T11:34:27.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:34:27.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:34:27.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:34:27.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:34:27.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:34:27.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:34:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:34:27.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:34:27.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:34:27.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:34:27.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:34:27.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:34:27.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:34:27.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:34:28.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:34:28.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:34:28.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:34:28.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:34:28.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-28T11:34:28.758 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:34:29.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:34:29.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:34:59.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:34:59.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:34:59.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:34:59.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:34:59.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:34:59.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:34:59.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-28T11:34:59.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:34:59.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-28T11:34:59.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:34:59.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:34:59.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:34:59.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-28T11:35:02.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:35:02.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:35:02.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:35:02.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:35:02.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:35:02.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:35:02.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:35:02.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:35:02.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:35:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:35:02.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:35:02.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:35:02.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:35:02.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:35:02.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:35:02.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:35:02.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:35:02.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:35:02.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:35:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:35:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:35:02.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:35:02.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:35:02.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:35:02.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:34:55
2026-05-28T11:35:02.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68876, datetime.datetime(2026, 5, 28, 11, 34, 55), datetime.datetime(2026, 5, 28, 11, 34, 54), 'salt', 12.76, 28.02, None, 9.35, 236.1, 18.04, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:35:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:35:02.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:35:02.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:54, diff=8.533928s, valid=True
2026-05-28T11:35:02.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:35:02.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:35:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:12, diff=-9.462723s, valid=True
2026-05-28T11:35:02.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:35:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:34:54, diff=8.545111s, valid=True
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:35:02.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:35:02.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:12, diff=-9.451274s, valid=True
2026-05-28T11:35:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:35:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:35:02.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:35:02.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893544.549492s, valid=True
2026-05-28T11:35:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:35:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:35:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:35:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:35:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:35:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:35:02.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:35:02.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:35:02.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:35:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:35:02.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:35:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:35:02.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:35:02.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:35:03.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:35:03.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:35:03.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:35:03.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:35:03.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-28T11:35:03.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-28T11:35:03.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:35:03.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:35:33.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:35:33.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:35:33.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:35:34.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:35:34.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:35:34.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:35:34.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-28T11:35:34.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:35:34.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-28T11:35:34.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:35:34.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:35:34.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:35:34.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-28T11:35:36.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-28T11:35:36.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:35:36.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:35:36.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:35:36.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:35:36.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:35:36.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:35:36.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:35:36.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:35:36.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:35:36.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:35:36.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:35:36.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:35:36.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:35:36.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:35:37.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:35:37.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:35:37.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:35:37.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:35:37.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:35:37.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:35:37.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:35:37.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:35:37.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:35:37.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:35:25
2026-05-28T11:35:37.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68877, datetime.datetime(2026, 5, 28, 11, 35, 25), datetime.datetime(2026, 5, 28, 11, 35, 25), 'salt', 12.8, 29.11, None, 11.01, 222.93, 17.54, 830.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:35:37.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:35:37.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:35:37.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:25, diff=12.166872s, valid=True
2026-05-28T11:35:37.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:35:37.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:35:37.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:12, diff=25.169762s, valid=True
2026-05-28T11:35:37.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:35:37.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:20, diff=17.176355s, valid=True
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:35:37.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:35:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:12, diff=25.179385s, valid=True
2026-05-28T11:35:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:35:37.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:35:37.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:35:37.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893579.180052s, valid=True
2026-05-28T11:35:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:35:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:35:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:35:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:35:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:35:37.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:35:37.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:35:37.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:35:37.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:35:37.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:35:37.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:35:37.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:35:37.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:35:37.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:35:37.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:35:38.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:35:38.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:35:38.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:35:38.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-28T11:35:38.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-28T11:35:38.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:35:38.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:36:08.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:36:08.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:36:08.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:36:08.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:36:09.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:36:09.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:36:09.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-28T11:36:09.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:36:09.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-28T11:36:09.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:36:09.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:36:09.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:36:09.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-28T11:36: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-28T11:36:11.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:36:11.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:36:11.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:36:11.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:36:11.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:36:12.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:36:12.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:36:12.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:36:12.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:36:12.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:36:12.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:36:12.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:36:12.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:36:12.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:36:12.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:36:12.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:36:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:36:12.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:36:12.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:36:12.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:36:12.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:36:12.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:36:12.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:36:12.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:35:55
2026-05-28T11:36:12.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68878, datetime.datetime(2026, 5, 28, 11, 35, 55), datetime.datetime(2026, 5, 28, 11, 35, 55), 'salt', 12.99, 28.41, None, 10.27, 239.57, 17.88, 830.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:36:12.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:36:12.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:36:12.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:55, diff=17.327636s, valid=True
2026-05-28T11:36:12.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:36:12.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:36:12.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:12, diff=0.330502s, valid=True
2026-05-28T11:36:12.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:36:12.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:35:50, diff=22.33721s, valid=True
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:36:12.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:36:12.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:12, diff=0.34024s, valid=True
2026-05-28T11:36:12.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:36:12.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:36:12.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:36:12.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893614.340899s, valid=True
2026-05-28T11:36:12.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:36:12.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:36:12.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:36:12.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:36:12.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:36:12.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:36:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:36:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:36:12.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:36:12.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:36:12.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:36:12.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:36:12.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:36:12.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:36:12.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:36:13.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:36:13.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:36:13.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:36: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-28T11:36: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-28T11:36:13.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:36:13.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:36:43.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:36:43.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:36:43.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:36:44.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:36:44.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:36:44.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:36:44.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-28T11:36:44.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:36:44.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-28T11:36:44.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:36:44.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:36:44.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:36:44.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-28T11:36:46.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:36:46.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:36:46.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:36:46.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:36:46.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:36:46.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:36:46.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:36:46.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:36:46.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:36:46.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:36:46.758 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:36:46.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:36:46.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:36:46.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:36:46.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:36:46.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:36:46.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:36:46.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:36:46.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:36:47.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:36:47.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:36:47.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:36:47.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:36:47.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:36:47.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:36:25
2026-05-28T11:36:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68879, datetime.datetime(2026, 5, 28, 11, 36, 25), datetime.datetime(2026, 5, 28, 11, 36, 25), 'salt', 12.83, 28.38, None, 9.46, 235.55, 17.88, 830.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:36:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:36:47.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:36:47.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:25, diff=22.081614s, valid=True
2026-05-28T11:36:47.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:36:47.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:36:47.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:12, diff=35.084499s, valid=True
2026-05-28T11:36:47.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:36:47.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:20, diff=27.091339s, valid=True
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:36:47.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:36:47.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:12, diff=35.09439s, valid=True
2026-05-28T11:36:47.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:36:47.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:36:47.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:36:47.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893649.095064s, valid=True
2026-05-28T11:36:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:36:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:36:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:36:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:36:47.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:36:47.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:36:47.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:36:47.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:36:47.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:36:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:36:47.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:36:47.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:36:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:36:47.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:36:47.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:36:48.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:36:48.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:36:48.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:36:48.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-28T11:36:48.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-28T11:36:48.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:36:48.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:37:18.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:37:18.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:37:18.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:37:19.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:37:19.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:37:19.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:37:19.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-28T11:37:19.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:37:19.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:37:19.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:37:19.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:37:19.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:37:19.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-28T11:37:22.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-28T11:37:22.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:37:22.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:37:22.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:37:22.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:37:22.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:37:22.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:37:22.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:37:22.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:37:22.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:37:22.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:37:22.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:37:22.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:37:22.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:37:22.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:37:22.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:37:22.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:37:22.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:37:22.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:37:22.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:37:22.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:37:22.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:37:22.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:37:22.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:37:22.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:36:55
2026-05-28T11:37:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68880, datetime.datetime(2026, 5, 28, 11, 36, 55), datetime.datetime(2026, 5, 28, 11, 36, 55), 'salt', 12.89, 27.52, None, 12.56, 216.55, 18.29, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:37:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:37:22.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:37:22.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:55, diff=27.487505s, valid=True
2026-05-28T11:37:22.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:37:22.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:37:22.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:37:12, diff=10.4904s, valid=True
2026-05-28T11:37:22.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:37:22.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:36:51, diff=31.497062s, valid=True
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:37:22.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:37:22.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:37:12, diff=10.500068s, valid=True
2026-05-28T11:37:22.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:37:22.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:37:22.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:37:22.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893684.500721s, valid=True
2026-05-28T11:37:22.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:37:22.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:37:22.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:37:22.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:37:22.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:37:22.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:37:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:37:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:37:22.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:37:22.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:37:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:37:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:37:22.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:37:22.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:37:23.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:37:23.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:37:23.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:37:23.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:37:23.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-28T11:37:23.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-28T11:37:23.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:37:23.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:37:53.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:37:53.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:37: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-28T11:37:53.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:37:53.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:37:54.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:37:54.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-28T11:37:54.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:37:54.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-28T11:37:54.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:37:54.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:37:54.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:37:54.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-28T11:37: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-28T11:37:56.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:37:56.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:37:56.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:37:56.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:37:56.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:37:56.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:37:56.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:37:56.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:37:56.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:37:56.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:37:56.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:37:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:37:56.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:37:56.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:37:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:37:56.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:37:56.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:37:56.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:37:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:37:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:37:56.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:37:56.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:37:56.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:37:57.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:37:56
2026-05-28T11:37:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68882, datetime.datetime(2026, 5, 28, 11, 37, 56), datetime.datetime(2026, 5, 28, 11, 37, 56), 'salt', 12.96, 27.25, None, 11.26, 215.43, 18.43, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:37:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:37:57.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:37:57.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:37:56, diff=1.059471s, valid=True
2026-05-28T11:37:57.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:37:57.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:37:57.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:12, diff=-14.937645s, valid=True
2026-05-28T11:37:57.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:37:57.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:37:57.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:37:53, diff=4.068918s, valid=True
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:37:57.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:37:57.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:12, diff=-14.928127s, valid=True
2026-05-28T11:37:57.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:37:57.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:37:57.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:37:57.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893719.072524s, valid=True
2026-05-28T11:37:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:37:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:37:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:37:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:37:57.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:37:57.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:37:57.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:37:57.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:37:57.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:37:57.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:37:57.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:37:57.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:37:57.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:37:57.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:37:57.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:37:57.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:37:58.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:37:58.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:37:58.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-28T11:37:58.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-28T11:37:58.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:37:58.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:38:28.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:38:28.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:38:28.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:38:28.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:38:28.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:38:28.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:38:28.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-28T11:38:28.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:38:28.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-28T11:38:28.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:38:28.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:38:28.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:38:28.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-28T11:38:31.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-28T11:38:31.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:38:31.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:38:31.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:38:31.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:38:31.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:38:31.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:38:31.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:38:31.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:38:31.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:38:31.463 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:38:31.463 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:38:31.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:38:31.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:38:31.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:38:31.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:38:31.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:38:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:38:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:38:31.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:38:31.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:38:31.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:38:31.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:38:31.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:38:31.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:38:26
2026-05-28T11:38:31.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68883, datetime.datetime(2026, 5, 28, 11, 38, 26), datetime.datetime(2026, 5, 28, 11, 38, 26), 'salt', 12.96, 26.29, None, 8.47, 205.95, 18.9, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:38:31.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:38:31.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:38:31.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:26, diff=5.775348s, valid=True
2026-05-28T11:38:31.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:38:31.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:38:31.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:12, diff=19.778204s, valid=True
2026-05-28T11:38:31.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:38:31.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:24, diff=7.784997s, valid=True
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:38:31.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:38:31.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:12, diff=19.788007s, valid=True
2026-05-28T11:38:31.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:38:31.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:38:31.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:38:31.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893753.788675s, valid=True
2026-05-28T11:38:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:38:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:38:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:38:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:38:31.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:38:31.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:38:31.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:38:31.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:38:31.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:38:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:38:31.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:38:32.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:38:32.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:38:32.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:38:32.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:38:32.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:38:32.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:38:32.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:38:32.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-28T11:38:32.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-28T11:38:33.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:38:33.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:39:03.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:39:03.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:39:03.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:39:03.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:39:03.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:39:03.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:39:03.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-28T11:39:03.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:39:03.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-28T11:39:03.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:39:03.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:39:03.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:39:03.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-28T11:39:05.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-28T11:39:05.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:39:05.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:39:05.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:39:05.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:39:05.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:39:05.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:39:05.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:39:05.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:39:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:39:05.830 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:39:05.830 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:39:05.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:39:05.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:39:05.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:39:06.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:39:06.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:39:06.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:39:06.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:39:06.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:39:06.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:39:06.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:39:06.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:39:06.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:39:06.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:38:56
2026-05-28T11:39:06.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68884, datetime.datetime(2026, 5, 28, 11, 38, 56), datetime.datetime(2026, 5, 28, 11, 38, 56), 'salt', 12.79, 26.13, None, 8.08, 194.05, 18.96, 830.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:39:06.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:39:06.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:39:06.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:56, diff=10.151979s, valid=True
2026-05-28T11:39:06.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:39:06.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:39:06.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:12, diff=-5.845133s, valid=True
2026-05-28T11:39:06.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:39:06.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:39:06.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:38:55, diff=11.161669s, valid=True
2026-05-28T11:39:06.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:39:06.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:39:06.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:39:06.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:39:06.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:39:06.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:39:06.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:12, diff=-5.835233s, valid=True
2026-05-28T11:39:06.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:39:06.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:39:06.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:39:06.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893788.165428s, valid=True
2026-05-28T11:39:06.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:39:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:39:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:39:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:39:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:39:06.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:39:06.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:39:06.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:39:06.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:39:06.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:39:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:39:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:39:06.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:39:06.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:39:06.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:39:07.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:39:07.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:39:07.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:39:07.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-28T11:39:07.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-28T11:39:07.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:39:07.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:39:37.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:39:37.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:39:37.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:39:37.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:39:37.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:39:37.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:39:37.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-28T11:39:37.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:39:37.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-28T11:39:37.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:39:37.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:39:37.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:39:37.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-28T11:39:41.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:39:41.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:39:41.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:39:41.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:39:41.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:39:41.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:39:41.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:39:41.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:39:41.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:39:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:39:41.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:39:41.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:39:41.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:39:41.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:39:41.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:39:41.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:39:41.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:39:41.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:39:41.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:39:41.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:39:41.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:39:41.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:39:41.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:39:41.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:39:41.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:39:26
2026-05-28T11:39:41.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68885, datetime.datetime(2026, 5, 28, 11, 39, 26), datetime.datetime(2026, 5, 28, 11, 39, 26), 'salt', 12.89, 29.54, None, 10.13, 193.68, 17.35, 830.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:39:41.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:39:41.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:39:41.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:26, diff=15.394225s, valid=True
2026-05-28T11:39:41.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:39:41.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:39:41.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:12, diff=29.397536s, valid=True
2026-05-28T11:39:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:39:41.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:22, diff=19.404262s, valid=True
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:39:41.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:39:41.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:12, diff=29.407336s, valid=True
2026-05-28T11:39:41.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:39:41.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:39:41.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:39:41.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893823.408014s, valid=True
2026-05-28T11:39:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:39:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:39:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:39:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:39:41.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:39:41.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:39:41.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:39:41.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:39:41.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:39:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:39:41.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:39:41.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:39:41.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:39:41.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:39:42.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:39:42.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:39:42.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:39:42.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:39:42.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-28T11:39:42.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-28T11:39:42.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:39:42.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:40:12.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:40:12.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:40:12.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:40:12.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:40:12.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:40:13.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:40:13.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-28T11:40:13.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:40:13.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:40:13.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:40:13.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:40:13.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:40:13.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-28T11:40:15.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-28T11:40:15.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:40:15.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:40:15.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:40:15.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:40:15.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:40:15.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:40:15.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:40:15.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:40:15.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:40:15.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:40:15.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:40:15.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:40:15.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:40:15.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:40:15.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:40:15.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:40:15.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:40:15.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:40:15.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:40:15.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:40:16.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:40:16.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:40:16.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:40:16.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:39:57
2026-05-28T11:40:16.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68886, datetime.datetime(2026, 5, 28, 11, 39, 57), datetime.datetime(2026, 5, 28, 11, 39, 56), 'salt', 13.03, 30.1, None, 8.47, 211.46, 17.13, 830.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:40:16.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:40:16.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:40:16.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:56, diff=20.063746s, valid=True
2026-05-28T11:40:16.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:40:16.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:40:16.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:12, diff=4.066579s, valid=True
2026-05-28T11:40:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:40:16.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:39:52, diff=24.073371s, valid=True
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:40:16.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:40:16.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:12, diff=4.07642s, valid=True
2026-05-28T11:40:16.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:40:16.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:40:16.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:40:16.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893858.077091s, valid=True
2026-05-28T11:40:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:40:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:40:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:40:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:40:16.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:40:16.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:40:16.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:40:16.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:40:16.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:40:16.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:40:16.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:40:16.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:40:16.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:40:16.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:40:16.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:40:16.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:40:17.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:40:17.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:40:17.042 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:40:17.042 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:40:17.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:40:17.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:40:47.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:40:47.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:40:47.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:40:47.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:40:47.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:40:47.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:40:47.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-28T11:40:47.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:40:47.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-28T11:40:47.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:40:47.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:40:47.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:40:47.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-28T11:40:50.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:40:50.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:40:50.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:40:50.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:40:50.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:40:50.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:40:50.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:40:50.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:40:50.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:40:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:40:50.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:40:50.149 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:40:50.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:40:50.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:40:50.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:40:50.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:40:50.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:40:50.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:40:50.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:40:50.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:40:50.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:40:50.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:40:50.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:40:50.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:40:50.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:40:27
2026-05-28T11:40:50.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68887, datetime.datetime(2026, 5, 28, 11, 40, 27), datetime.datetime(2026, 5, 28, 11, 40, 27), 'salt', 12.93, 29.77, None, 12.49, 216.57, 17.26, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:40:50.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:40:50.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:40:50.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:27, diff=23.465862s, valid=True
2026-05-28T11:40:50.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:40:50.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:40:50.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:12, diff=38.468695s, valid=True
2026-05-28T11:40:50.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:40:50.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:22, diff=28.475272s, valid=True
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:40:50.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:40:50.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:12, diff=38.47832s, valid=True
2026-05-28T11:40:50.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:40:50.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:40:50.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:40:50.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893892.478979s, valid=True
2026-05-28T11:40:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:40:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:40:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:40:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:40:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:40:50.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:40:50.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:40:50.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:40:50.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:40:50.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:40:50.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:40:50.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:40:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:40:50.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:40:51.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:40:51.406 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:40:51.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:40:51.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:40:51.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-28T11:40:51.508 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:40:51.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:40:51.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:41:21.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:41:21.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:41:21.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:41:21.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:41:21.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:41:22.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:41:22.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-28T11:41:22.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:41:22.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-28T11:41:22.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:41:22.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:41:22.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:41:22.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-28T11:41:24.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-28T11:41:24.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:41:24.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:41:24.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:41:24.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:41:24.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:41:24.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:41:24.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:41:24.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:41:24.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:41:24.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:41:24.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:41:24.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:41:24.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:41:24.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:41:24.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:41:24.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:41:24.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:41:24.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:41:24.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:41:24.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:41:24.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:41:24.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:41:24.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:41:24.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:40:57
2026-05-28T11:41:24.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68888, datetime.datetime(2026, 5, 28, 11, 40, 57), datetime.datetime(2026, 5, 28, 11, 40, 57), 'salt', 13.03, 31.79, None, 12.28, 237.44, 16.4, 830.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:41:24.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:41:24.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:41:24.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:57, diff=27.914875s, valid=True
2026-05-28T11:41:24.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:41:24.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:41:24.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:41:12, diff=12.917841s, valid=True
2026-05-28T11:41:24.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:41:24.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:41:24.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:40:53, diff=31.924795s, valid=True
2026-05-28T11:41:24.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:41:24.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:41:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:41:24.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:41:24.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:41:24.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:41:24.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:41:12, diff=12.927931s, valid=True
2026-05-28T11:41:24.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:41:24.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:41:24.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:41:24.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893926.92859s, valid=True
2026-05-28T11:41:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:41:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:41:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:41:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:41:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:41:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:41:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:41:24.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:41:25.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:41:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:41:25.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:41:25.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:41:25.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:41:25.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:41:25.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:41:25.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:41:25.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:41:25.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:41:25.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:41:25.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:41:26.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:41:26.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:41:56.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:41:56.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:41:56.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:41:56.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:41:56.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:41:56.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:41:56.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-28T11:41:56.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:41:56.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-28T11:41:56.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:41:56.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:41:56.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:41:56.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-28T11:41:59.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-28T11:41:59.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:41:59.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:41:59.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:41:59.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:41:59.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:41:59.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:41:59.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:41:59.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:41:59.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:41:59.173 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:41:59.173 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:41:59.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:41:59.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:41:59.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:41:59.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:41:59.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:41:59.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:41:59.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:41:59.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:41:59.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:41:59.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:41:59.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:41:59.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:41:59.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:41:58
2026-05-28T11:41:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68890, datetime.datetime(2026, 5, 28, 11, 41, 58), datetime.datetime(2026, 5, 28, 11, 41, 57), 'salt', 12.89, 31.63, None, 7.41, 220.81, 16.44, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:41:59.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:41:59.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:41:59.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:41:57, diff=2.486859s, valid=True
2026-05-28T11:41:59.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:41:59.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:41:59.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:12, diff=-12.510291s, valid=True
2026-05-28T11:41:59.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:41:59.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:41:54, diff=5.496449s, valid=True
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:41:59.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:41:59.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:12, diff=-12.500483s, valid=True
2026-05-28T11:41:59.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:41:59.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:41:59.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:41:59.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893961.500176s, valid=True
2026-05-28T11:41:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:41:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:41:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:41:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:41:59.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:41:59.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:41:59.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:41:59.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:41:59.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:41:59.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:41:59.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:41:59.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:41:59.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:41:59.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:42:00.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:42:00.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:42:00.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:42:00.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:42:00.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-28T11:42:00.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-28T11:42:00.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:42:00.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:42:30.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:42:30.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:42:30.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:42:31.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:42:31.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:42:31.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:42:31.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-28T11:42:31.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:42:31.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-28T11:42:31.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:42:31.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:42:31.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:42:31.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:42:33.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-28T11:42:33.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:42:33.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:42:33.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:42:33.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:42:33.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:42:33.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:42:33.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:42:33.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:42:33.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:42:33.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:42:33.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:42:33.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:42:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:42:34.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:42:34.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:42:34.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:42:34.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:42:34.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:42:34.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:42:34.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:42:34.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:42:34.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:42:34.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:42:34.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:42:28
2026-05-28T11:42:34.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68891, datetime.datetime(2026, 5, 28, 11, 42, 28), datetime.datetime(2026, 5, 28, 11, 42, 27), 'salt', 12.93, 29.54, None, 9.64, 213.57, 17.37, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:42:34.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:42:34.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:42:34.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:27, diff=7.301904s, valid=True
2026-05-28T11:42:34.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:42:34.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:42:34.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:12, diff=22.304804s, valid=True
2026-05-28T11:42:34.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:42:34.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:42:34.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:26, diff=8.311875s, valid=True
2026-05-28T11:42:34.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:42:34.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:42:34.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:42:34.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:42:34.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:42:34.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:42:34.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:12, diff=22.314884s, valid=True
2026-05-28T11:42:34.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:42:34.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:42:34.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:42:34.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=893996.315521s, valid=True
2026-05-28T11:42:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:42:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:42:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:42:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:42:34.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:42:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:42:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:42:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:42:34.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:42:34.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:42:34.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:42:34.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:42:34.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:42:34.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:42:34.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:42:35.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:42:35.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:42:35.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:42:35.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-28T11:42:35.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-28T11:42:35.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:42:35.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:43:05.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:43:05.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:43:05.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:43:05.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:43:05.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:43:06.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:43:06.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-28T11:43:06.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:43:06.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-28T11:43:06.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:43:06.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:43:06.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:43:06.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-28T11:43:08.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-28T11:43:08.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:43:08.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:43:08.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:43:08.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:43:08.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:43:08.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:43:08.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:43:08.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:43:08.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:43:08.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:43:08.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:43:08.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:43:08.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:43:08.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:43:08.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:43:08.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:43:09.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:43:09.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:43:09.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:43:09.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:43:09.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:43:09.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:43:09.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:43:09.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:42:58
2026-05-28T11:43:09.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68892, datetime.datetime(2026, 5, 28, 11, 42, 58), datetime.datetime(2026, 5, 28, 11, 42, 58), 'salt', 13.02, 30.3, None, 9.81, 218.16, 17.03, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:43:09.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:43:09.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:43:09.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:58, diff=11.10813s, valid=True
2026-05-28T11:43:09.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:43:09.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:43:09.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:12, diff=-2.888976s, valid=True
2026-05-28T11:43:09.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:43:09.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:43:09.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:42:57, diff=12.117698s, valid=True
2026-05-28T11:43:09.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:43:09.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:43:09.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:43:09.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:43:09.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:43:09.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:43:09.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:12, diff=-2.879312s, valid=True
2026-05-28T11:43:09.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:43:09.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:43:09.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:43:09.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894031.12133s, valid=True
2026-05-28T11:43:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:43:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:43:09.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:43:09.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:43:09.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:43:09.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:43:09.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:43:09.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:43:09.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:43:09.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:43:09.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:43:09.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:43:09.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:43:09.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:43:09.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:43:10.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:43:10.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:43:10.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:43:10.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-28T11:43:10.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-28T11:43:11.315 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:43:11.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:43:41.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:43:41.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:43:41.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:43:41.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:43:41.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:43:41.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:43:41.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:43:41.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:43:41.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-28T11:43:41.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:43:41.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:43:41.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:43:41.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-28T11:43:44.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-28T11:43:44.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:43:44.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:43:44.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:43:44.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:43:44.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:43:44.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:43:44.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:43:44.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:43:44.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:43:44.263 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:43:44.263 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:43:44.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:43:44.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:43:44.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:43:44.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:43:44.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:43:44.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:43:44.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:43:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:43:44.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:43:44.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:43:44.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:43:44.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:43:44.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:43:28
2026-05-28T11:43:44.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68893, datetime.datetime(2026, 5, 28, 11, 43, 28), datetime.datetime(2026, 5, 28, 11, 43, 28), 'salt', 13.12, 29.71, None, 10.27, 206.74, 17.31, 830.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:43:44.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:43:44.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:43:44.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:28, diff=16.580049s, valid=True
2026-05-28T11:43:44.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:43:44.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:43:44.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:12, diff=32.582857s, valid=True
2026-05-28T11:43:44.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:43:44.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:24, diff=20.589571s, valid=True
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:43:44.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:43:44.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:43:44.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:12, diff=32.592593s, valid=True
2026-05-28T11:43:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:43:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:43:44.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:43:44.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894066.593256s, valid=True
2026-05-28T11:43:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:43:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:43:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:43:44.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:43:44.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:43:44.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:43:44.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:43:44.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:43:44.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:43:44.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:43:44.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:43:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:43:44.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:43:44.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:43:45.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:43:45.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:43:45.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:43:45.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:43:45.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-28T11:43:45.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-28T11:43:45.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:43:45.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:44:15.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:44:15.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:44:15.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:44:16.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:44:16.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:44:16.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:44:16.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-28T11:44:16.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:44:16.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-28T11:44:16.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:44:16.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:44:16.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:44:16.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-28T11:44:18.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-28T11:44:18.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:44:18.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:44:18.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:44:18.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:44:18.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:44:18.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:44:18.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:44:18.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:44:18.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:44:18.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:44:18.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:44:18.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:44:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:44:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:44:19.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:44:19.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:44:19.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:44:19.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:44:19.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:44:19.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:44:19.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:44:19.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:44:19.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:44:19.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:43:58
2026-05-28T11:44:19.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68894, datetime.datetime(2026, 5, 28, 11, 43, 58), datetime.datetime(2026, 5, 28, 11, 43, 58), 'salt', 13.16, 31.1, None, 14.33, 207.51, 16.71, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:44:19.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:44:19.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:44:19.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:58, diff=21.282926s, valid=True
2026-05-28T11:44:19.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:44:19.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:44:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:12, diff=7.285719s, valid=True
2026-05-28T11:44:19.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:44:19.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:43:54, diff=25.292143s, valid=True
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:44:19.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:44:19.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:12, diff=7.295185s, valid=True
2026-05-28T11:44:19.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:44:19.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:44:19.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:44:19.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894101.295837s, valid=True
2026-05-28T11:44:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:44:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:44:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:44:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:44:19.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:44:19.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:44:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:44:19.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:44:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:44:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:44:19.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:44:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:44:19.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:44:19.614 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:44:19.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:44:20.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:44:20.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:44:20.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:44:20.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-28T11:44:20.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-28T11:44:20.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:44:20.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:44:50.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:44:50.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:44:50.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:44:50.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:44:50.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:44:51.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:44:51.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-28T11:44:51.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:44: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-28T11:44:51.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:44:51.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:44:51.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:44:51.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-28T11:44:53.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-28T11:44:53.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:44:53.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:44:53.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:44:53.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:44:53.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:44:53.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:44:53.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:44:53.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:44:53.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:44:53.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:44:53.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:44:53.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:44:53.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:44:53.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:44:53.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:44:53.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:44:54.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:44:54.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:44:54.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:44:54.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:44:54.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:44:54.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:44:54.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:44:54.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:44:28
2026-05-28T11:44:54.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68895, datetime.datetime(2026, 5, 28, 11, 44, 28), datetime.datetime(2026, 5, 28, 11, 44, 28), 'salt', 13.22, 31.16, None, 12.14, 212.93, 16.68, 830.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:44:54.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:44:54.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:44:54.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:28, diff=26.116254s, valid=True
2026-05-28T11:44:54.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:44:54.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:44:54.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:12, diff=42.119095s, valid=True
2026-05-28T11:44:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:44:54.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:44:54.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:25, diff=29.125849s, valid=True
2026-05-28T11:44:54.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:44:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:44:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:44:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:44:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:44:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:44:54.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:12, diff=42.128917s, valid=True
2026-05-28T11:44:54.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:44:54.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:44:54.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:44:54.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894136.129578s, valid=True
2026-05-28T11:44:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:44:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:44:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:44:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:44:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:44:54.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:44:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:44:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:44:54.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:44:54.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:44:54.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:44:54.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:44:54.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:44:54.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:44:54.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:44:55.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:44:55.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:44:55.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:44:55.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-28T11:44:55.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-28T11:44:55.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:44:55.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:45:25.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:45:25.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:45:25.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:45:25.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:45:25.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:45:25.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:45:25.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-28T11:45:25.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:45:25.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-28T11:45:25.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:45:25.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:45:25.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:45:25.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-28T11:45:28.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-28T11:45:28.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:45:28.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:45:28.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:45:28.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:45:28.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:45:28.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:45:28.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:45:28.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:45:28.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:45:28.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:45:28.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:45:28.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:45:28.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:45:28.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:45:28.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:45:28.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:45:28.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:45:28.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:45:28.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:45:28.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:45:28.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:45:28.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:45:28.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:45:28.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:44:59
2026-05-28T11:45:28.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68896, datetime.datetime(2026, 5, 28, 11, 44, 59), datetime.datetime(2026, 5, 28, 11, 44, 58), 'salt', 13.02, 29.51, None, 10.52, 226.61, 17.39, 830.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:45:28.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:45:28.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:45:28.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:58, diff=30.81499s, valid=True
2026-05-28T11:45:28.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:45:28.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:45:28.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:45:12, diff=16.819538s, valid=True
2026-05-28T11:45:28.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:45:28.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:45:28.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:44:55, diff=33.826942s, valid=True
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:45:28.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:45:28.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:45:12, diff=16.830153s, valid=True
2026-05-28T11:45:28.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:45:28.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:45:28.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:45:28.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894170.830839s, valid=True
2026-05-28T11:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:45:28.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:45:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:45:28.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:45:28.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:45:28.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:45:29.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:45:29.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:45:29.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:45:29.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:45:29.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:45:29.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:45:30.003 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:45:30.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:45:30.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-28T11:45:30.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-28T11:45:30.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:45:30.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:46:00.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:46:00.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:46:00.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:46:00.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:46:00.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:46:00.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:46:00.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-28T11:46:00.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:46:00.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-28T11:46:00.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:46:00.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:46:00.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:46:00.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-28T11:46:03.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-28T11:46:03.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:46:03.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:46:03.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:46:03.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:46:03.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:46:03.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:46:03.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:46:03.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:46:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:46:03.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:46:03.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:46:03.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:46:03.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:46:03.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:46:03.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:46:03.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:46:03.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:46:03.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:46:03.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:46:03.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:46:03.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:46:03.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:46:03.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:46:03.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:45:59
2026-05-28T11:46:03.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68898, datetime.datetime(2026, 5, 28, 11, 45, 59), datetime.datetime(2026, 5, 28, 11, 45, 59), 'salt', 12.92, 31.4, None, 10.41, 225.66, 16.55, 830.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:46:03.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:46:03.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:46:03.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:45:59, diff=4.803529s, valid=True
2026-05-28T11:46:03.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:46:03.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:46:03.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:12, diff=-8.193582s, valid=True
2026-05-28T11:46:03.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:46:03.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:45:55, diff=8.813144s, valid=True
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:46:03.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:46:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:12, diff=-8.18384s, valid=True
2026-05-28T11:46:03.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:46:03.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:46:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:46:03.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894205.816828s, valid=True
2026-05-28T11:46:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:46:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:46:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:46:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:46:03.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:46:03.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:46:03.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:46:03.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:46:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:46:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:46:04.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:46:04.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:46:04.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:46:04.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:46:04.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:46:04.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:46:04.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:46:04.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:46:04.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:46:04.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-28T11:46:04.951 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:46:04.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:46:34.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:46:34.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:46:34.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:46:35.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:46:35.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:46:35.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:46:35.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-28T11:46:35.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:46:35.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-28T11:46:35.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:46:35.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:46:35.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:46:35.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-28T11:46:38.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-28T11:46:38.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:46:38.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:46:38.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:46:38.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:46:38.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:46:38.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:46:38.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:46:38.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:46:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:46:38.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:46:38.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:46:38.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:46:38.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:46:38.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:46:38.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:46:38.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:46:38.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:46:38.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:46:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:46:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:46:38.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:46:38.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:46:38.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:46:38.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:46:29
2026-05-28T11:46:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68899, datetime.datetime(2026, 5, 28, 11, 46, 29), datetime.datetime(2026, 5, 28, 11, 46, 29), 'salt', 12.89, 31.86, None, 9.71, 244.24, 16.35, 830.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:46:38.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:46:38.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:46:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:29, diff=9.497492s, valid=True
2026-05-28T11:46:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:46:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:46:38.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:12, diff=26.50056s, valid=True
2026-05-28T11:46:38.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:46:38.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:26, diff=12.50748s, valid=True
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:46:38.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:46:38.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:12, diff=26.510614s, valid=True
2026-05-28T11:46:38.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:46:38.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:46:38.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:46:38.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894240.511279s, valid=True
2026-05-28T11:46:38.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:46:38.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:46:38.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:46:38.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:46:38.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:46:38.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:46:38.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:46:38.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:46:38.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:46:38.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:46:38.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:46:38.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:46:38.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:46:38.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:46:39.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:46:39.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:46:39.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:46:39.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:46:39.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-28T11:46:39.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-28T11:46:39.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:46:39.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:47:09.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:47:09.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:47:09.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:47:09.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:47:09.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:47:10.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:47:10.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-28T11:47:10.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:47:10.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-28T11:47:10.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:47:10.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:47:10.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:47:10.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-28T11:47:12.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:47:12.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:47:12.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:47:12.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:47:12.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:47:12.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:47:12.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:47:12.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:47:12.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:47:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:47:12.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:47:12.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:47:12.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:47:12.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:47:12.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:47:13.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:47:13.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:47:13.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:47:13.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:47:13.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:47:13.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:47:13.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:47:13.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:47:13.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:47:13.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:47:00
2026-05-28T11:47:13.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68900, datetime.datetime(2026, 5, 28, 11, 47), datetime.datetime(2026, 5, 28, 11, 46, 59), 'salt', 13.06, 33.88, None, 9.71, 251.49, 15.55, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:47:13.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:47:13.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:47:13.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:59, diff=14.231135s, valid=True
2026-05-28T11:47:13.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:47:13.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:47:13.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:12, diff=1.233987s, valid=True
2026-05-28T11:47:13.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:47:13.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:47:13.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:46:58, diff=15.240728s, valid=True
2026-05-28T11:47:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:47:13.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:47:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:47:13.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:47:13.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:47:13.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:47:13.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:12, diff=1.243753s, valid=True
2026-05-28T11:47:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:47:13.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:47:13.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:47:13.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894275.2444s, valid=True
2026-05-28T11:47:13.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:47:13.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:47:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:47:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:47:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:47:13.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:47:13.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:47:13.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:47:13.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:47:13.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:47:13.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:47:13.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:47:13.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:47:13.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:47:13.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:47:14.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:47:14.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:47:14.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:47:14.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-28T11:47:14.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-28T11:47:14.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:47:14.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:47:44.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:47:44.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:47:44.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:47:44.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:47:44.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:47:44.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:47:44.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-28T11:47:44.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:47:44.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-28T11:47:44.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:47:44.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:47:44.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:47:44.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-28T11:47: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-28T11:47:47.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:47:47.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:47:47.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:47:47.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:47:47.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:47:47.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:47:47.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:47:47.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:47:47.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:47:47.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:47:47.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:47:47.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:47:47.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:47:47.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:47:47.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:47:47.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:47:47.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:47:47.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:47:47.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:47:47.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:47:47.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:47:47.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:47:47.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:47:47.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:47:30
2026-05-28T11:47:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68901, datetime.datetime(2026, 5, 28, 11, 47, 30), datetime.datetime(2026, 5, 28, 11, 47, 29), 'salt', 13.29, 33.42, None, 8.08, 231.92, 15.76, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:47:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:47:47.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:47:47.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:29, diff=18.752429s, valid=True
2026-05-28T11:47:47.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:47:47.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:47:47.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:12, diff=35.755311s, valid=True
2026-05-28T11:47:47.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:47:47.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:29, diff=18.762122s, valid=True
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:47:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:47:47.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:12, diff=35.765177s, valid=True
2026-05-28T11:47:47.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:47:47.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:47:47.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:47:47.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894309.765847s, valid=True
2026-05-28T11:47:47.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:47:47.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:47:47.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:47:47.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:47:47.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:47:47.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:47:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:47:47.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:47:47.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:47:47.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:47:47.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:47:47.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:47:48.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:47:48.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:47:48.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:47:48.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:47:48.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:47:48.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:47:48.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-28T11:47:48.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-28T11:47:48.958 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:47:48.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:48:18.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:48:18.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:48:18.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:48:19.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:48:19.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:48:19.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:48:19.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-28T11:48:19.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:48:19.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-28T11:48:19.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:48:19.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:48:19.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:48:19.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-28T11:48:21.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-28T11:48:21.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:48:21.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:48:21.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:48:21.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:48:21.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:48:21.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:48:21.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:48:21.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:48:21.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:48:21.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:48:21.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:48:21.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:48:22.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:48:22.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:48:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:48:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:48:22.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:48:22.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:48:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:48:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:48:22.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:48:22.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:48:22.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:48:22.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:48:00
2026-05-28T11:48:22.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68902, datetime.datetime(2026, 5, 28, 11, 48), datetime.datetime(2026, 5, 28, 11, 48), 'salt', 13.35, 33.88, None, 6.81, 231.78, 15.57, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:48:22.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:48:22.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:48:22.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:00, diff=22.312112s, valid=True
2026-05-28T11:48:22.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:48:22.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:48:22.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:12, diff=10.315051s, valid=True
2026-05-28T11:48:22.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:48:22.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:48:22.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:47:56, diff=26.321733s, valid=True
2026-05-28T11:48:22.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:48:22.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:48:22.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:48:22.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:48:22.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:48:22.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:48:22.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:12, diff=10.324825s, valid=True
2026-05-28T11:48:22.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:48:22.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:48:22.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:48:22.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894344.325483s, valid=True
2026-05-28T11:48:22.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:48:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:48:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:48:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:48:22.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:48:22.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:48:22.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:48:22.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:48:22.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:48:22.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:48:22.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:48:22.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:48:22.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:48:22.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:48:22.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:48:23.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:48:23.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:48:23.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:48:23.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-28T11:48:23.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-28T11:48:23.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:48:23.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:48:53.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:48:53.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:48:53.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:48:53.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:48:53.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:48:53.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:48:53.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-28T11:48:53.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:48:53.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-28T11:48:53.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:48:53.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:48:53.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:48:53.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-28T11:48:56.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:48:56.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:48:56.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:48:56.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:48:56.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:48:56.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:48:56.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:48:56.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:48:56.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:48:56.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:48:56.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:48:56.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:48:56.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:48:56.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:48:56.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:48:56.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:48:56.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:48:56.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:48:56.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:48:56.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:48:56.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:48:56.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:48:56.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:48:56.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:48:56.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:48:30
2026-05-28T11:48:56.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68903, datetime.datetime(2026, 5, 28, 11, 48, 30), datetime.datetime(2026, 5, 28, 11, 48, 30), 'salt', 13.39, 32.69, None, 8.01, 221.23, 16.07, 830.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:48:56.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:48:56.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:48:56.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:30, diff=26.989866s, valid=True
2026-05-28T11:48:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:48:56.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:48:56.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:12, diff=44.992688s, valid=True
2026-05-28T11:48:56.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:48:56.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:27, diff=29.999298s, valid=True
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:48:56.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:48:57.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:48:12, diff=45.002324s, valid=True
2026-05-28T11:48:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:48:57.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:48:57.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:48:57.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894379.002999s, valid=True
2026-05-28T11:48:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:48:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:48:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:48:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:48:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:48:57.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:48:57.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:48:57.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:48:57.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:48:57.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:48:57.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:48:57.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:48:57.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:48:57.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:48:57.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:48:57.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:48:58.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:48:58.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:48:58.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-28T11:48:58.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-28T11:48:58.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:48:58.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:49:28.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:49:28.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:49:28.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:49:28.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:49:28.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:49:28.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:49:28.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:49:28.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:49:28.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-28T11:49:28.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:49:28.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:49:28.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:49:28.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-28T11:49:31.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:49:31.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:49:31.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:49:31.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:49:31.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:49:31.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:49:31.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:49:31.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:49:31.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:49:31.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:49:31.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:49:31.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:49:31.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:49:31.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:49:31.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:49:31.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:49:31.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:49:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:49:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:49:31.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:49:31.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:49:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:49:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:49:31.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:49:31.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:49:31
2026-05-28T11:49:31.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68905, datetime.datetime(2026, 5, 28, 11, 49, 31), datetime.datetime(2026, 5, 28, 11, 49, 30), 'salt', 13.32, 30.77, None, 6.39, 213.16, 16.87, 830.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:49:31.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:49:31.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:49:31.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:49:30, diff=1.450385s, valid=True
2026-05-28T11:49:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:49:31.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:49:31.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:49:12, diff=19.453268s, valid=True
2026-05-28T11:49:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:49:31.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:49:27, diff=4.460125s, valid=True
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:49:31.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:49:31.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:49:12, diff=19.463205s, valid=True
2026-05-28T11:49:31.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:49:31.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:49:31.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:49:31.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894413.463873s, valid=True
2026-05-28T11:49:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:49:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:49:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:49:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:49:31.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:49:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:49:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:49:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:49:31.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:49:31.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:49:31.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:49:31.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:49:31.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:49:31.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:49:32.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:49:32.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:49:32.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:49:32.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:49:32.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-28T11:49:32.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-28T11:49:33.424 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:49:33.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:50:03.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:50:03.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:50:03.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:50:03.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:50:03.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:50:04.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:50:04.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-28T11:50:04.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:50:04.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-28T11:50:04.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:50:04.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:50:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:50:04.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-28T11:50:06.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-28T11:50:06.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:50:06.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:50:06.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:50:06.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:50:06.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:50:06.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:50:06.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:50:06.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:50:06.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:50:06.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:50:06.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:50:06.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:50:06.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:50:06.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:50:06.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:50:06.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:50:06.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:50:06.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:50:06.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:50:06.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:50:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:50:06.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:50:06.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:50:06.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:50:01
2026-05-28T11:50:06.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68906, datetime.datetime(2026, 5, 28, 11, 50, 1), datetime.datetime(2026, 5, 28, 11, 50), 'salt', 13.22, 31.26, None, 5.54, 200.19, 16.64, 830.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:50:06.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:50:06.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:50:06.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:00, diff=6.736731s, valid=True
2026-05-28T11:50:06.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:50:06.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:50:06.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:12, diff=-5.26047s, valid=True
2026-05-28T11:50:06.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:50:06.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:49:57, diff=9.746247s, valid=True
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:50:06.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:50:06.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:12, diff=-5.250729s, valid=True
2026-05-28T11:50:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:50:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:50:06.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:50:06.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894448.749938s, valid=True
2026-05-28T11:50:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:50:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:50:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:50:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:50:06.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:50:06.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:50:06.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:50:06.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:50:06.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:50:06.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:50:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:50:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:50:07.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:50:07.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:50:07.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:50:07.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:50:07.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:50:07.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:50:07.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-28T11:50:07.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-28T11:50:07.922 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:50:07.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:50:37.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:50:37.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:50:37.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:50:38.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:50:38.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:50:38.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:50:38.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-28T11:50:38.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:50:38.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-28T11:50:38.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:50:38.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:50:38.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:50:38.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-28T11:50:42.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-28T11:50:42.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:50:42.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:50:42.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:50:42.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:50:42.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:50:42.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:50:42.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:50:42.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:50:42.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:50:42.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:50:42.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:50:42.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:50:42.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:50:42.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:50:42.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:50:42.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:50:42.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:50:42.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:50:42.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:50:42.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:50:42.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:50:42.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:50:42.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:50:42.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:50:31
2026-05-28T11:50:42.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68907, datetime.datetime(2026, 5, 28, 11, 50, 31), datetime.datetime(2026, 5, 28, 11, 50, 31), 'salt', 13.22, 32.49, None, 4.98, 234.52, 16.13, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:50:42.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:50:42.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:50:42.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:31, diff=11.415386s, valid=True
2026-05-28T11:50:42.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:50:42.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:50:42.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:12, diff=30.418277s, valid=True
2026-05-28T11:50:42.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:50:42.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:50:42.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:28, diff=14.424964s, valid=True
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:50:42.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:50:42.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:12, diff=30.427997s, valid=True
2026-05-28T11:50:42.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:50:42.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:50:42.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:50:42.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894484.428651s, valid=True
2026-05-28T11:50:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:50:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:50:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:50:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:50:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:50:42.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:50:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:50:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:50:42.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:50:42.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:50:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:50:42.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:50:42.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:50:42.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:50:42.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:50:43.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:50:43.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:50:43.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:50:43.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-28T11:50:43.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-28T11:50:43.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:50:43.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:51:13.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:51:13.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:51:13.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:51:14.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:51:14.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:51:14.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:51:14.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-28T11:51:14.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:51:14.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-28T11:51:14.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:51:14.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:51:14.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:51:14.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:51:16.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-28T11:51:16.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:51:16.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:51:16.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:51:16.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:51:16.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:51:16.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:51:16.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:51:16.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:51:16.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:51:16.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:51:16.757 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:51:16.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:51:16.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:51:16.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:51:16.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:51:16.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:51:16.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:51:16.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:51:17.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:51:17.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:51:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:51:17.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:51:17.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:51:17.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:51:01
2026-05-28T11:51:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68908, datetime.datetime(2026, 5, 28, 11, 51, 1), datetime.datetime(2026, 5, 28, 11, 51, 1), 'salt', 13.19, 31.93, None, 7.02, 239.43, 16.36, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:51:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:51:17.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:51:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:01, diff=16.141527s, valid=True
2026-05-28T11:51:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:51:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:51:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:12, diff=5.144382s, valid=True
2026-05-28T11:51:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:51:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:50:58, diff=19.151031s, valid=True
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:51:17.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:51:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:12, diff=5.154063s, valid=True
2026-05-28T11:51:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:51:17.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:51:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:51:17.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894519.154732s, valid=True
2026-05-28T11:51:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:51:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:51:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:51:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:51:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:51:17.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:51:17.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:51:17.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:51:17.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:51:17.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:51:17.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:51:17.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:51:17.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:51:17.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:51:17.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:51:18.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:51:18.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:51:18.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:51:18.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-28T11:51:18.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-28T11:51:18.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:51:18.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:51:48.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:51:48.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:51:48.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:51:48.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:51:48.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:51:48.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:51:48.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-28T11:51:48.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:51:48.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:51:48.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:51:48.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:51:48.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:51:48.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:51:51.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-28T11:51:51.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:51:51.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:51:51.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:51:51.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:51:51.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:51:51.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:51:51.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:51:51.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:51:51.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:51:51.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:51:51.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:51:51.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:51:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:51:51.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:51:51.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:51:51.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:51:51.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:51:51.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:51:51.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:51:51.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:51:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:51:51.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:51:51.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:51:51.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:51:31
2026-05-28T11:51:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68909, datetime.datetime(2026, 5, 28, 11, 51, 31), datetime.datetime(2026, 5, 28, 11, 51, 31), 'salt', 13.32, 37.46, None, 6.0, 200.63, 14.21, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:51:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:51:51.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:51:51.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:31, diff=20.694902s, valid=True
2026-05-28T11:51:51.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:51:51.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:51:51.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:12, diff=39.69783s, valid=True
2026-05-28T11:51:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:51:51.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:30, diff=21.705033s, valid=True
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:51:51.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:51:51.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:51:12, diff=39.708131s, valid=True
2026-05-28T11:51:51.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:51:51.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:51:51.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:51:51.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894553.708837s, valid=True
2026-05-28T11:51:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:51:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:51:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:51:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:51:51.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:51:51.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:51:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:51:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:51:51.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:51:51.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:51:51.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:51:51.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:51:52.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:51:52.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:51:52.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:51:52.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:51:52.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:51:52.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:51:52.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-28T11:51:52.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-28T11:51:53.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:51:53.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:52:23.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:52:23.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:52:23.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:52:23.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:52:23.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:52:23.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:52:23.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-28T11:52:23.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:52: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-28T11:52:23.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:52:23.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:52:23.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:52:23.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-28T11:52:26.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:52:26.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:52:26.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:52:26.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:52:26.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:52:26.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:52:26.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:52:26.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:52:26.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:52:26.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:52:26.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:52:26.336 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:52:26.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:52:26.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T11:52:26.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:52:26.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T11:52:26.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:52:26.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:52:26.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:52:26.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T11:52:26.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:52:26.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:52:26.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:52:26.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:52:26.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:52:02
2026-05-28T11:52:26.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68910, datetime.datetime(2026, 5, 28, 11, 52, 2), datetime.datetime(2026, 5, 28, 11, 52, 1), 'salt', 13.32, 35.84, None, 6.53, 193.95, 14.81, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:52:26.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:52:26.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T11:52:26.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:01, diff=25.65657s, valid=True
2026-05-28T11:52:26.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:52:26.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:52:26.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=14.659416s, valid=True
2026-05-28T11:52:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:52:26.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:01, diff=25.666087s, valid=True
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:52:26.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T11:52:26.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=14.6691s, valid=True
2026-05-28T11:52:26.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:52:26.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:52:26.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:52:26.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894588.669752s, valid=True
2026-05-28T11:52:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:52:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:52:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:52:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:52:26.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:52:26.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:52:26.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:52:26.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:52:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:52:26.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:52:26.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:52:26.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:52:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:52:26.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:52:27.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:52:27.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:52:27.687 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:52:27.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:52:27.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-28T11:52:27.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-28T11:52:27.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:52:27.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:52:57.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:52:57.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:52:57.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:52:58.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:52:58.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:52:58.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:52:58.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-28T11:52:58.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:52:58.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-28T11:52:58.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:52:58.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:52:58.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:52:58.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-28T11:53:02.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:53:02.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:53:02.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:53:02.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:53:02.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:53:02.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:53:02.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:53:02.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:53:02.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:53:02.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:53:02.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:53:02.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:53:02.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:53:02.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:53:02.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:53:02.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:53:02.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:53:02.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:53:02.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:53:02.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:53:02.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:53:02.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:53:02.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:53:02.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:53:02.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:52:32
2026-05-28T11:53:02.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68911, datetime.datetime(2026, 5, 28, 11, 52, 32), datetime.datetime(2026, 5, 28, 11, 52, 31), 'salt', 13.12, 37.03, None, 3.14, 265.67, 14.34, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:53:02.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:53:02.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:53:02.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:53:02, diff=0.400238s, valid=True
2026-05-28T11:53:02.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:53:02.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:53:02.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=50.403603s, valid=True
2026-05-28T11:53:02.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:53:02.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:59, diff=3.412122s, valid=True
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:53:02.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:53:02.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=50.415771s, valid=True
2026-05-28T11:53:02.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:53:02.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:53:02.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:53:02.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894624.416541s, valid=True
2026-05-28T11:53:02.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:53:02.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:53:02.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:53:02.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:53:02.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:53:02.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:53:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:53:02.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:53:02.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:53:02.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:53:02.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:53:02.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:53:02.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:53:02.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:53:03.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:53:03.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:53:03.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:53:03.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:53:03.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-28T11:53:03.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-28T11:53:03.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:53:03.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:53:33.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:53:33.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:53:33.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:53:34.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:53:34.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:53:34.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:53:34.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-28T11:53:34.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:53:34.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-28T11:53:34.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:53:34.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:53:34.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:53:34.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-28T11:53:36.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-28T11:53:36.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:53:36.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:53:36.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:53:36.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:53:36.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:53:36.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:53:36.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:53:36.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:53:36.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:53:36.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:53:36.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:53:36.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:53:36.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:53:36.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:53:37.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:53:37.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:53:37.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:53:37.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:53:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T11:53:37.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:53:37.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:53:37.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:53:37.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:53:37.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:53:33
2026-05-28T11:53:37.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68913, datetime.datetime(2026, 5, 28, 11, 53, 33), datetime.datetime(2026, 5, 28, 11, 53, 33), 'salt', 13.02, 39.45, None, 6.5, 178.61, 13.47, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:53:37.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:53:37.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:53:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:53:33, diff=4.178577s, valid=True
2026-05-28T11:53:37.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:53:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:53:37.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=85.181402s, valid=True
2026-05-28T11:53:37.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:53:37.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:53:29, diff=8.18804s, valid=True
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:53:37.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T11:53:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=85.191099s, valid=True
2026-05-28T11:53:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:53:37.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:53:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:53:37.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894659.191765s, valid=True
2026-05-28T11:53:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:53:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:53:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:53:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:53:37.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:53:37.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:53:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:53:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:53:37.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:53:37.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:53:37.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:53:37.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:53:37.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:53:37.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:53:37.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:53:38.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:53:38.211 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:53:38.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:53:38.211 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T11:53:38.211 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T11:53:38.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:53:38.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:54:08.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:54:08.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:54:08.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:54:08.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:54:08.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:54:08.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:54:08.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-28T11:54:08.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:54:08.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-28T11:54:08.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:54:08.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:54:08.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:54:08.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-28T11:54:11.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-28T11:54:11.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:54:11.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:54:11.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:54:11.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:54:11.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:54:11.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:54:11.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:54:11.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:54:11.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:54:11.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:54:11.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:54:11.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:54:11.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:54:11.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:54:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:54:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:54:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:54:11.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:54:11.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:54:11.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:54:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:54:11.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:54:11.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:54:11.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:54:03
2026-05-28T11:54:11.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68914, datetime.datetime(2026, 5, 28, 11, 54, 3), datetime.datetime(2026, 5, 28, 11, 54, 3), 'salt', 12.72, 37.23, None, 6.81, 202.65, 14.22, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:54:11.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:54:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:54:11.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:54:03, diff=8.974643s, valid=True
2026-05-28T11:54:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:54:11.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:54:11.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=119.977797s, valid=True
2026-05-28T11:54:11.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:54:11.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:54:11.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:53:59, diff=12.984918s, valid=True
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:54:11.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:54:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=119.98818s, valid=True
2026-05-28T11:54:11.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:54:11.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:54:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:54:11.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894693.988975s, valid=True
2026-05-28T11:54:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:54:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:54:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:54:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:54:11.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:54:12.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:54:12.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:54:12.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:54:12.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:54:12.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:54:12.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:54:12.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:54:12.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:54:12.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:54:12.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:54:12.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:54:13.068 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:54:13.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:54:13.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-28T11:54:13.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-28T11:54:13.337 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:54:13.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:54:43.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:54:43.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:54:43.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:54:43.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:54:43.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:54:43.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:54:43.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-28T11:54:43.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:54:43.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:54:43.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:54:43.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:54:43.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:54:43.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-28T11:54:47.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-28T11:54:47.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:54:47.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:54:47.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:54:47.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:54:47.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:54:47.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:54:47.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:54:47.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:54:47.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:54:47.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:54:47.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:54:47.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:54:47.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:54:47.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:54:47.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:54:47.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:54:47.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:54:47.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:54:47.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:54:47.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:54:47.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:54:47.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:54:47.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:54:47.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:54:34
2026-05-28T11:54:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68915, datetime.datetime(2026, 5, 28, 11, 54, 34), datetime.datetime(2026, 5, 28, 11, 54, 33), 'salt', 12.69, 41.14, None, 8.93, 232.1, 12.86, 830.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:54:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:54:47.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:54:47.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:54:33, diff=14.412855s, valid=True
2026-05-28T11:54:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:54:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:54:47.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=155.415797s, valid=True
2026-05-28T11:54:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:54:47.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:54:29, diff=18.423113s, valid=True
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:54:47.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:54:47.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=155.426675s, valid=True
2026-05-28T11:54:47.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:54:47.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:54:47.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:54:47.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894729.427339s, valid=True
2026-05-28T11:54:47.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:54:47.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:54:47.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:54:47.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:54:47.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:54:47.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:54:47.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:54:47.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:54:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:54:47.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:54:47.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:54:47.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:54:47.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:54:47.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:54:47.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:54:48.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:54:48.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:54:48.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:54: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-28T11:54: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-28T11:54:50.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:54:50.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:55:20.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:55:20.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:55:20.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:55:21.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:55:21.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:55:21.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:55:21.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:55:21.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:55:21.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-28T11:55:21.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:55:21.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:55:21.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:55:21.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-28T11:55:23.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-28T11:55:23.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:55:23.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:55:23.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:55:23.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:55:23.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:55:23.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:55:23.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:55:23.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:55:23.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:55:23.884 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:55:23.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:55:23.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:55:23.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T11:55:23.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:55:24.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T11:55:24.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:55:24.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:55:24.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:55:24.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:55:24.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:55:24.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:55:24.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:55:24.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:55:24.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:55:16
2026-05-28T11:55:24.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68917, datetime.datetime(2026, 5, 28, 11, 55, 16), datetime.datetime(2026, 5, 28, 11, 55, 15), 'salt', 12.79, 42.53, None, 8.26, 248.45, 12.41, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:55:24.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:55:24.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T11:55:24.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:55:15, diff=9.208714s, valid=True
2026-05-28T11:55:24.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:55:24.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:55:24.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=192.211571s, valid=True
2026-05-28T11:55:24.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:55:24.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:55:10, diff=14.218329s, valid=True
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:55:24.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:55:24.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:52:12, diff=192.221396s, valid=True
2026-05-28T11:55:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:55:24.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:55:24.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:55:24.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894766.222056s, valid=True
2026-05-28T11:55:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:55:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:55:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:55:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:55:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:55:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:55:24.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:55:24.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:55:24.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:55:24.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:55:24.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:55:24.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:55:24.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:55:24.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:55:24.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:55:25.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:55:25.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:55:25.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:55:25.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-28T11:55:25.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-28T11:55:25.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:55:25.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:55:55.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:55:55.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:55:55.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:55:55.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:55:55.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:55:56.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:55:56.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-28T11:55:56.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:55:56.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:55:56.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:55:56.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:55:56.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:55:56.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-28T11:55:58.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-28T11:55:58.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:55:58.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:55:58.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:55:58.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:55:58.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:55:58.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:55:58.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:55:58.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:55:58.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:55:58.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:55:58.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:55:58.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:55:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:55:58.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:55:58.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:55:58.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:55:58.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:55:58.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:55:58.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:55:58.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:55:58.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:55:58.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:55:58.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:55:58.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:55:46
2026-05-28T11:55:58.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68918, datetime.datetime(2026, 5, 28, 11, 55, 46), datetime.datetime(2026, 5, 28, 11, 55, 46), 'salt', 13.02, 45.75, None, 13.9, 218.45, 11.42, 830.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:55:58.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:55:58.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:55:58.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:55:46, diff=12.985418s, valid=True
2026-05-28T11:55:58.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:55:58.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:55:58.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:12, diff=-13.011466s, valid=True
2026-05-28T11:55:58.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:55:58.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:55:58.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:55:41, diff=17.996826s, valid=True
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:55:58.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:55:59.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:12, diff=-12.998547s, valid=True
2026-05-28T11:55:59.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:55:59.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:55:59.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:55:59.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894801.002451s, valid=True
2026-05-28T11:55:59.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:55:59.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:55:59.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:55:59.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:55:59.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:55:59.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:55:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:55:59.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:55:59.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:55:59.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:55:59.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:55:59.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:55:59.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:55:59.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:55:59.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:56:00.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:56:00.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:56:00.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:56:00.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-28T11:56:00.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-28T11:56:00.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:56:00.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:56:30.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:56:30.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:56:30.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:56:30.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:56:30.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:56:30.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:56:30.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-28T11:56:30.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:56:30.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-28T11:56:30.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:56:30.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:56:30.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:56:30.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-28T11:56:34.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-28T11:56:34.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:56:34.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:56:34.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:56:34.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:56:34.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:56:34.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:56:34.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:56:34.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:56:34.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:56:34.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:56:34.083 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:56:34.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:56:34.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:56:34.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:56:34.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:56:34.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:56:34.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:56:34.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:56:34.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:56:34.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:56:34.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:56:34.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:56:34.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:56:34.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:56:16
2026-05-28T11:56:34.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68919, datetime.datetime(2026, 5, 28, 11, 56, 16), datetime.datetime(2026, 5, 28, 11, 56, 16), 'salt', 13.19, 46.58, None, 7.34, 170.05, 11.18, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:56:34.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:56:34.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:56:34.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:16, diff=18.398351s, valid=True
2026-05-28T11:56:34.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:56:34.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:56:34.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:12, diff=22.401163s, valid=True
2026-05-28T11:56:34.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:56:34.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:56:34.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:13, diff=21.407772s, valid=True
2026-05-28T11:56:34.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:56:34.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:56:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:56:34.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:56:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:56:34.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:56:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:12, diff=22.410749s, valid=True
2026-05-28T11:56:34.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:56:34.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:56:34.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:56:34.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894836.411388s, valid=True
2026-05-28T11:56:34.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:56:34.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:56:34.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:56:34.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:56:34.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:56:34.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:56:34.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:56:34.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:56:34.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:56:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:56:34.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:56:34.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:56:34.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:56:34.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:56:34.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:56:35.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:56:35.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:56:35.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:56:35.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-28T11:56:35.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-28T11:56:35.583 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:56:35.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:57:05.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:57:05.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:57:05.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:57:05.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:57:05.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:57:05.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:57:05.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-28T11:57:05.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:57:05.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-28T11:57:05.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:57:05.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:57:05.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:57: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-28T11:57:08.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-28T11:57:08.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:57:08.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:57:08.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:57:08.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:57:08.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:57:08.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:57:08.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:57:08.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:57:08.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:57:08.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:57:08.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:57:08.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:57:08.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:57:08.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:57:08.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:57:08.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:57:08.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:57:08.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:57:08.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:57:08.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:57:08.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:57:08.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:57:08.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:57:08.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:56:46
2026-05-28T11:57:08.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68920, datetime.datetime(2026, 5, 28, 11, 56, 46), datetime.datetime(2026, 5, 28, 11, 56, 46), 'salt', 13.32, 47.74, None, 3.99, 28.81, 10.85, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:57:08.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:57:08.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:57:08.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:46, diff=22.619724s, valid=True
2026-05-28T11:57:08.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:57:08.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:57:08.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:12, diff=-3.377395s, valid=True
2026-05-28T11:57:08.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:57:08.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:56:44, diff=24.629277s, valid=True
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:57:08.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:57:08.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:12, diff=-3.367631s, valid=True
2026-05-28T11:57:08.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:57:08.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:57:08.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:57:08.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894870.633038s, valid=True
2026-05-28T11:57:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:57:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:57:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:57:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:57:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:57:08.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:57:08.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:57:08.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:57:08.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:57:08.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:57:08.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:57:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:57:08.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:57:08.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:57:09.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:57:09.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:57:09.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:57:09.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:57:09.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-28T11:57:09.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-28T11:57:09.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:57:09.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:57:39.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:57:39.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:57:39.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:57:40.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:57:40.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:57:40.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:57:40.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-28T11:57:40.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:57:40.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T11:57:40.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:57:40.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:57:40.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:57:40.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:57:43.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-28T11:57:43.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:57:43.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:57:43.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:57:43.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:57:43.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:57:43.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:57:43.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:57:43.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:57:43.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:57:43.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:57:43.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:57:43.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:57:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:57:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:57:43.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:57:43.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:57:43.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:57:43.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:57:43.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:57:43.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:57:43.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:57:43.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:57:43.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:57:43.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:57:17
2026-05-28T11:57:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68921, datetime.datetime(2026, 5, 28, 11, 57, 17), datetime.datetime(2026, 5, 28, 11, 57, 16), 'salt', 13.42, 47.77, None, 6.28, 69.45, 10.85, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:57:43.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:57:43.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:57:43.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:16, diff=27.394701s, valid=True
2026-05-28T11:57:43.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:57:43.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:57:43.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:12, diff=31.397494s, valid=True
2026-05-28T11:57:43.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:57:43.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:16, diff=27.404278s, valid=True
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:57:43.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:57:43.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:57:12, diff=31.407287s, valid=True
2026-05-28T11:57:43.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:57:43.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:57:43.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:57:43.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894905.407948s, valid=True
2026-05-28T11:57:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:57:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:57:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:57:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:57:43.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:57:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:57:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:57:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:57:43.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:57:43.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:57:43.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:57:43.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:57:43.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:57:43.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:57:43.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:57:44.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:57:44.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:57:44.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:57:44.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-28T11:57:44.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-28T11:57:44.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:57:44.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:58:14.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:58:14.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:58:14.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:58:14.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:58:14.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:58:15.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:58:15.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T11:58:15.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:58:15.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-28T11:58:15.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:58:15.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:58:15.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:58:15.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-28T11:58:17.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-28T11:58:17.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:58:17.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:58:17.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:58:17.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:58:17.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:58:17.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:58:17.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:58:17.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:58:17.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:58:17.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:58:17.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:58:17.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:58:17.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T11:58:17.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:58:17.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T11:58:17.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:58:17.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:58:17.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:58:17.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:58:17.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:58:17.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:58:17.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:58:17.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:58:17.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:58:17
2026-05-28T11:58:17.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68923, datetime.datetime(2026, 5, 28, 11, 58, 17), datetime.datetime(2026, 5, 28, 11, 58, 17), 'salt', 12.92, 50.36, None, 7.91, 75.55, 10.06, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:58:17.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:58:17.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T11:58:17.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:17, diff=0.886902s, valid=True
2026-05-28T11:58:17.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:58:17.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:58:17.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:12, diff=5.889734s, valid=True
2026-05-28T11:58:17.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:58:17.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:11, diff=6.896257s, valid=True
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:58:17.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:58:17.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:12, diff=5.899235s, valid=True
2026-05-28T11:58:17.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:58:17.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:58:17.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:58:17.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894939.899893s, valid=True
2026-05-28T11:58:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:58:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:58:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:58:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:58:17.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:58:17.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:58:17.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:58:17.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:58:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:58:18.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:58:18.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:58:18.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:58:18.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:58:18.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:58:18.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:58:18.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:58:18.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:58:18.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:58:18.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-28T11:58:18.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-28T11:58:19.149 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:58:19.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:58:49.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:58:49.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:58:49.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:58:49.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:58:49.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:58:49.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:58:49.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-28T11:58:49.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:58:49.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-28T11:58:49.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:58:49.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:58:49.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:58:49.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-28T11:58:52.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T11:58:52.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:58:52.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:58:52.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:58:52.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:58:52.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:58:52.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:58:52.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:58:52.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:58:52.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:58:52.669 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:58:52.669 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:58:52.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:58:52.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T11:58:52.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:58:52.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T11:58:52.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:58:52.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:58:52.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:58:52.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T11:58:52.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:58:52.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:58:52.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:58:52.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:58:52.979 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:58:47
2026-05-28T11:58:52.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68924, datetime.datetime(2026, 5, 28, 11, 58, 47), datetime.datetime(2026, 5, 28, 11, 58, 47), 'salt', 12.69, 49.16, None, 7.84, 121.57, 10.38, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:58:52.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:58:52.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T11:58:52.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:47, diff=5.98563s, valid=True
2026-05-28T11:58:52.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:58:52.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:58:52.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:12, diff=-19.011566s, valid=True
2026-05-28T11:58:52.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:58:52.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:58:41, diff=11.995122s, valid=True
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:58:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T11:58:52.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:12, diff=-19.001898s, valid=True
2026-05-28T11:58:52.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:58:52.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:58:52.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:58:52.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=894974.998762s, valid=True
2026-05-28T11:58:53.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:58:53.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:58:53.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:58:53.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:58:53.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:58:53.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:58:53.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:58:53.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:58:53.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:58:53.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:58:53.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:58:53.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:58:53.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:58:53.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:58:53.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:58:53.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:58:53.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:58:53.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:58:53.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-28T11:58:53.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-28T11:58:54.232 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:58:54.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T11:59:24.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T11:59:24.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T11:59:24.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T11:59:24.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T11:59:24.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T11:59:24.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T11:59:24.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-28T11:59:24.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T11:59:24.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-28T11:59:24.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T11:59:24.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T11:59:24.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T11:59:24.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T11:59:28.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-28T11:59:28.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T11:59:28.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T11:59:28.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T11:59:28.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T11:59:28.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T11:59:28.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T11:59:28.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T11:59:28.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T11:59:28.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T11:59:28.528 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T11:59:28.528 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T11:59:28.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T11:59:28.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T11:59:28.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T11:59:28.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T11:59:28.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:59:28.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:59:28.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T11:59:28.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T11:59:28.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T11:59:28.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T11:59:28.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T11:59:28.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T11:59:28.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:59:18
2026-05-28T11:59:28.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68925, datetime.datetime(2026, 5, 28, 11, 59, 18), datetime.datetime(2026, 5, 28, 11, 59, 17), 'salt', 12.69, 50.49, None, 5.93, 109.44, 10.01, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T11:59:28.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T11:59:28.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T11:59:28.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:17, diff=11.847029s, valid=True
2026-05-28T11:59:28.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T11:59:28.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:59:28.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:12, diff=16.849886s, valid=True
2026-05-28T11:59:28.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T11:59:28.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T11:59:28.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:12, diff=16.856655s, valid=True
2026-05-28T11:59:28.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T11:59:28.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:59:28.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T11:59:28.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T11:59:28.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T11:59:28.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T11:59:28.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:12, diff=16.859654s, valid=True
2026-05-28T11:59:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T11:59:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T11:59:28.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T11:59:28.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895010.860306s, valid=True
2026-05-28T11:59:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T11:59:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T11:59:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T11:59:28.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T11:59:28.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T11:59:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T11:59:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T11:59:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T11:59:28.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T11:59:28.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T11:59:29.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T11:59:29.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T11:59:29.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T11:59:29.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T11:59:29.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:59:29.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T11:59:30.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T11:59:30.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T11:59:30.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-28T11:59:30.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-28T11:59:30.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T11:59:30.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:00:00.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:00:00.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:00:00.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:00:00.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:00:00.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:00:00.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:00:00.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:00:00.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:00:00.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:00:00.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:00:00.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:00:00.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:00:00.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-28T12:00:03.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-28T12:00:03.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:00:03.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:00:03.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:00:03.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:00:03.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:00:03.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:00:03.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:00:03.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:00:03.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:00:03.157 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:00:03.157 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:00:03.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:00:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:00:03.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:00:03.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:00:03.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:00:03.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:00:03.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:00:03.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:00:03.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:00:03.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:00:03.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:00:03.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:00:03.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 11:59:48
2026-05-28T12:00:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68926, datetime.datetime(2026, 5, 28, 11, 59, 48), datetime.datetime(2026, 5, 28, 11, 59, 47), 'salt', 12.59, 52.54, None, 8.75, 143.02, 9.44, 830.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:00:03.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:00:03.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:00:03.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:47, diff=16.487891s, valid=True
2026-05-28T12:00:03.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:00:03.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:00:03.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:12, diff=-8.509256s, valid=True
2026-05-28T12:00:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:00:03.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 11:59:43, diff=20.497329s, valid=True
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:00:03.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:00:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:12, diff=-8.499687s, valid=True
2026-05-28T12:00:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:00:03.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:00:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:00:03.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895045.500975s, valid=True
2026-05-28T12:00:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:00:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:00:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:00:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:00:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:00:03.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:00:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:00:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:00:03.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:00:03.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:00:03.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:00:03.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:00:03.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:00:03.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:00:04.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:00:04.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:00:04.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:00:04.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:00:04.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-28T12:00:04.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-28T12:00:04.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:00:04.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:00:34.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:00:34.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:00:34.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:00:35.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:00:35.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:00:35.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:00:35.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-28T12:00:35.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:00:35.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-28T12:00:35.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:00:35.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:00:35.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:00:35.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:00:37.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-28T12:00:37.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:00:37.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:00:37.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:00:37.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:00:37.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:00:37.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:00:37.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:00:37.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:00:37.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:00:37.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:00:37.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:00:37.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:00:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:00:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:00:37.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:00:37.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:00:38.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:00:38.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:00:38.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:00:38.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:00:38.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:00:38.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:00:38.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:00:38.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:00:18
2026-05-28T12:00:38.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68927, datetime.datetime(2026, 5, 28, 12, 0, 18), datetime.datetime(2026, 5, 28, 12, 0, 18), 'salt', 12.46, 53.11, None, 6.81, 116.99, 9.28, 830.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:00:38.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:00:38.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:00:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:18, diff=20.143239s, valid=True
2026-05-28T12:00:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:00:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:00:38.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:12, diff=26.146127s, valid=True
2026-05-28T12:00:38.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:00:38.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:14, diff=24.153063s, valid=True
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:00:38.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:00:38.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:12, diff=26.156168s, valid=True
2026-05-28T12:00:38.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:00:38.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:00:38.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:00:38.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895080.156846s, valid=True
2026-05-28T12:00:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:00:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:00:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:00:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:00:38.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:00:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:00:38.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:00:38.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:00:38.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:00:38.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:00:38.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:00:38.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:00:38.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:00:38.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:00:38.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:00:39.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:00:39.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:00:39.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:00:39.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-28T12:00:39.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-28T12:00:39.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:00:39.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:01:09.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:01:09.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:01:09.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:01:09.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:01:09.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:01:09.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:01:09.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:01:09.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:01:09.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-28T12:01:09.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:01:09.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:01:09.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:01:09.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-28T12:01:12.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-28T12:01:12.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:01:12.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:01:12.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:01:12.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:01:12.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:01:12.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:01:12.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:01:12.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:01:12.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:01:12.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:01:12.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:01:12.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:01:13.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:01:13.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:01:13.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:01:13.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:01:13.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:01:13.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:01:13.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:01:13.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:01:13.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:01:13.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:01:13.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:01:13.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:00:48
2026-05-28T12:01:13.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68928, datetime.datetime(2026, 5, 28, 12, 0, 48), datetime.datetime(2026, 5, 28, 12, 0, 48), 'salt', 12.36, 55.03, None, 9.88, 108.85, 8.77, 831.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:01:13.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:01:13.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:01:13.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:48, diff=25.272529s, valid=True
2026-05-28T12:01:13.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:01:13.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:01:13.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:12, diff=1.275369s, valid=True
2026-05-28T12:01:13.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:01:13.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:00:46, diff=27.282006s, valid=True
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:01:13.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:01:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:12, diff=1.285053s, valid=True
2026-05-28T12:01:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:01:13.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:01:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:01:13.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895115.285716s, valid=True
2026-05-28T12:01:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:01:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:01:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:01:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:01:13.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:01:13.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:01:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:01:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:01:13.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:01:13.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:01:13.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:01:13.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:01:13.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:01:13.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:01:13.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:01:14.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:01:14.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:01:14.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:01:14.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-28T12:01:14.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-28T12:01:14.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:01:14.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:01:44.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:01:44.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:01:44.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:01:44.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:01:44.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:01:44.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:01:44.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-28T12:01:44.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:01:44.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-28T12:01:44.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:01:44.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:01:44.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:01:44.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:01:47.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-28T12:01:47.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:01:47.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:01:47.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:01:47.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:01:47.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:01:47.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:01:47.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:01:47.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:01:47.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:01:47.853 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:01:47.853 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:01:47.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:01:47.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:01:47.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:01:48.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:01:48.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:01:48.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:01:48.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:01:48.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:01:48.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:01:48.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:01:48.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:01:48.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:01:48.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:01:18
2026-05-28T12:01:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68929, datetime.datetime(2026, 5, 28, 12, 1, 18), datetime.datetime(2026, 5, 28, 12, 1, 18), 'salt', 12.16, 53.94, None, 8.86, 112.51, 9.04, 830.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:01:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:01:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:01:48.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:18, diff=30.170327s, valid=True
2026-05-28T12:01:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:01:48.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:01:48.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:12, diff=36.173196s, valid=True
2026-05-28T12:01:48.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:01:48.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:01:48.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:17, diff=31.179901s, valid=True
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:01:48.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:01:48.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:01:12, diff=36.184048s, valid=True
2026-05-28T12:01:48.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:01:48.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:01:48.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:01:48.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895150.184723s, valid=True
2026-05-28T12:01:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:01:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:01:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:01:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:01:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:01:48.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:01:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:01:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:01:48.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:01:48.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:01:48.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:01:48.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:01:48.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:01:48.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:01:48.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:01:49.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:01:49.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:01:49.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:01:49.221 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:01:49.221 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:01:49.393 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:01:49.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:02:19.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:02:19.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:02:19.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:02:19.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:02:19.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:02:20.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:02:20.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-28T12:02:20.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:02:20.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-28T12:02:20.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:02:20.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:02:20.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:02:20.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-28T12:02:22.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-28T12:02:22.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:02:22.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:02:22.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:02:22.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:02:22.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:02:22.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:02:22.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:02:22.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:02:22.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:02:22.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:02:22.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:02:22.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:02:23.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:02:23.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:02:23.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:02:23.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:02:23.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:02:23.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:02:23.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:02:23.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:02:23.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:02:23.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:02:23.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:02:23.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:02:19
2026-05-28T12:02:23.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68931, datetime.datetime(2026, 5, 28, 12, 2, 19), datetime.datetime(2026, 5, 28, 12, 2, 19), 'salt', 11.76, 53.87, None, 5.82, 69.5, 9.03, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:02:23.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:02:23.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:02:23.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:19, diff=4.324321s, valid=True
2026-05-28T12:02:23.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:02:23.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:02:23.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:12, diff=11.328134s, valid=True
2026-05-28T12:02:23.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:02:23.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:13, diff=10.337011s, valid=True
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:02:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:02:23.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:12, diff=11.341609s, valid=True
2026-05-28T12:02:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:02:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:02:23.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:02:23.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895185.34255s, valid=True
2026-05-28T12:02:23.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:02:23.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:02:23.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:02:23.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:02:23.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:02:23.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:02:23.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:02:23.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:02:23.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:02:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:02:23.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:02:23.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:02:23.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:02:23.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:02:24.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:02:24.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:02:24.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:02:24.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:02:24.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-28T12:02:24.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-28T12:02:24.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:02:24.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:02:54.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:02:54.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:02:54.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:02:54.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:02:54.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:02:55.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:02:55.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-28T12:02:55.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:02:55.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-28T12:02:55.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:02:55.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:02:55.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:02:55.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-28T12:02:57.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-28T12:02:57.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:02:57.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:02:57.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:02:57.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:02:57.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:02:57.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:02:57.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:02:57.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:02:57.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:02:57.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:02:57.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:02:57.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:02:57.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:02:57.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:02:58.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:02:58.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:02:58.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:02:58.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:02:58.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:02:58.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:02:58.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:02:58.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:02:58.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:02:58.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:02:49
2026-05-28T12:02:58.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68932, datetime.datetime(2026, 5, 28, 12, 2, 49), datetime.datetime(2026, 5, 28, 12, 2, 49), 'salt', 11.59, 55.2, None, 7.66, 100.03, 8.67, 830.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:02:58.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:02:58.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:02:58.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:49, diff=9.200281s, valid=True
2026-05-28T12:02:58.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:02:58.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:02:58.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:12, diff=-13.796855s, valid=True
2026-05-28T12:02:58.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:02:58.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:02:58.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:02:43, diff=15.209862s, valid=True
2026-05-28T12:02:58.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:02:58.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:02:58.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:02:58.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:02:58.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:02:58.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:02:58.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:12, diff=-13.787098s, valid=True
2026-05-28T12:02:58.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:02:58.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:02:58.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:02:58.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895220.21354s, valid=True
2026-05-28T12:02:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:02:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:02:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:02:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:02:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:02:58.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:02:58.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:02:58.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:02:58.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:02:58.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:02:58.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:02:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:02:58.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:02:58.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:02:58.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:02:59.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:02:59.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:02:59.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:02:59.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-28T12:02:59.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-28T12:02:59.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:02:59.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:03:29.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:03:29.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:03:29.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:03:29.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:03:29.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:03:30.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:03:30.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-28T12:03:30.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:03:30.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-28T12:03:30.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:03:30.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:03:30.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:03:30.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-28T12:03:33.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:03:33.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:03:33.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:03:33.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:03:33.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:03:33.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:03:33.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:03:33.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:03:33.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:03:33.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:03:33.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:03:33.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:03:33.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:03:33.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:03:33.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:03:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:03:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:03:33.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:03:33.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:03:33.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:03:33.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:03:33.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:03:33.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:03:33.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:03:33.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:03:19
2026-05-28T12:03:33.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68933, datetime.datetime(2026, 5, 28, 12, 3, 19), datetime.datetime(2026, 5, 28, 12, 3, 19), 'salt', 11.56, 54.8, None, 5.65, 99.68, 8.77, 831.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:03:33.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:03:33.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:03:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:19, diff=14.48567s, valid=True
2026-05-28T12:03:33.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:03:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:03:33.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:12, diff=21.48853s, valid=True
2026-05-28T12:03:33.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:03:33.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:13, diff=20.495205s, valid=True
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:03:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:03:33.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:12, diff=21.498234s, valid=True
2026-05-28T12:03:33.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:03:33.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:03:33.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:03:33.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895255.498894s, valid=True
2026-05-28T12:03:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:03:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:03:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:03:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:03:33.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:03:33.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:03:33.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:03:33.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:03:33.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:03:33.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:03:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:03:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:03:33.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:03:33.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:03:34.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:03:34.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:03:34.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:03:34.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:03:34.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-28T12:03:34.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-28T12:03:34.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:03:34.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:04:04.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:04:04.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:04:04.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:04:05.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:04:05.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:04:05.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:04:05.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-28T12:04:05.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:04:05.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-28T12:04:05.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:04:05.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:04:05.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:04:05.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:04: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-28T12:04:09.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:04:09.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:04:09.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:04:09.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:04:09.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:04:09.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:04:09.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:04:09.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:04:09.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:04:09.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:04:09.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:04:09.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:04:09.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:04:09.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:04:09.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:04:09.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:04:09.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:04:09.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:04:09.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:04:09.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:04:09.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:04:09.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:04:09.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:04:09.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:03:50
2026-05-28T12:04:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68934, datetime.datetime(2026, 5, 28, 12, 3, 50), datetime.datetime(2026, 5, 28, 12, 3, 49), 'salt', 11.49, 54.93, None, 5.01, 96.42, 8.73, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:04:09.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:04:09.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:04:09.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:49, diff=20.367999s, valid=True
2026-05-28T12:04:09.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:04:09.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:04:09.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:12, diff=-2.629147s, valid=True
2026-05-28T12:04:09.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:04:09.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:04:09.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:03:44, diff=25.377629s, valid=True
2026-05-28T12:04:09.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:04:09.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:04:09.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:04:09.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:04:09.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:04:09.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:04:09.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:12, diff=-2.619354s, valid=True
2026-05-28T12:04:09.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:04:09.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:04:09.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:04:09.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895291.3813s, valid=True
2026-05-28T12:04:09.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:04:09.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:04:09.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:04:09.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:04:09.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:04:09.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:04:09.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:04:09.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:04:09.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:04:09.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:04:09.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:04:09.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:04:09.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:04:09.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:04:09.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:04:10.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:04:10.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:04:10.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:04:10.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-28T12:04:10.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-28T12:04:10.640 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:04:10.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:04:40.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:04:40.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:04:40.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:04:40.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:04:41.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:04:41.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:04:41.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-28T12:04:41.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:04:41.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-28T12:04:41.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:04:41.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:04:41.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:04:41.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-28T12:04:44.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-28T12:04:44.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:04:44.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:04:44.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:04:44.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:04:44.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:04:44.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:04:44.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:04:44.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:04:44.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:04:44.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:04:44.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:04:44.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:04:44.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:04:44.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:04:44.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:04:44.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:04:44.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:04:44.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:04:44.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:04:44.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:04:44.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:04:44.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:04:44.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:04:44.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:04:20
2026-05-28T12:04:44.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68935, datetime.datetime(2026, 5, 28, 12, 4, 20), datetime.datetime(2026, 5, 28, 12, 4, 20), 'salt', 11.63, 55.86, None, 4.55, 78.55, 8.51, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:04:44.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:04:44.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:04:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:20, diff=24.517265s, valid=True
2026-05-28T12:04:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:04:44.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:04:44.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:12, diff=32.520329s, valid=True
2026-05-28T12:04:44.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:04:44.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:15, diff=29.527384s, valid=True
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:04:44.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:04:44.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:12, diff=32.530666s, valid=True
2026-05-28T12:04:44.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:04:44.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:04:44.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:04:44.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895326.531474s, valid=True
2026-05-28T12:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:04:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:04:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:04:44.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:04:44.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:04:44.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:04:44.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:04:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:04:44.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:04:44.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:04:44.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:04:45.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:04:45.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:04:45.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:04:45.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:04:45.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:04:45.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:04:45.849 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:04:45.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:05:15.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:05:15.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:05:15.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:05:16.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:05:16.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:05:16.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:05:16.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:05:16.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:05:16.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-28T12:05:16.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:05:16.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:05:16.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:05:16.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-28T12:05:19.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-28T12:05:19.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:05:19.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:05:19.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:05:19.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:05:19.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:05:19.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:05:19.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:05:19.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:05:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:05:19.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:05:19.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:05:19.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:05:19.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:05:19.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:05:19.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:05:19.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:05:19.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:05:19.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:05:19.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:05:19.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:05:19.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:05:19.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:05:19.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:05:19.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:04:50
2026-05-28T12:05:19.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68936, datetime.datetime(2026, 5, 28, 12, 4, 50), datetime.datetime(2026, 5, 28, 12, 4, 50), 'salt', 11.79, 55.82, None, 4.63, 78.29, 8.52, 830.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:05:19.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:05:19.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:05:19.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:50, diff=29.97779s, valid=True
2026-05-28T12:05:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:05:19.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:05:19.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:05:12, diff=7.980837s, valid=True
2026-05-28T12:05:19.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:05:19.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:05:19.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:04:47, diff=32.98773s, valid=True
2026-05-28T12:05:19.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:05:19.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:05:19.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:05:19.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:05:19.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:05:19.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:05:19.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:05:12, diff=7.991077s, valid=True
2026-05-28T12:05:19.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:05:19.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:05:19.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:05:19.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895361.991797s, valid=True
2026-05-28T12:05:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:05:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:05:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:05:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:05:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:05:20.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:05:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:05:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:05:20.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:05:20.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:05:20.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:05:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:05:20.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:05:20.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:05:20.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:05:20.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:05:20.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:05:20.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:05:20.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-28T12:05:20.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-28T12:05:21.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:05:21.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:05:51.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:05:51.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:05:51.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:05:51.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:05:51.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:05:51.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:05:51.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-28T12:05:51.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:05:51.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-28T12:05:51.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:05:51.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:05:51.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:05:51.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-28T12:05:54.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-28T12:05:54.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:05:54.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:05:54.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:05:54.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:05:54.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:05:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:05:54.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:05:54.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:05:54.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:05:54.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:05:54.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:05:54.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:05:54.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:05:54.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:05:54.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:05:54.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:05:55.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:05:55.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:05:55.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:05:55.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:05:55.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:05:55.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:05:55.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:05:55.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:05:51
2026-05-28T12:05:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68938, datetime.datetime(2026, 5, 28, 12, 5, 51), datetime.datetime(2026, 5, 28, 12, 5, 50), 'salt', 11.76, 50.82, None, 3.81, 56.36, 9.85, 830.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:05:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:05:55.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:05:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:05:50, diff=5.194365s, valid=True
2026-05-28T12:05:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:05:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:05:55.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:12, diff=-16.802775s, valid=True
2026-05-28T12:05:55.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:05:55.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:05:55.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:05:49, diff=6.203907s, valid=True
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:05:55.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:05:55.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:12, diff=-16.793065s, valid=True
2026-05-28T12:05:55.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:05:55.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:05:55.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:05:55.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895397.20758s, valid=True
2026-05-28T12:05:55.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:05:55.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:05:55.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:05:55.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:05:55.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:05:55.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:05:55.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:05:55.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:05:55.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:05:55.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:05:55.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:05:55.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:05:55.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:05:55.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:05:55.759 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:05:56.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:05:56.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:05:56.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:05:56.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-28T12:05:56.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-28T12:05:56.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:05:56.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:06:26.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:06:26.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:06:26.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:06:26.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:06:26.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:06:26.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:06:26.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-28T12:06:26.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:06:26.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-28T12:06:26.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:06:26.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:06:26.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:06:26.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-28T12:06: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-28T12:06:29.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:06:29.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:06:29.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:06:29.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:06:29.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:06:29.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:06:29.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:06:29.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:06:29.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:06:29.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:06:29.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:06:29.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:06:29.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:06:29.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:06:29.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:06:29.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:06:29.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:06:29.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:06:29.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:06:29.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:06:29.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:06:29.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:06:29.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:06:29.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:06:21
2026-05-28T12:06:29.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68939, datetime.datetime(2026, 5, 28, 12, 6, 21), datetime.datetime(2026, 5, 28, 12, 6, 21), 'salt', 11.79, 50.52, None, 3.74, 77.73, 9.93, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:06:29.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:06:29.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:06:29.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:21, diff=8.649128s, valid=True
2026-05-28T12:06:29.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:06:29.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:06:29.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:12, diff=17.652095s, valid=True
2026-05-28T12:06:29.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:06:29.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:21, diff=8.659081s, valid=True
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:06:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:06:29.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:12, diff=17.662347s, valid=True
2026-05-28T12:06:29.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:06:29.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:06:29.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:06:29.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895431.663064s, valid=True
2026-05-28T12:06:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:06:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:06:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:06:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:06:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:06:29.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:06:29.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:06:29.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:06:29.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:06:29.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:06:29.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:06:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:06:29.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:06:30.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:06:30.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:06:30.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:06:30.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:06:30.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:06:30.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-28T12:06:30.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-28T12:06:30.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:06:30.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:07:00.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:07:00.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:07:00.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:07:01.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:07:01.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:07:01.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:07:01.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-28T12:07:01.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:07:01.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-28T12:07:01.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:07:01.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:07:01.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:07:01.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-28T12:07:03.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-28T12:07:03.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:07:03.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:07:03.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:07:03.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:07:03.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:07:03.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:07:03.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:07:03.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:07:03.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:07:03.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:07:03.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:07:03.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:07:03.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:07:03.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:07:04.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:07:04.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:07:04.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:07:04.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:07:04.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:07:04.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:07:04.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:07:04.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:07:04.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:07:04.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:06:51
2026-05-28T12:07:04.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68940, datetime.datetime(2026, 5, 28, 12, 6, 51), datetime.datetime(2026, 5, 28, 12, 6, 51), 'salt', 11.89, 51.61, None, 3.18, 37.55, 9.64, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:07:04.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:07:04.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:07:04.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:51, diff=13.190047s, valid=True
2026-05-28T12:07:04.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:07:04.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:07:04.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:12, diff=-7.807136s, valid=True
2026-05-28T12:07:04.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:07:04.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:06:45, diff=19.199514s, valid=True
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:07:04.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:07:04.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:12, diff=-7.797487s, valid=True
2026-05-28T12:07:04.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:07:04.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:07:04.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:07:04.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895466.2032s, valid=True
2026-05-28T12:07:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:07:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:07:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:07:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:07:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:07:04.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:07:04.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:07:04.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:07:04.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:07:04.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:07:04.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:07:04.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:07:04.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:07:04.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:07:04.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:07:05.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:07:05.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:07:05.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:07:05.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-28T12:07:05.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-28T12:07:05.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:07:05.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:07:35.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:07:35.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:07:35.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:07:36.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:07:36.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:07:36.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:07:36.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-28T12:07:36.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:07:36.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-28T12:07:36.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:07:36.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:07:36.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:07:36.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-28T12:07:38.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-28T12:07:38.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:07:38.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:07:38.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:07:38.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:07:38.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:07:38.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:07:38.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:07:38.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:07:38.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:07:38.686 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:07:38.686 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:07:38.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:07:38.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:07:38.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:07:38.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:07:38.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:07:38.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:07:38.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:07:38.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:07:38.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:07:38.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:07:38.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:07:38.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:07:38.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:07:21
2026-05-28T12:07:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68941, datetime.datetime(2026, 5, 28, 12, 7, 21), datetime.datetime(2026, 5, 28, 12, 7, 21), 'salt', 12.02, 51.81, None, 2.54, 182.42, 9.59, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:07:38.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:07:38.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:07:38.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:21, diff=17.998497s, valid=True
2026-05-28T12:07:38.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:07:38.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:07:39.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:12, diff=27.001324s, valid=True
2026-05-28T12:07:39.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:07:39.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:07:39.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:15, diff=24.007871s, valid=True
2026-05-28T12:07:39.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:07:39.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:07:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:07:39.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:07:39.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:07:39.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:07:39.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:12, diff=27.0109s, valid=True
2026-05-28T12:07:39.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:07:39.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:07:39.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:07:39.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895501.011552s, valid=True
2026-05-28T12:07:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:07:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:07:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:07:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:07:39.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:07:39.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:07:39.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:07:39.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:07:39.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:07:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:07:39.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:07:39.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:07:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:07:39.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:07:39.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:07:39.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:07:40.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:07:40.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:07:40.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-28T12:07:40.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-28T12:07:40.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:07:40.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:08:10.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:08:10.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:08:10.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:08:10.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:08:10.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:08:10.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:08:10.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-28T12:08:10.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:08:10.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-28T12:08:10.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:08:10.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:08:10.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:08:10.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:08:13.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:08:13.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:08:13.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:08:13.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:08:13.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:08:13.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:08:13.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:08:13.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:08:13.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:08:13.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:08:13.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:08:13.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:08:13.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:08:13.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:08:13.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:08:13.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:08:13.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:08:13.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:08:13.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:08:13.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:08:13.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:08:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:08:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:08:13.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:08:13.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:07:52
2026-05-28T12:08:13.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68942, datetime.datetime(2026, 5, 28, 12, 7, 52), datetime.datetime(2026, 5, 28, 12, 7, 51), 'salt', 12.09, 47.07, None, 8.12, 218.82, 10.94, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:08:13.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:08:13.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:08:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:51, diff=22.657789s, valid=True
2026-05-28T12:08:13.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:08:13.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:08:13.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:12, diff=1.660604s, valid=True
2026-05-28T12:08:13.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:08:13.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:07:46, diff=27.667261s, valid=True
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:08:13.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:08:13.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:12, diff=1.670323s, valid=True
2026-05-28T12:08:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:08:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:08:13.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:08:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895535.670986s, valid=True
2026-05-28T12:08:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:08:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:08:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:08:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:08:13.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:08:13.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:08:13.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:08:13.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:08:13.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:08:13.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:08:13.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:08:13.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:08:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:08:13.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:08:14.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:08:14.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:08:14.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:08:14.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:08:14.644 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:08:14.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-28T12:08:14.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:08:14.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:08:44.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:08:44.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:08:44.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:08:45.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:08:45.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:08:45.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:08:45.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-28T12:08:45.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:08:45.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-28T12:08:45.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:08:45.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:08:45.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:08:45.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-28T12:08:48.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-28T12:08:48.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:08:48.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:08:48.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:08:48.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:08:48.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:08:48.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:08:48.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:08:48.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:08:48.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:08:48.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:08:48.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:08:48.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:08:48.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:08:48.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:08:48.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:08:48.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:08:48.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:08:48.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:08:48.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:08:48.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:08:48.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:08:48.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:08:48.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:08:48.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:08:22
2026-05-28T12:08:48.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68943, datetime.datetime(2026, 5, 28, 12, 8, 22), datetime.datetime(2026, 5, 28, 12, 8, 21), 'salt', 12.12, 43.19, None, 11.58, 239.69, 12.13, 830.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:08:48.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:08:48.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:08:48.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:21, diff=27.46774s, valid=True
2026-05-28T12:08:48.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:08:48.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:08:48.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:12, diff=36.470521s, valid=True
2026-05-28T12:08:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:08:48.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:16, diff=32.477115s, valid=True
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:08:48.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:08:48.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:08:12, diff=36.480103s, valid=True
2026-05-28T12:08:48.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:08:48.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:08:48.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:08:48.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895570.480761s, valid=True
2026-05-28T12:08:48.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:08:48.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:08:48.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:08:48.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:08:48.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:08:48.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:08:48.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:08:48.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:08:48.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:08:48.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:08:48.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:08:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:08:48.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:08:48.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:08:49.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:08:49.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:08:49.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:08:49.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:08:49.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-28T12:08:49.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-28T12:08:49.713 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:08:49.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:09:19.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:09:19.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:09:19.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:09:20.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:09:20.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:09:20.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:09:20.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:09:20.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:09:20.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-28T12:09:20.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:09:20.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:09:20.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:09:20.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-28T12:09:22.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-28T12:09:22.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:09:22.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:09:22.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:09:22.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:09:22.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:09:22.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:09:22.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:09:22.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:09:22.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:09:22.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:09:22.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:09:22.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:09:23.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:09:23.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:09:23.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:09:23.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:09:23.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:09:23.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:09:23.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:09:23.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:09:23.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:09:23.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:09:23.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:09:23.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:09:22
2026-05-28T12:09:23.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68945, datetime.datetime(2026, 5, 28, 12, 9, 22), datetime.datetime(2026, 5, 28, 12, 9, 22), 'salt', 12.59, 35.07, None, 14.05, 223.06, 15.02, 830.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:09:23.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:09:23.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:09:23.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:22, diff=1.259931s, valid=True
2026-05-28T12:09:23.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:09:23.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:09:23.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:12, diff=11.26282s, valid=True
2026-05-28T12:09:23.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:09:23.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:19, diff=4.26948s, valid=True
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:09:23.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:09:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:12, diff=11.272515s, valid=True
2026-05-28T12:09:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:09:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:09:23.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:09:23.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895605.273197s, valid=True
2026-05-28T12:09:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:09:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:09:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:09:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:09:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:09:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:09:23.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:09:23.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:09:23.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:09:23.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:09:23.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:09:23.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:09:23.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:09:23.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:09:23.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:09:24.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:09:24.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:09:24.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:09:24.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-28T12:09:24.296 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:09:24.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:09:24.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:09:54.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:09:54.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:09:54.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:09:54.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:09:54.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:09:55.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:09:55.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-28T12:09:55.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:09:55.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-28T12:09:55.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:09:55.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:09:55.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:09:55.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-28T12:09: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-28T12:09:57.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:09:57.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:09:57.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:09:57.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:09:57.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:09:57.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:09:57.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:09:57.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:09:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:09:57.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:09:57.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:09:57.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:09:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:09:57.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:09:57.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:09:57.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:09:57.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:09:57.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:09:57.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:09:57.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:09:57.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:09:57.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:09:57.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:09:57.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:09:52
2026-05-28T12:09:57.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68946, datetime.datetime(2026, 5, 28, 12, 9, 52), datetime.datetime(2026, 5, 28, 12, 9, 52), 'salt', 12.65, 33.75, None, 8.86, 216.96, 15.55, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:09:57.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:09:57.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:09:57.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:52, diff=5.892298s, valid=True
2026-05-28T12:09:57.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:09:57.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:09:57.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:12, diff=-14.104836s, valid=True
2026-05-28T12:09:57.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:09:57.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:09:57.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:09:50, diff=7.901777s, valid=True
2026-05-28T12:09:57.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:09:57.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:09:57.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:09:57.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:09:57.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:09:57.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:09:57.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:12, diff=-14.095212s, valid=True
2026-05-28T12:09:57.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:09:57.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:09:57.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:09:57.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895639.90543s, valid=True
2026-05-28T12:09:57.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:09:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:09:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:09:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:09:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:09:57.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:09:57.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:09:57.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:09:57.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:09:58.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:09:58.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:09:58.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:09:58.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:09:58.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:09:58.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:09:58.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:09:59.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:09:59.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:09:59.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-28T12:09:59.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-28T12:09:59.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:09:59.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:10:29.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:10:29.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:10:29.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:10:29.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:10:29.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:10:30.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:10:30.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-28T12:10:30.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:10:30.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-28T12:10:30.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:10:30.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:10:30.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:10:30.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-28T12:10:32.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-28T12:10:32.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:10:32.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:10:32.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:10:32.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:10:32.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:10:32.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:10:32.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:10:32.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:10:32.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:10:32.871 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:10:32.871 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:10:32.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:10:32.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:10:32.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:10:33.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:10:33.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:10:33.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:10:33.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:10:33.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:10:33.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:10:33.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:10:33.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:10:33.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:10:33.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:10:23
2026-05-28T12:10:33.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68947, datetime.datetime(2026, 5, 28, 12, 10, 23), datetime.datetime(2026, 5, 28, 12, 10, 22), 'salt', 12.69, 33.28, None, 8.58, 197.1, 15.74, 830.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:10:33.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:10:33.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:10:33.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:22, diff=11.220247s, valid=True
2026-05-28T12:10:33.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:10:33.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:10:33.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:12, diff=21.22314s, valid=True
2026-05-28T12:10:33.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:10:33.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:10:33.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:22, diff=11.229974s, valid=True
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:10:33.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:10:33.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:12, diff=21.233025s, valid=True
2026-05-28T12:10:33.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:10:33.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:10:33.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:10:33.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895675.233698s, valid=True
2026-05-28T12:10:33.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:10:33.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:10:33.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:10:33.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:10:33.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:10:33.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:10:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:10:33.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:10:33.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:10:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:10:33.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:10:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:10:33.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:10:33.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:10:33.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:10:34.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:10:34.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:10:34.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:10:34.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-28T12:10:34.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-28T12:10:34.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:10:34.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:11:04.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:11:04.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:11:04.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:11:04.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:11:04.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:11:04.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:11:04.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-28T12:11:04.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:11:04.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-28T12:11:04.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:11:04.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:11:04.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:11:04.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-28T12:11:07.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-28T12:11:07.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:11:07.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:11:07.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:11:07.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:11:07.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:11:07.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:11:07.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:11:07.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:11:07.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:11:07.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:11:07.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:11:07.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:11:07.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:11:07.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:11:07.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:11:07.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:11:07.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:11:07.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:11:07.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:11:07.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:11:07.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:11:07.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:11:07.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:11:07.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:10:53
2026-05-28T12:11:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68948, datetime.datetime(2026, 5, 28, 12, 10, 53), datetime.datetime(2026, 5, 28, 12, 10, 53), 'salt', 12.72, 33.28, None, 9.39, 205.99, 15.74, 830.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:11:07.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:11:07.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:11:07.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:53, diff=14.505786s, valid=True
2026-05-28T12:11:07.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:11:07.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:11:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:12, diff=-4.491359s, valid=True
2026-05-28T12:11:07.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:11:07.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:10:47, diff=20.515423s, valid=True
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:11:07.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:11:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:12, diff=-4.481548s, valid=True
2026-05-28T12:11:07.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:11:07.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:11:07.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:11:07.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895709.519126s, valid=True
2026-05-28T12:11:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:11:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:11:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:11:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:11:07.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:11:07.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:11:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:11:07.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:11:07.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:11:07.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:11:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:11:07.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:11:07.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:11:07.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:11:08.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:11:08.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:11:08.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:11:08.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:11:08.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:11:08.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:11:08.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:11:08.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:11:38.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:11:38.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:11:38.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:11:39.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:11:39.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:11:39.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:11:39.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:11:39.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:11:39.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-28T12:11:39.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:11:39.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:11:39.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:11:39.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-28T12:11:42.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-28T12:11:42.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:11:42.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:11:42.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:11:42.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:11:42.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:11:42.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:11:42.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:11:42.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:11:42.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:11:42.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:11:42.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:11:42.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:11:42.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:11:42.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:11:42.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:11:42.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:11:42.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:11:42.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:11:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:11:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:11:42.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:11:42.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:11:42.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:11:42.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:11:23
2026-05-28T12:11:42.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68949, datetime.datetime(2026, 5, 28, 12, 11, 23), datetime.datetime(2026, 5, 28, 12, 11, 23), 'salt', 12.78, 33.12, None, 8.26, 235.14, 15.81, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:11:42.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:11:42.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:11:42.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:23, diff=19.626164s, valid=True
2026-05-28T12:11:42.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:11:42.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:11:42.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:12, diff=30.629123s, valid=True
2026-05-28T12:11:42.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:11:42.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:11:42.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:17, diff=25.635833s, valid=True
2026-05-28T12:11:42.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:11:42.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:11:42.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:11:42.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:11:42.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:11:42.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:11:42.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:12, diff=30.638854s, valid=True
2026-05-28T12:11:42.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:11:42.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:11:42.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:11:42.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895744.639512s, valid=True
2026-05-28T12:11:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:11:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:11:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:11:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:11:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:11:42.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:11:42.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:11:42.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:11:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:11:42.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:11:42.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:11:42.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:11:42.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:11:42.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:11:43.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:11:43.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:11:43.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:11:43.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:11:43.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-28T12:11:43.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-28T12:11:43.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:11:43.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:12:13.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:12:13.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:12:13.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:12:13.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:12:13.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:12:14.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:12:14.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-28T12:12:14.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:12:14.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-28T12:12:14.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:12:14.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:12:14.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:12:14.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-28T12:12:17.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-28T12:12:17.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:12:17.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:12:17.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:12:17.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:12:17.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:12:17.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:12:17.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:12:17.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:12:17.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:12:17.379 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:12:17.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:12:17.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:12:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:12:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:12:17.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:12:17.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:12:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:12:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:12:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:12:17.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:12:17.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:12:17.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:12:17.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:12:17.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:11:53
2026-05-28T12:12:17.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68950, datetime.datetime(2026, 5, 28, 12, 11, 53), datetime.datetime(2026, 5, 28, 12, 11, 53), 'salt', 12.75, 32.45, None, 9.18, 227.45, 16.08, 830.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:12:17.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:12:17.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:12:17.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:53, diff=24.723064s, valid=True
2026-05-28T12:12:17.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:12:17.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:12:17.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:12, diff=5.725882s, valid=True
2026-05-28T12:12:17.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:12:17.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:11:48, diff=29.732523s, valid=True
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:12:17.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:12:17.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:12, diff=5.735513s, valid=True
2026-05-28T12:12:17.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:12:17.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:12:17.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:12:17.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895779.736172s, valid=True
2026-05-28T12:12:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:12:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:12:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:12:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:12:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:12:17.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:12:17.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:12:17.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:12:17.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:12:17.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:12:17.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:12:17.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:12:18.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:12:18.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:12:18.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:12:18.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:12:18.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:12:18.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:12:18.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-28T12:12:18.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-28T12:12:18.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:12:18.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:12:48.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:12:48.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:12:48.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:12:49.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:12:49.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:12:49.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:12:49.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-28T12:12:49.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:12:49.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-28T12:12:49.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:12:49.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:12:49.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:12:49.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-28T12:12:51.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:12:51.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:12:51.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:12:51.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:12:51.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:12:51.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:12:51.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:12:51.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:12:51.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:12:51.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:12:51.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:12:51.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:12:51.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:12:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:12:51.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:12:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:12:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:12:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:12:52.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:12:52.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:12:52.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:12:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:12:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:12:52.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:12:52.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:12:23
2026-05-28T12:12:52.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68951, datetime.datetime(2026, 5, 28, 12, 12, 23), datetime.datetime(2026, 5, 28, 12, 12, 23), 'salt', 12.82, 32.82, None, 10.13, 224.94, 15.95, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:12:52.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:12:52.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:12:52.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:23, diff=29.124995s, valid=True
2026-05-28T12:12:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:12:52.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:12:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:12, diff=40.127827s, valid=True
2026-05-28T12:12:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:12:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:18, diff=34.134427s, valid=True
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:12:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:12:52.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:12:12, diff=40.137436s, valid=True
2026-05-28T12:12:52.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:12:52.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:12:52.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:12:52.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895814.138098s, valid=True
2026-05-28T12:12:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:12:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:12:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:12:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:12:52.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:12:52.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:12:52.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:12:52.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:12:52.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:12:52.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:12:52.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:12:52.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:12:52.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:12:52.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:12:52.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:12:53.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:12:53.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:12:53.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:12: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-28T12:12: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-28T12:12:53.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:12:53.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:13:23.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:13:23.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:13:23.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:13:23.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:13:23.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:13:23.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:13:23.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-28T12:13:23.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:13:23.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-28T12:13:23.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:13:23.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:13:23.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:13:23.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-28T12:13:26.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-28T12:13:26.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:13:26.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:13:26.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:13:26.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:13:26.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:13:26.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:13:26.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:13:26.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:13:26.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:13:26.467 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:13:26.467 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:13:26.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:13:26.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:13:26.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:13:26.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:13:26.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:13:26.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:13:26.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:13:26.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:13:26.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:13:26.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:13:26.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:13:26.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:13:26.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:13:24
2026-05-28T12:13:26.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68953, datetime.datetime(2026, 5, 28, 12, 13, 24), datetime.datetime(2026, 5, 28, 12, 13, 24), 'salt', 12.85, 33.31, None, 8.15, 239.78, 15.74, 830.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:13:26.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:13:26.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:13:26.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:24, diff=2.778201s, valid=True
2026-05-28T12:13:26.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:13:26.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:13:26.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:12, diff=14.781066s, valid=True
2026-05-28T12:13:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:13:26.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:13:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:20, diff=6.787641s, valid=True
2026-05-28T12:13:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:13:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:13:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:13:26.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:13:26.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:13:26.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:13:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:12, diff=14.790669s, valid=True
2026-05-28T12:13:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:13:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:13:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:13:26.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895848.791314s, valid=True
2026-05-28T12:13:26.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:13:26.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:13:26.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:13:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:13:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:13:26.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:13:26.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:13:26.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:13:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:13:26.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:13:26.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:13:27.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:13:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:13:27.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:13:27.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:13:27.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:13:27.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:13:27.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:13:27.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-28T12:13:27.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-28T12:13:27.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:13:27.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:13:57.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:13:57.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:13:57.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:13:58.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:13:58.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:13:58.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:13:58.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:13:58.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:13: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-28T12:13:58.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:13:58.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:13:58.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:13:58.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-28T12:14:01.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-28T12:14:01.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:14:01.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:14:01.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:14:01.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:14:01.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:14:01.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:14:01.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:14:01.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:14:01.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:14:01.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:14:01.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:14:01.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:14:01.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:14:01.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:14:01.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:14:01.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:14:01.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:14:01.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:14:01.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:14:01.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:14:01.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:14:01.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:14:01.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:14:02.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:13:55
2026-05-28T12:14:02.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68954, datetime.datetime(2026, 5, 28, 12, 13, 55), datetime.datetime(2026, 5, 28, 12, 13, 54), 'salt', 12.88, 31.92, None, 10.69, 200.71, 16.32, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:14:02.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:14:02.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:14:02.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:54, diff=8.01465s, valid=True
2026-05-28T12:14:02.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:14:02.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:14:02.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:12, diff=-9.982433s, valid=True
2026-05-28T12:14:02.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:14:02.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:13:52, diff=10.024326s, valid=True
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:14:02.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:14:02.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:12, diff=-9.972616s, valid=True
2026-05-28T12:14:02.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:14:02.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:14:02.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:14:02.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895884.028047s, valid=True
2026-05-28T12:14:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:14:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:14:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:14:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:14:02.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:14:02.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:14:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:14:02.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:14:02.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:14:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:14:02.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:14:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:14:02.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:14:02.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:14:02.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:14:02.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:14:03.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:14:03.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:14:03.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-28T12:14:03.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-28T12:14:03.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:14:03.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:14:33.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:14:33.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:14:33.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:14:33.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:14:33.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:14:33.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:14:33.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-28T12:14:33.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:14:33.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-28T12:14:33.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:14:33.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:14:33.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:14:33.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:14:36.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-28T12:14:36.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:14:36.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:14:36.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:14:36.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:14:36.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:14:36.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:14:36.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:14:36.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:14:36.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:14:36.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:14:36.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:14:36.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:14:36.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:14:36.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:14:36.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:14:36.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:14:36.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:14:36.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:14:36.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:14:36.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:14:36.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:14:36.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:14:36.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:14:36.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:14:25
2026-05-28T12:14:36.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68955, datetime.datetime(2026, 5, 28, 12, 14, 25), datetime.datetime(2026, 5, 28, 12, 14, 25), 'salt', 12.88, 31.76, None, 12.74, 242.2, 16.39, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:14:36.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:14:36.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:14:36.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:25, diff=11.671356s, valid=True
2026-05-28T12:14:36.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:14:36.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:14:36.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:12, diff=24.674171s, valid=True
2026-05-28T12:14:36.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:14:36.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:14:36.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:23, diff=13.680761s, valid=True
2026-05-28T12:14:36.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:14:36.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:14:36.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:14:36.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:14:36.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:14:36.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:14:36.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:12, diff=24.683746s, valid=True
2026-05-28T12:14:36.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:14:36.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:14:36.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:14:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895918.684386s, valid=True
2026-05-28T12:14:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:14:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:14:36.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:14:36.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:14:36.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:14:36.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:14:36.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:14:36.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:14:36.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:14:36.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:14:36.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:14:36.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:14:36.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:14:37.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:14:37.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:14:37.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:14:37.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:14:37.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:14:37.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-28T12:14:37.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-28T12:14:37.849 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:14:37.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:15:07.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:15:07.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:15:07.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:15:08.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:15:08.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:15:08.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:15:08.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-28T12:15:08.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:15:08.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-28T12:15:08.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:15:08.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:15:08.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:15: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-28T12:15:11.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-28T12:15:11.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:15:11.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:15:11.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:15:11.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:15:11.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:15:11.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:15:11.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:15:11.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:15:11.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:15:11.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:15:11.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:15:11.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:15:11.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:15:11.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:15:11.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:15:11.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:15:11.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:15:11.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:15:11.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:15:11.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:15:11.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:15:11.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:15:11.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:15:11.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:14:55
2026-05-28T12:15:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68956, datetime.datetime(2026, 5, 28, 12, 14, 55), datetime.datetime(2026, 5, 28, 12, 14, 55), 'salt', 12.92, 31.13, None, 8.72, 203.85, 16.67, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:15:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:15:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:15:11.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:55, diff=16.389103s, valid=True
2026-05-28T12:15:11.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:15:11.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:15:11.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:12, diff=-0.608s, valid=True
2026-05-28T12:15:11.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:15:11.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:15:11.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:14:55, diff=16.39888s, valid=True
2026-05-28T12:15:11.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:15:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:15:11.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:15:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:15:11.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:15:11.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:15:11.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:12, diff=-0.598028s, valid=True
2026-05-28T12:15:11.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:15:11.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:15:11.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:15:11.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895953.402616s, valid=True
2026-05-28T12:15:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:15:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:15:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:15:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:15:11.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:15:11.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:15:11.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:15:11.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:15:11.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:15:11.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:15:11.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:15:11.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:15:11.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:15:11.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:15:12.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:15:12.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:15:12.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:15:12.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:15:12.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-28T12:15:12.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-28T12:15:12.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:15:12.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:15:42.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:15:42.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:15:42.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:15:42.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:15:42.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:15:43.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:15:43.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:15:43.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:15:43.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-28T12:15:43.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:15:43.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:15:43.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:15:43.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-28T12:15:45.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-28T12:15:45.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:15:45.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:15:45.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:15:45.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:15:45.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:15:45.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:15:45.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:15:45.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:15:45.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:15:45.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:15:45.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:15:45.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:15:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:15:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:15:45.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:15:45.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:15:45.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:15:45.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:15:45.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:15:45.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:15:45.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:15:45.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:15:45.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:15:45.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:15:25
2026-05-28T12:15:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68957, datetime.datetime(2026, 5, 28, 12, 15, 25), datetime.datetime(2026, 5, 28, 12, 15, 25), 'salt', 12.82, 32.25, None, 6.74, 205.73, 16.18, 830.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:15:45.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:15:45.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:15:45.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:25, diff=20.76224s, valid=True
2026-05-28T12:15:45.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:15:45.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:15:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:12, diff=33.765073s, valid=True
2026-05-28T12:15:45.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:15:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:15:45.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:19, diff=26.771716s, valid=True
2026-05-28T12:15:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:15:45.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:15:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:15:45.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:15:45.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:15:45.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:15:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:12, diff=33.774704s, valid=True
2026-05-28T12:15:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:15:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:15:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:15:45.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=895987.775351s, valid=True
2026-05-28T12:15:45.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:15:45.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:15:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:15:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:15:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:15:45.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:15:45.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:15:45.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:15:45.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:15:45.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:15:45.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:15:46.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:15:46.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:15:46.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:15:46.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:15:46.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:15:46.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:15:46.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:15:46.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-28T12:15:46.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-28T12:15:46.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:15:46.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:16:16.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:16:16.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:16:16.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:16:17.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:16:17.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:16:17.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:16:17.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-28T12:16:17.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:16:17.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:16:17.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:16:17.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:16:17.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:16:17.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-28T12:16:20.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-28T12:16:20.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:16:20.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:16:20.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:16:20.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:16:20.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:16:20.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:16:20.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:16:20.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:16:20.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:16:20.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:16:20.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:16:20.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:16:20.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:16:20.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:16:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:16:20.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:16:20.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:16:20.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:16:20.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:16:20.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:16:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:16:20.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:16:20.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:16:20.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:15:56
2026-05-28T12:16:20.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68958, datetime.datetime(2026, 5, 28, 12, 15, 56), datetime.datetime(2026, 5, 28, 12, 15, 55), 'salt', 13.02, 33.71, None, 10.52, 215.69, 15.61, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:16:20.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:16:20.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:16:20.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:55, diff=25.427746s, valid=True
2026-05-28T12:16:20.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:16:20.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:16:20.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:12, diff=8.430627s, valid=True
2026-05-28T12:16:20.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:16:20.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:15:49, diff=31.437202s, valid=True
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:16:20.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:16:20.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:12, diff=8.440264s, valid=True
2026-05-28T12:16:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:16:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:16:20.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:16:20.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896022.440932s, valid=True
2026-05-28T12:16:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:16:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:16:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:16:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:16:20.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:16:20.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:16:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:16:20.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:16:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:16:20.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:16:20.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:16:20.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:16:20.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:16:20.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:16:20.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:16:21.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:16:21.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:16:21.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:16:21.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-28T12:16:21.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-28T12:16:21.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:16:21.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:16:51.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:16:51.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:16:51.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:16:51.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:16:51.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:16:52.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:16: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-28T12:16:52.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:16:52.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-28T12:16:52.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:16:52.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:16:52.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:16: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-28T12:16:54.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-28T12:16:54.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:16:54.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:16:54.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:16:54.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:16:54.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:16:54.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:16:54.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:16:54.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:16:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:16:54.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:16:54.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:16:54.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:16:54.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:16:54.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:16:54.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:16:54.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:16:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:16:54.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:16:54.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:16:54.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:16:54.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:16:54.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:16:54.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:16:54.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:16:26
2026-05-28T12:16:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68959, datetime.datetime(2026, 5, 28, 12, 16, 26), datetime.datetime(2026, 5, 28, 12, 16, 26), 'salt', 13.05, 33.41, None, 11.96, 205.16, 15.73, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:16:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:16:54.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:16:54.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:26, diff=28.946041s, valid=True
2026-05-28T12:16:54.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:16:54.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:16:54.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:12, diff=42.949421s, valid=True
2026-05-28T12:16:54.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:16:54.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:16:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:19, diff=35.957639s, valid=True
2026-05-28T12:16:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:16:54.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:16:54.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:16:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:16:54.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:16:54.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:16:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:16:12, diff=42.961401s, valid=True
2026-05-28T12:16:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:16:54.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:16:54.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:16:54.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896056.962221s, valid=True
2026-05-28T12:16:54.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:16:54.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:16:54.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:16:54.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:16:54.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:16:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:16:55.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:16:55.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:16:55.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:16:55.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:16:55.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:16:55.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:16:55.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:16:55.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:16:55.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:16:56.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:16:56.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:16:56.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:16:56.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-28T12:16:56.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-28T12:16:56.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:16:56.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:17:26.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:17:26.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:17:26.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:17:26.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:17:26.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:17:27.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:17:27.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-28T12:17:27.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:17:27.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-28T12:17:27.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:17:27.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:17:27.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:17:27.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:17:29.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-28T12:17:29.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:17:29.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:17:29.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:17:29.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:17:29.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:17:29.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:17:29.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:17:29.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:17:29.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:17:29.792 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:17:29.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:17:29.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:17:29.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:17:29.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:17:30.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:17:30.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:17:30.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:17:30.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:17:30.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:17:30.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:17:30.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:17:30.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:17:30.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:17:30.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:17:26
2026-05-28T12:17:30.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68961, datetime.datetime(2026, 5, 28, 12, 17, 26), datetime.datetime(2026, 5, 28, 12, 17, 26), 'salt', 12.95, 31.96, None, 9.88, 195.05, 16.32, 830.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:17:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:17:30.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:17:30.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:26, diff=4.169975s, valid=True
2026-05-28T12:17:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:17:30.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:17:30.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:12, diff=18.172861s, valid=True
2026-05-28T12:17:30.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:17:30.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:17:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:22, diff=8.17961s, valid=True
2026-05-28T12:17:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:17:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:17:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:17:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:17:30.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:17:30.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:17:30.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:12, diff=18.182665s, valid=True
2026-05-28T12:17:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:17:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:17:30.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:17:30.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896092.183316s, valid=True
2026-05-28T12:17:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:17:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:17:30.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:17:30.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:17:30.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:17:30.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:17:30.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:17:30.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:17:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:17:30.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:17:30.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:17:30.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:17:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:17:30.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:17:30.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:17:31.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:17:31.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:17:31.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:17:31.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-28T12:17:31.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-28T12:17:31.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:17:31.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:18:01.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:18:01.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:18:01.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:18:01.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:18:01.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:18:02.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:18:02.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-28T12:18:02.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:18:02.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-28T12:18:02.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:18:02.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:18:02.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:18:02.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-28T12:18:04.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-28T12:18:04.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:18:04.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:18:04.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:18:04.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:18:04.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:18:04.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:18:04.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:18:04.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:18:04.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:18:04.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:18:04.747 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:18:04.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:18:04.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:18:04.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:18:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:18:04.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:18:04.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:18:04.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:18:05.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:18:05.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:18:05.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:18:05.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:18:05.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:18:05.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:17:57
2026-05-28T12:18:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68962, datetime.datetime(2026, 5, 28, 12, 17, 57), datetime.datetime(2026, 5, 28, 12, 17, 56), 'salt', 13.02, 33.25, None, 8.58, 230.89, 15.8, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:18:05.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:18:05.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:18:05.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:56, diff=9.073352s, valid=True
2026-05-28T12:18:05.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:18:05.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:18:05.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:12, diff=-6.923796s, valid=True
2026-05-28T12:18:05.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:18:05.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:18:05.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:17:54, diff=11.082937s, valid=True
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:18:05.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:18:05.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:12, diff=-6.914029s, valid=True
2026-05-28T12:18:05.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:18:05.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:18:05.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:18:05.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896127.08663s, valid=True
2026-05-28T12:18:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:18:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:18:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:18:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:18:05.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:18:05.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:18:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:18:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:18:05.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:18:05.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:18:05.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:18:05.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:18:05.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:18:05.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:18:05.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:18:06.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:18:06.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:18:06.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:18:06.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:18:06.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:18:06.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:18:06.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:18:36.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:18:36.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:18:36.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:18:36.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:18:36.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:18:37.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:18:37.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:18:37.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:18:37.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-28T12:18:37.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:18:37.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:18:37.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:18:37.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-28T12:18: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-28T12:18:39.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:18:39.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:18:39.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:18:39.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:18:39.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:18:39.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:18:39.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:18:39.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:18:39.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:18:39.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:18:39.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:18:39.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:18:39.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:18:39.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:18:39.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:18:39.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:18:39.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:18:39.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:18:39.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:18:39.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:18:39.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:18:39.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:18:39.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:18:40.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:18:27
2026-05-28T12:18:40.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68963, datetime.datetime(2026, 5, 28, 12, 18, 27), datetime.datetime(2026, 5, 28, 12, 18, 26), 'salt', 13.11, 34.87, None, 10.83, 245.94, 15.15, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:18:40.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:18:40.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:18:40.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:26, diff=14.057094s, valid=True
2026-05-28T12:18:40.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:18:40.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:18:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:12, diff=28.060355s, valid=True
2026-05-28T12:18:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:18:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:25, diff=15.068448s, valid=True
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:18:40.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:18:40.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:12, diff=28.071776s, valid=True
2026-05-28T12:18:40.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:18:40.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:18:40.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:18:40.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896162.072465s, valid=True
2026-05-28T12:18:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:18:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:18:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:18:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:18:40.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:18:40.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:18:40.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:18:40.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:18:40.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:18:40.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:18:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:18:40.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:18:40.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:18:40.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:18:40.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:18:40.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:18:41.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:18:41.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:18:41.079 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:18:41.079 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:18:41.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:18:41.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:19:11.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:19:11.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:19:11.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:19:11.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:19:11.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:19:11.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:19:11.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-28T12:19:11.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:19:11.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-28T12:19:11.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:19:11.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:19:11.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:19:11.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:19:15.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-28T12:19:15.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:19:15.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:19:15.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:19:15.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:19:15.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:19:15.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:19:15.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:19:15.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:19:15.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:19:15.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:19:15.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:19:15.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:19:15.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:19:15.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:19:15.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:19:15.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:19:15.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:19:15.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:19:15.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:19:15.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:19:15.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:19:15.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:19:15.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:19:15.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:18:57
2026-05-28T12:19:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68964, datetime.datetime(2026, 5, 28, 12, 18, 57), datetime.datetime(2026, 5, 28, 12, 18, 57), 'salt', 13.15, 35.3, None, 12.63, 241.4, 15.0, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:19:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:19:15.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:19:15.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:57, diff=18.589298s, valid=True
2026-05-28T12:19:15.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:19:15.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:19:15.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:12, diff=3.592363s, valid=True
2026-05-28T12:19:15.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:19:15.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:18:56, diff=19.599051s, valid=True
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:19:15.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:19:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:12, diff=3.602047s, valid=True
2026-05-28T12:19:15.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:19:15.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:19:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:19:15.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896197.602707s, valid=True
2026-05-28T12:19:15.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:19:15.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:19:15.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:19:15.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:19:15.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:19:15.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:19:15.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:19:15.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:19:15.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:19:15.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:19:15.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:19:15.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:19:15.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:19:16.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:19:16.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:19:16.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:19:16.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:19:16.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:19:16.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-28T12:19:16.702 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:19:16.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:19:16.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:19:46.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:19:46.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:19:46.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:19:47.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:19:47.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:19:47.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:19:47.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-28T12:19:47.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:19:47.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-28T12:19:47.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:19:47.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:19:47.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:19:47.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:19: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-28T12:19:50.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:19:50.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:19:50.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:19:50.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:19:50.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:19:50.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:19:50.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:19:50.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:19:50.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:19:50.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:19:50.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:19:50.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:19:50.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:19:50.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:19:50.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:19:50.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:19:50.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:19:50.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:19:50.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:19:50.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:19:50.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:19:50.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:19:50.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:19:50.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:19:27
2026-05-28T12:19:50.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68965, datetime.datetime(2026, 5, 28, 12, 19, 27), datetime.datetime(2026, 5, 28, 12, 19, 27), 'salt', 13.41, 35.34, None, 11.75, 236.49, 15.01, 830.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:19:50.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:19:50.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:19:50.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:27, diff=23.471073s, valid=True
2026-05-28T12:19:50.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:19:50.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:19:50.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:12, diff=38.473907s, valid=True
2026-05-28T12:19:50.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:19:50.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:19:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:21, diff=29.48067s, valid=True
2026-05-28T12:19:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:19:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:19:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:19:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:19:50.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:19:50.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:19:50.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:12, diff=38.483661s, valid=True
2026-05-28T12:19:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:19:50.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:19:50.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:19:50.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896232.484311s, valid=True
2026-05-28T12:19:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:19:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:19:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:19:50.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:19:50.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:19:50.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:19:50.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:19:50.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:19:50.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:19:50.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:19:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:19:50.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:19:50.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:19:50.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:19:51.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:19:51.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:19:51.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:19:51.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:19:51.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-28T12:19:51.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-28T12:19:51.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:19:51.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:20:21.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:20:21.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:20:21.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:20:22.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:20:22.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:20:22.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:20:22.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-28T12:20:22.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:20:22.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-28T12:20:22.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:20:22.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:20:22.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:20:22.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-28T12:20:27.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-28T12:20:27.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:20:27.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:20:27.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:20:27.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:20:27.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:20:27.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:20:27.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:20:27.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:20:27.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:20:27.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:20:27.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:20:27.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:20:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:20:27.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:20:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:20:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:20:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:20:27.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:20:27.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:20:27.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:20:27.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:20:27.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:20:27.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:20:28.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:19:58
2026-05-28T12:20:28.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68966, datetime.datetime(2026, 5, 28, 12, 19, 58), datetime.datetime(2026, 5, 28, 12, 19, 57), 'salt', 13.58, 33.05, None, 9.81, 224.96, 15.94, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:20:28.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:20:28.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:20:28.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:57, diff=31.00963s, valid=True
2026-05-28T12:20:28.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:20:28.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:20:28.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:20:12, diff=16.014107s, valid=True
2026-05-28T12:20:28.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:20:28.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:19:51, diff=37.022539s, valid=True
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:20:28.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:20:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:20:12, diff=16.025603s, valid=True
2026-05-28T12:20:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:20:28.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:20:28.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:20:28.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896270.026293s, valid=True
2026-05-28T12:20:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:20:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:20:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:20:28.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:20:28.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:20:28.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:20:28.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:20:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:20:28.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:20:28.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:20:28.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:20:28.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:20:28.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:20:28.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:20:29.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:20:29.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:20:29.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:20:29.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-28T12:20:29.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-28T12:20:29.363 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:20:29.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:20:59.393 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:20:59.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:20:59.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:20:59.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:20:59.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:20:59.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:20:59.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-28T12:20:59.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:20:59.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-28T12:20:59.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:20:59.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:20:59.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:20:59.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-28T12:21:04.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:21:04.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:21:04.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:21:04.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:21:04.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:21:04.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:21:04.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:21:04.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:21:04.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:21:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:21:04.877 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:21:04.877 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:21:04.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:21:04.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:21:04.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:21:05.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:21:05.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:21:05.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:21:05.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:21:05.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:21:05.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:21:05.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:21:05.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:21:05.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:21:05.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:20:58
2026-05-28T12:21:05.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68968, datetime.datetime(2026, 5, 28, 12, 20, 58), datetime.datetime(2026, 5, 28, 12, 20, 58), 'salt', 13.05, 30.03, None, 4.7, 273.52, 17.16, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:21:05.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:21:05.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:21:05.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:20:58, diff=7.221497s, valid=True
2026-05-28T12:21:05.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:21:05.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:21:05.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:12, diff=-6.775598s, valid=True
2026-05-28T12:21:05.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:21:05.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:20:52, diff=13.231167s, valid=True
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:21:05.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:21:05.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:12, diff=-6.765794s, valid=True
2026-05-28T12:21:05.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:21:05.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:21:05.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:21:05.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896307.234872s, valid=True
2026-05-28T12:21:05.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:21:05.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:21:05.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:21:05.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:21:05.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:21:05.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:21:05.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:21:05.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:21:05.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:21:05.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:21:05.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:21:05.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:21:05.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:21:05.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:21:05.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:21:06.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:21:06.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:21:06.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:21:06.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-28T12:21:06.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-28T12:21:06.503 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:21:06.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:21:36.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:21:36.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:21:36.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:21:36.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:21:36.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:21:37.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:21:37.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:21:37.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:21:37.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-28T12:21:37.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:21:37.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:21:37.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:21:37.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-28T12:21:39.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-28T12:21:39.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:21:39.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:21:39.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:21:39.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:21:39.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:21:39.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:21:39.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:21:39.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:21:39.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:21:39.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:21:39.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:21:39.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:21:40.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:21:40.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:21:40.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:21:40.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:21:40.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:21:40.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:21:40.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:21:40.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:21:40.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:21:40.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:21:40.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:21:40.280 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:21:28
2026-05-28T12:21:40.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68969, datetime.datetime(2026, 5, 28, 12, 21, 28), datetime.datetime(2026, 5, 28, 12, 21, 28), 'salt', 12.85, 30.79, None, 2.3, 240.81, 16.8, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:21:40.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:21:40.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:21:40.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:28, diff=12.287063s, valid=True
2026-05-28T12:21:40.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:21:40.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:21:40.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:12, diff=28.289867s, valid=True
2026-05-28T12:21:40.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:21:40.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:23, diff=17.296499s, valid=True
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:21:40.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:21:40.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:12, diff=28.299488s, valid=True
2026-05-28T12:21:40.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:21:40.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:21:40.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:21:40.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896342.300142s, valid=True
2026-05-28T12:21:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:21:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:21:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:21:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:21:40.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:21:40.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:21:40.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:21:40.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:21:40.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:21:40.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:21:40.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:21:40.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:21:40.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:21:40.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:21:40.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:21:41.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:21:41.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:21:41.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:21:41.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-28T12:21:41.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-28T12:21:41.564 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:21:41.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:22:11.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:22:11.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:22:11.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:22:11.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:22:11.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:22:11.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:22:11.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-28T12:22:11.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:22:11.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-28T12:22:11.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:22:11.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:22:11.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:22:11.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-28T12:22:14.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-28T12:22:14.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:22:14.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:22:14.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:22:14.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:22:14.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:22:14.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:22:14.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:22:14.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:22:14.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:22:14.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:22:14.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:22:14.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:22:14.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:22:14.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:22:14.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:22:14.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:22:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:22:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:22:14.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:22:14.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:22:14.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:22:14.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:22:14.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:22:14.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:21:59
2026-05-28T12:22:14.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68970, datetime.datetime(2026, 5, 28, 12, 21, 59), datetime.datetime(2026, 5, 28, 12, 21, 58), 'salt', 12.82, 32.52, None, 6.07, 238.3, 16.07, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:22:14.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:22:14.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:22:14.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:58, diff=16.776728s, valid=True
2026-05-28T12:22:14.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:22:14.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:22:14.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:12, diff=2.779513s, valid=True
2026-05-28T12:22:14.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:22:14.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:21:54, diff=20.786172s, valid=True
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:22:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:22:14.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:12, diff=2.789185s, valid=True
2026-05-28T12:22:14.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:22:14.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:22:14.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:22:14.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896376.789858s, valid=True
2026-05-28T12:22:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:22:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:22:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:22:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:22:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:22:14.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:22:14.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:22:14.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:22:14.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:22:14.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:22:14.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:22:15.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:22:15.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:22:15.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:22:15.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:22:15.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:22:15.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:22:15.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:22:15.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:22:15.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:22:16.030 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:22:16.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:22:46.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:22:46.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:22:46.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:22:46.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:22:46.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:22:46.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:22:46.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-28T12:22:46.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:22:46.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:22:46.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:22:46.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:22:46.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:22:46.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-28T12:22:49.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-28T12:22:49.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:22:49.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:22:49.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:22:49.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:22:49.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:22:49.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:22:49.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:22:49.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:22:49.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:22:49.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:22:49.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:22:49.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:22:49.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:22:49.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:22:49.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:22:49.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:22:49.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:22:49.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:22:49.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:22:49.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:22:49.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:22:49.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:22:49.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:22:49.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:22:29
2026-05-28T12:22:49.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68971, datetime.datetime(2026, 5, 28, 12, 22, 29), datetime.datetime(2026, 5, 28, 12, 22, 28), 'salt', 12.95, 33.08, None, 8.33, 298.24, 15.85, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:22:49.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:22:49.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:22:49.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:28, diff=21.68147s, valid=True
2026-05-28T12:22:49.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:22:49.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:22:49.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:12, diff=37.68426s, valid=True
2026-05-28T12:22:49.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:22:49.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:22:49.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:26, diff=23.690884s, valid=True
2026-05-28T12:22:49.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:22:49.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:22:49.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:22:49.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:22:49.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:22:49.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:22:49.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:12, diff=37.693955s, valid=True
2026-05-28T12:22:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:22:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:22:49.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:22:49.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896411.694638s, valid=True
2026-05-28T12:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:22:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:22:49.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:22:49.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:22:49.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:22:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:22:49.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:22:49.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:22:49.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:22:50.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:22:50.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:22:50.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:22:50.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:22:50.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:22:50.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-28T12:22:50.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-28T12:22:50.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:22:50.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:23:20.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:23:20.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:23:20.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:23:21.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:23:21.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:23:21.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:23:21.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-28T12:23:21.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:23:21.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-28T12:23:21.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:23:21.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:23:21.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:23: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-28T12:23:24.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-28T12:23:24.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:23:24.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:23:24.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:23:24.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:23:24.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:23:24.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:23:24.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:23:24.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:23:24.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:23:24.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:23:24.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:23:24.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:23:24.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:23:24.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:23:24.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:23:24.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:23:24.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:23:24.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:23:24.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:23:24.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:23:24.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:23:24.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:23:24.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:23:24.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:22:59
2026-05-28T12:23:24.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68972, datetime.datetime(2026, 5, 28, 12, 22, 59), datetime.datetime(2026, 5, 28, 12, 22, 59), 'salt', 12.98, 33.08, None, 9.25, 291.16, 15.85, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:23:24.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:23:24.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:23:24.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:59, diff=25.51239s, valid=True
2026-05-28T12:23:24.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:23:24.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:23:24.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:12, diff=12.515197s, valid=True
2026-05-28T12:23:24.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:23:24.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:23:24.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:22:57, diff=27.521866s, valid=True
2026-05-28T12:23:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:23:24.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:23:24.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:23:24.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:23:24.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:23:24.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:23:24.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:12, diff=12.524865s, valid=True
2026-05-28T12:23:24.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:23:24.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:23:24.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:23:24.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896446.525521s, valid=True
2026-05-28T12:23:24.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:23:24.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:23:24.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:23:24.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:23:24.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:23:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:23:24.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:23:24.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:23:24.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:23:24.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:23:24.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:23:24.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:23:24.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:23:24.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:23:25.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:23:25.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:23:25.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:23:25.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:23:25.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-28T12:23:25.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-28T12:23:25.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:23:25.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:23:55.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:23:55.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:23:55.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:23:56.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:23:56.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:23:56.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:23:56.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-28T12:23:56.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:23:56.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-28T12:23:56.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:23:56.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:23:56.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:23:56.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-28T12:23:58.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-28T12:23:58.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:23:58.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:23:58.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:23:58.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:23:58.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:23:58.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:23:58.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:23:58.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:23:58.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:23:58.988 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:23:58.988 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:23:58.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:23:59.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:23:59.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:23:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:23:59.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:23:59.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:23:59.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:23:59.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:23:59.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:23:59.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:23:59.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:23:59.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:23:59.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:23:29
2026-05-28T12:23:59.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68973, datetime.datetime(2026, 5, 28, 12, 23, 29), datetime.datetime(2026, 5, 28, 12, 23, 29), 'salt', 12.82, 31.99, None, 6.25, 288.53, 16.29, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:23:59.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:23:59.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:23:59.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:29, diff=30.31821s, valid=True
2026-05-28T12:23:59.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:23:59.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:23:59.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:12, diff=47.321125s, valid=True
2026-05-28T12:23:59.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:23:59.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:23:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:29, diff=30.327893s, valid=True
2026-05-28T12:23:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:23:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:23:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:23:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:23:59.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:23:59.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:23:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:23:12, diff=47.330986s, valid=True
2026-05-28T12:23:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:23:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:23:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:23:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896481.331664s, valid=True
2026-05-28T12:23:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:23:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:23:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:23:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:23:59.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:23:59.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:23:59.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:23:59.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:23:59.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:23:59.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:23:59.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:23:59.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:23:59.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:23:59.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:23:59.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:24:00.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:24:00.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:24:00.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:24:00.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:24:00.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-28T12:24:00.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:24:00.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:24:30.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:24:30.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:24:30.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:24:31.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:24:31.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:24:31.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:24:31.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-28T12:24:31.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:24:31.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-28T12:24:31.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:24:31.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:24:31.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:24:31.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:24:34.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-28T12:24:34.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:24:34.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:24:34.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:24:34.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:24:34.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:24:34.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:24:34.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:24:34.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:24:34.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:24:34.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:24:34.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:24:34.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:24:34.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:24:34.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:24:34.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:24:34.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:24:34.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:24:34.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:24:34.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:24:34.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:24:34.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:24:34.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:24:34.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:24:34.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:24:30
2026-05-28T12:24:34.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68975, datetime.datetime(2026, 5, 28, 12, 24, 30), datetime.datetime(2026, 5, 28, 12, 24, 29), 'salt', 12.85, 34.44, None, 2.61, 329.9, 15.3, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:24:34.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:24:34.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:24:34.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:24:29, diff=5.865682s, valid=True
2026-05-28T12:24:34.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:24:34.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:24:34.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:24:12, diff=22.868501s, valid=True
2026-05-28T12:24:34.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:24:34.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:24:24, diff=10.875069s, valid=True
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:24:34.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:24:34.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:24:12, diff=22.878047s, valid=True
2026-05-28T12:24:34.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:24:34.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:24:34.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:24:34.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896516.878701s, valid=True
2026-05-28T12:24:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:24:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:24:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:24:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:24:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:24:34.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:24:34.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:24:34.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:24:34.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:24:35.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:24:35.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:24:35.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:24:35.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:24:35.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:24:35.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:24:35.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:24:35.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:24:35.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:24:35.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-28T12:24:35.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-28T12:24:36.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:24:36.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:25:06.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:25:06.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:25:06.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:25:06.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:25:06.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:25:06.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:25:06.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-28T12:25:06.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:25:06.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-28T12:25:06.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:25:06.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:25:06.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:25:06.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-28T12:25:10.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:25:10.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:25:10.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:25:10.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:25:10.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:25:10.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:25:10.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:25:10.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:25:10.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:25:10.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:25:10.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:25:10.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:25:10.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:25:10.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:25:10.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:25:10.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:25:10.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:25:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:25:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:25:10.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:25:10.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:25:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:25:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:25:10.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:25:10.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:25:00
2026-05-28T12:25:10.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68976, datetime.datetime(2026, 5, 28, 12, 25), datetime.datetime(2026, 5, 28, 12, 25), 'salt', 12.98, 34.41, None, 3.85, 313.86, 15.32, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:25:10.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:25:10.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:25:10.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:00, diff=10.995195s, valid=True
2026-05-28T12:25:10.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:25:10.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:25:10.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:12, diff=-1.001996s, valid=True
2026-05-28T12:25:10.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:25:10.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:25:11.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:24:54, diff=17.004709s, valid=True
2026-05-28T12:25:11.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:25:11.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:25:11.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:25:11.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:25:11.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:25:11.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:25:11.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:12, diff=-0.99227s, valid=True
2026-05-28T12:25:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:25:11.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:25:11.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:25:11.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896553.0084s, valid=True
2026-05-28T12:25:11.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:25:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:25:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:25:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:25:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:25:11.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:25:11.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:25:11.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:25:11.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:25:11.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:25:11.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:25:11.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:25:11.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:25:11.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:25:11.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:25:11.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:25:11.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:25:11.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:25:11.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:25: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-28T12:25:12.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:25:12.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:25:42.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:25:42.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:25:42.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:25:42.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:25:42.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:25:43.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:25:43.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-28T12:25:43.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:25:43.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-28T12:25:43.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:25:43.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:25:43.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:25:43.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-28T12:25: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-28T12:25:45.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:25:45.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:25:45.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:25:45.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:25:45.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:25:45.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:25:45.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:25:45.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:25:45.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:25:45.478 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:25:45.478 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:25:45.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:25:45.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:25:45.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:25:45.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:25:45.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:25:45.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:25:45.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:25:45.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:25:45.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:25:45.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:25:45.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:25:45.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:25:45.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:25:30
2026-05-28T12:25:45.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68977, datetime.datetime(2026, 5, 28, 12, 25, 30), datetime.datetime(2026, 5, 28, 12, 25, 30), 'salt', 13.11, 34.11, None, 9.64, 209.5, 15.45, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:25:45.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:25:45.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:25:45.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:30, diff=15.818381s, valid=True
2026-05-28T12:25:45.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:25:45.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:12, diff=33.821304s, valid=True
2026-05-28T12:25:45.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:25:45.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:24, diff=21.827873s, valid=True
2026-05-28T12:25:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:25:45.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:25:45.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:25:45.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:25:45.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:25:45.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:25:45.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:12, diff=33.830872s, valid=True
2026-05-28T12:25:45.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:25:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:25:45.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:25:45.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896587.831514s, valid=True
2026-05-28T12:25:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:25:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:25:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:25:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:25:45.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:25:45.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:25:45.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:25:45.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:25:45.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:25:46.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:25:46.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:25:46.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:25:46.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:25:46.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:25:46.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:25:46.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:25:46.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:25:46.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:25:46.944 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:25:46.944 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:25:47.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:25:47.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:26:17.147 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:26:17.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:26:17.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:26:17.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:26:17.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:26:17.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:26:17.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-28T12:26:17.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:26:17.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-28T12:26:17.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:26:17.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:26:17.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:26:17.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-28T12:26:20.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-28T12:26:20.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:26:20.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:26:20.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:26:20.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:26:20.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:26:20.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:26:20.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:26:20.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:26:20.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:26:20.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:26:20.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:26:20.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:26:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:26:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:26:20.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:26:20.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:26:20.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:26:20.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:26:20.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:26:20.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:26:20.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:26:20.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:26:20.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:26:20.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:26:01
2026-05-28T12:26:20.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68978, datetime.datetime(2026, 5, 28, 12, 26, 1), datetime.datetime(2026, 5, 28, 12, 26), 'salt', 13.18, 32.95, None, 9.35, 225.0, 15.93, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:26:20.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:26:20.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:26:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:00, diff=20.58084s, valid=True
2026-05-28T12:26:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:26:20.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:26:20.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=8.586364s, valid=True
2026-05-28T12:26:20.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:26:20.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:25:55, diff=25.599396s, valid=True
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:26:20.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:26:20.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:26:20.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=8.606295s, valid=True
2026-05-28T12:26:20.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:26:20.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:26:20.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:26:20.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896622.607691s, valid=True
2026-05-28T12:26:20.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:26:20.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:26:20.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:26:20.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:26:20.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:26:20.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:26:20.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:26:20.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:26:20.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:26:20.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:26:20.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:26:20.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:26:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:26:21.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:26:21.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:26:21.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:26:21.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:26:21.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:26:21.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:26:21.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-28T12:26:21.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:26:21.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:26:52.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:26:52.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:26:52.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:26:52.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:26:52.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:26:52.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:26:52.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:26:52.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:26:52.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-28T12:26:52.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:26:52.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:26:52.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:26:52.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:26:55.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-28T12:26:55.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:26:55.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:26:55.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:26:55.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:26:55.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:26:55.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:26:55.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:26:55.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:26:55.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:26:55.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:26:55.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:26:55.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:26:55.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:26:55.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:26:55.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:26:55.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:26:55.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:26:55.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:26:55.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:26:55.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:26:55.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:26:55.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:26:55.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:26:55.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:26:31
2026-05-28T12:26:55.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68979, datetime.datetime(2026, 5, 28, 12, 26, 31), datetime.datetime(2026, 5, 28, 12, 26, 31), 'salt', 12.88, 32.68, None, 7.73, 221.34, 16.0, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:26:55.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:26:55.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:26:55.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:31, diff=24.42831s, valid=True
2026-05-28T12:26:55.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:26:55.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:26:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=43.4311s, valid=True
2026-05-28T12:26:55.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:26:55.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:26:55.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:27, diff=28.43777s, valid=True
2026-05-28T12:26:55.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:26:55.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:26:55.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:26:55.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:26:55.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:26:55.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:26:55.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=43.440767s, valid=True
2026-05-28T12:26:55.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:26:55.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:26:55.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:26:55.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896657.441417s, valid=True
2026-05-28T12:26:55.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:26:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:26:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:26:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:26:55.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:26:55.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:26:55.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:26:55.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:26:55.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:26:55.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:26:55.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:26:55.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:26:55.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:26:55.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:26:55.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:26:56.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:26:56.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:26:56.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:26:56.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-28T12:26:56.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-28T12:26:56.638 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:26:56.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:27:26.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:27:26.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:27:26.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:27:27.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:27:27.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:27:27.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:27:27.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-28T12:27:27.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:27:27.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-28T12:27:27.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:27:27.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:27:27.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:27:27.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-28T12:27:30.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-28T12:27:30.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:27:30.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:27:30.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:27:30.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:27:30.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:27:30.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:27:30.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:27:30.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:27:30.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:27:30.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:27:30.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:27:30.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:27:30.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:27:30.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:27:30.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:27:30.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:27:30.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:27:30.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:27:30.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:27:30.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:27:30.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:27:30.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:27:30.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:27:30.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:27:02
2026-05-28T12:27:30.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68980, datetime.datetime(2026, 5, 28, 12, 27, 2), datetime.datetime(2026, 5, 28, 12, 27, 1), 'salt', 12.91, 34.64, None, 6.92, 240.01, 15.22, 830.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:27:30.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:27:30.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:27:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:27:01, diff=29.993502s, valid=True
2026-05-28T12:27:30.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:27:30.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:27:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=78.996279s, valid=True
2026-05-28T12:27:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:27:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:27:31.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:58, diff=33.002941s, valid=True
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:27:31.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:27:31.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=79.005949s, valid=True
2026-05-28T12:27:31.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:27:31.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:27:31.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:27:31.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896693.006636s, valid=True
2026-05-28T12:27:31.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:27:31.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:27:31.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:27:31.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:27:31.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:27:31.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:27:31.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:27:31.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:27:31.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:27:31.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:27:31.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:27:31.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:27:31.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:27:31.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:27:31.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:27:31.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:27:32.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:27:32.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:27:32.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-28T12:27:32.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-28T12:27:32.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:27:32.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:28:02.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:28:02.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:28:02.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:28:02.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:28:02.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:28:02.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:28:02.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-28T12:28:02.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:28:02.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-28T12:28:02.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:28:02.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:28:02.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:28:02.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-28T12:28:05.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-28T12:28:05.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:28:05.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:28:05.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:28:05.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:28:05.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:28:05.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:28:05.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:28:05.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:28:05.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:28:05.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:28:05.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:28:05.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:28:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:28:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:28:05.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:28:05.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:28:05.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:28:05.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:28:05.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T12:28:05.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:28:05.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:28:05.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:28:05.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:28:05.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:28:04
2026-05-28T12:28:05.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68982, datetime.datetime(2026, 5, 28, 12, 28, 4), datetime.datetime(2026, 5, 28, 12, 28, 2), 'salt', 12.98, 33.02, None, 5.15, 265.36, 15.88, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:28:05.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:28:05.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:28:05.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:28:02, diff=3.391183s, valid=True
2026-05-28T12:28:05.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:28:05.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:28:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=113.39402s, valid=True
2026-05-28T12:28:05.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:28:05.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:28:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:28:01, diff=4.400654s, valid=True
2026-05-28T12:28:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:28:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:28:05.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:28:05.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:28:05.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:28:05.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T12:28:05.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:26:12, diff=113.403664s, valid=True
2026-05-28T12:28:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:28:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:28:05.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:28:05.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896727.404328s, valid=True
2026-05-28T12:28:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:28:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:28:05.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:28:05.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:28:05.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:28:05.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:28:05.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:28:05.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:28:05.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:28:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:28:05.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:28:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:28:05.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:28:05.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:28:05.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:28:06.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:28:06.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:28:06.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:28:06.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-28T12:28:06.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-28T12:28:06.694 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:28:06.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:28:36.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:28:36.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:28:36.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:28:37.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:28:37.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:28:37.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:28:37.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-28T12:28:37.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:28:37.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-28T12:28:37.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:28:37.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:28:37.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:28:37.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-28T12:28:39.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-28T12:28:39.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:28:39.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:28:39.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:28:39.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:28:39.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:28:39.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:28:39.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:28:39.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:28:39.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:28:39.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:28:39.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:28:39.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:28:40.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:28:40.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:28:40.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:28:40.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:28:40.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:28:40.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:28:40.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:28:40.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:28:40.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:28:40.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:28:40.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:28:40.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:28:35
2026-05-28T12:28:40.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68983, datetime.datetime(2026, 5, 28, 12, 28, 35), datetime.datetime(2026, 5, 28, 12, 28, 34), 'salt', 12.95, 33.08, None, 5.37, 272.63, 15.85, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:28:40.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:28:40.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:28:40.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:28:34, diff=6.259654s, valid=True
2026-05-28T12:28:40.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:28:40.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:28:40.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:12, diff=-31.737485s, valid=True
2026-05-28T12:28:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:28:40.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:28:33, diff=7.269234s, valid=True
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:28:40.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:28:40.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:12, diff=-31.727741s, valid=True
2026-05-28T12:28:40.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:28:40.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:28:40.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:28:40.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896762.272931s, valid=True
2026-05-28T12:28:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:28:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:28:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:28:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:28:40.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:28:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:28:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:28:40.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:28:40.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:28:40.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:28:40.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:28:40.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:28:40.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:28:40.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:28:40.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:28:41.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:28:41.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:28:41.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:28:41.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-28T12:28:41.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-28T12:28:41.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:28:41.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:29:11.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:29:11.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:29:11.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:29:12.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:29:12.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:29:12.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:29:12.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-28T12:29:12.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:29:12.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:29:12.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:29:12.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:29:12.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:29:12.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:29:16.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-28T12:29:16.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:29:16.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:29:16.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:29:16.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:29:16.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:29:16.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:29:16.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:29:16.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:29:16.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:29:16.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:29:16.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:29:16.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:29:16.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:29:16.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:29:16.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:29:16.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:29:16.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:29:16.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:29:16.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T12:29:16.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:29:16.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:29:16.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:29:16.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:29:16.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:29:05
2026-05-28T12:29:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68984, datetime.datetime(2026, 5, 28, 12, 29, 5), datetime.datetime(2026, 5, 28, 12, 29, 4), 'salt', 12.95, 33.71, None, 3.6, 247.07, 15.6, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:29:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:29:16.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:29:16.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:04, diff=12.371698s, valid=True
2026-05-28T12:29:16.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:29:16.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:29:16.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:12, diff=4.374655s, valid=True
2026-05-28T12:29:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:29:16.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:04, diff=12.381385s, valid=True
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:29:16.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T12:29:16.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:12, diff=4.384434s, valid=True
2026-05-28T12:29:16.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:29:16.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:29:16.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:29:16.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896798.385092s, valid=True
2026-05-28T12:29:16.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:29:16.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:29:16.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:29:16.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:29:16.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:29:16.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:29:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:29:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:29:16.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:29:16.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:29:16.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:29:16.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:29:16.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:29:16.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:29:16.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:29:17.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:29:17.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:29:17.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:29:17.410 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:29:17.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-28T12:29:17.654 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:29:17.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:29:47.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:29:47.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:29:47.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:29:48.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:29:48.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:29:48.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:29:48.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-28T12:29:48.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:29:48.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-28T12:29:48.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:29:48.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:29:48.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:29:48.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-28T12:29:50.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-28T12:29:50.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:29:50.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:29:50.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:29:50.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:29:50.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:29:50.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:29:50.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:29:50.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:29:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:29:50.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:29:50.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:29:50.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:29:50.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:29:50.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:29:50.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:29:51.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:29:51.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T12:29:51.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:29:51.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T12:29:51.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:29:51.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:29:51.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:29:51.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:29:51.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:29:35
2026-05-28T12:29:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68985, datetime.datetime(2026, 5, 28, 12, 29, 35), datetime.datetime(2026, 5, 28, 12, 29, 35), 'salt', 12.98, 33.05, None, 1.49, 315.52, 15.87, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:29:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:29:51.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:29:51.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:35, diff=16.150189s, valid=True
2026-05-28T12:29:51.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:29:51.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T12:29:51.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:12, diff=-20.84695s, valid=True
2026-05-28T12:29:51.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:29:51.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:26, diff=25.162036s, valid=True
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:29:51.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T12:29:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:12, diff=-20.833293s, valid=True
2026-05-28T12:29:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:29:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:29:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:29:51.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896833.16763s, valid=True
2026-05-28T12:29:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:29:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:29:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:29:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:29:51.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:29:51.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:29:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:29:51.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:29:51.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:29:51.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:29:51.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:29:51.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:29:51.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:29:51.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:29:51.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:29:52.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:29:52.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:29:52.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:29:52.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-28T12:29:52.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-28T12:29:52.503 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:29:52.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:30:22.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:30:22.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:30:22.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:30:23.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:30:23.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:30:23.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:30:23.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:30:23.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:30:23.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-28T12:30:23.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:30:23.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:30:23.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:30:23.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-28T12:30:25.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-28T12:30:25.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:30:25.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:30:25.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:30:25.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:30:25.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:30:25.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:30:25.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:30:25.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:30:25.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:30:25.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:30:25.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:30:25.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:30:25.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:30:25.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:30:26.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:30:26.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:30:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T12:30:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:30:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T12:30:26.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:30:26.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:30:26.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:30:26.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:30:26.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:30:05
2026-05-28T12:30:26.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68986, datetime.datetime(2026, 5, 28, 12, 30, 5), datetime.datetime(2026, 5, 28, 12, 30, 5), 'salt', 12.92, 33.08, None, 1.45, 220.64, 15.85, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:30:26.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:30:26.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:30:26.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:05, diff=21.224117s, valid=True
2026-05-28T12:30:26.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:30:26.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T12:30:26.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:12, diff=14.226969s, valid=True
2026-05-28T12:30:26.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:30:26.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:30:26.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:29:56, diff=30.233751s, valid=True
2026-05-28T12:30:26.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:30:26.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:30:26.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:30:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:30:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:30:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T12:30:26.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:12, diff=14.236753s, valid=True
2026-05-28T12:30:26.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:30:26.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:30:26.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:30:26.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896868.237403s, valid=True
2026-05-28T12:30:26.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:30:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:30:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:30:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:30:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:30:26.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:30:26.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:30:26.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:30:26.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:30:26.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:30:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:30:26.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:30:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:30:26.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:30:26.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:30:27.139 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:30:27.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:30:27.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:30:27.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-28T12:30:27.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-28T12:30:29.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:30:29.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:30:59.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:30:59.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:30:59.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:30:59.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:30:59.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:31:00.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:31:00.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-28T12:31:00.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:31:00.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-28T12:31:00.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:31:00.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:31:00.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:31:00.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-28T12:31:03.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-28T12:31:03.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:31:03.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:31:03.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:31:03.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:31:03.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:31:03.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:31:03.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:31:03.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:31:03.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:31:03.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:31:03.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:31:03.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:31:03.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:31:03.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:31:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:31:03.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:31:03.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:31:03.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:31:03.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:31:03.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:31:03.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:31:03.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:31:03.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:31:03.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:30:35
2026-05-28T12:31:03.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68987, datetime.datetime(2026, 5, 28, 12, 30, 35), datetime.datetime(2026, 5, 28, 12, 30, 35), 'salt', 13.08, 33.38, None, 1.41, 156.8, 15.75, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:31:03.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:31:03.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:31:03.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:35, diff=28.411223s, valid=True
2026-05-28T12:31:03.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:31:03.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:31:03.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:31:12, diff=-8.585916s, valid=True
2026-05-28T12:31:03.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:31:03.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:31:03.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:30:28, diff=35.420831s, valid=True
2026-05-28T12:31:03.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:31:03.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:31:03.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:31:03.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:31:03.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:31:03.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:31:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:31:12, diff=-8.576155s, valid=True
2026-05-28T12:31:03.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:31:03.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:31:03.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:31:03.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896905.424497s, valid=True
2026-05-28T12:31:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:31:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:31:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:31:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:31:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:31:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:31:03.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:31:03.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:31:03.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:31:03.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:31:03.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:31:03.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:31:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:31:03.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:31:04.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:31:04.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:31:04.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:31:04.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:31:04.495 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:31:04.495 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:31:04.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:31:04.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:31:34.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:31:34.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:31:34.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:31:35.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:31:35.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:31:35.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:31:35.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-28T12:31:35.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:31:35.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-28T12:31:35.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:31:35.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:31:35.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:31:35.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-28T12:31:37.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-28T12:31:37.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:31:37.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:31:37.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:31:37.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:31:37.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:31:37.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:31:37.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:31:37.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:31:37.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:31:37.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:31:37.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:31:37.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:31:37.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:31:37.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:31:37.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:31:37.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:31:37.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:31:37.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:31:38.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:31:38.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:31:38.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:31:38.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:31:38.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:31:38.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:31:36
2026-05-28T12:31:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68989, datetime.datetime(2026, 5, 28, 12, 31, 36), datetime.datetime(2026, 5, 28, 12, 31, 36), 'salt', 13.11, 33.58, None, 4.87, 193.93, 15.67, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:31:38.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:31:38.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:31:38.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:31:36, diff=2.079102s, valid=True
2026-05-28T12:31:38.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:31:38.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:31:38.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:12, diff=-33.917928s, valid=True
2026-05-28T12:31:38.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:31:38.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:31:38.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:31:31, diff=7.088919s, valid=True
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:31:38.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:31:38.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:12, diff=-33.907984s, valid=True
2026-05-28T12:31:38.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:31:38.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:31:38.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:31:38.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896940.092686s, valid=True
2026-05-28T12:31:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:31:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:31:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:31:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:31:38.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:31:38.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:31:38.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:31:38.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:31:38.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:31:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:31:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:31:38.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:31:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:31:38.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:31:38.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:31:38.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:31:39.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:31:39.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:31:39.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-28T12:31:39.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-28T12:31:39.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:31:39.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:32:09.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:32:09.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:32:09.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:32:09.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:32:09.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:32:09.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:32:09.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-28T12:32:09.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:32:09.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-28T12:32:09.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:32:09.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:32:09.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:32:09.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-28T12:32:12.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-28T12:32:12.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:32:12.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:32:12.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:32:12.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:32:12.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:32:12.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:32:12.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:32:12.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:32:12.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:32:12.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:32:12.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:32:12.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:32:12.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:32:12.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:32:12.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:32:12.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:32:12.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:32:12.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:32:12.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:32:12.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:32:12.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:32:12.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:32:12.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:32:13.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:32:06
2026-05-28T12:32:13.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68990, datetime.datetime(2026, 5, 28, 12, 32, 6), datetime.datetime(2026, 5, 28, 12, 32, 6), 'salt', 13.18, 34.04, None, 5.54, 207.22, 15.49, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:32:13.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:32:13.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:32:13.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:06, diff=7.046084s, valid=True
2026-05-28T12:32:13.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:32:13.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:32:13.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:12, diff=1.048945s, valid=True
2026-05-28T12:32:13.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:32:13.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:32:13.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:02, diff=11.055733s, valid=True
2026-05-28T12:32:13.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:32:13.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:32:13.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:32:13.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:32:13.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:32:13.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:32:13.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:12, diff=1.058762s, valid=True
2026-05-28T12:32:13.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:32:13.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:32:13.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:32:13.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=896975.059455s, valid=True
2026-05-28T12:32:13.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:32:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:32:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:32:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:32:13.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:32:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:32:13.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:32:13.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:32:13.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:32:13.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:32:13.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:32:13.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:32:13.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:32:13.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:32:13.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:32:13.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:32:14.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:32:14.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:32:14.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-28T12:32:14.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-28T12:32:14.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:32:14.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:32:44.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:32:44.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:32:44.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:32:44.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:32:44.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:32:45.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:32:45.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-28T12:32:45.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:32:45.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-28T12:32:45.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:32:45.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:32:45.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:32:45.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-28T12:32:48.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-28T12:32:48.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:32:48.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:32:48.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:32:48.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:32:48.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:32:48.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:32:48.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:32:48.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:32:48.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:32:48.535 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:32:48.535 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:32:48.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:32:48.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:32:48.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:32:48.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:32:48.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:32:48.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:32:48.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:32:48.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:32:48.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:32:48.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:32:48.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:32:48.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:32:48.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:32:36
2026-05-28T12:32:48.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68991, datetime.datetime(2026, 5, 28, 12, 32, 36), datetime.datetime(2026, 5, 28, 12, 32, 36), 'salt', 13.25, 33.84, None, 6.14, 212.8, 15.58, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:32:48.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:32:48.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:32:48.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:36, diff=12.869542s, valid=True
2026-05-28T12:32:48.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:32:48.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:32:48.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:12, diff=-23.12761s, valid=True
2026-05-28T12:32:48.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:32:48.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:32:33, diff=15.879068s, valid=True
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:32:48.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:32:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:12, diff=-23.117803s, valid=True
2026-05-28T12:32:48.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:32:48.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:32:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:32:48.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897010.882865s, valid=True
2026-05-28T12:32:48.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:32:48.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:32:48.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:32:48.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:32:48.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:32:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:32:48.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:32:48.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:32:48.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:32:49.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:32:49.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:32:49.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:32:49.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:32:49.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:32:49.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:32:49.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:32:49.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:32:49.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:32:49.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-28T12:32:49.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-28T12:32:50.724 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:32:50.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:33:20.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:33:20.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:33:20.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:33:21.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:33:21.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:33:21.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:33:21.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:33:21.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:33:21.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-28T12:33:21.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:33:21.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:33:21.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:33:21.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-28T12:33:23.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-28T12:33:23.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:33:23.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:33:23.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:33:23.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:33:23.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:33:23.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:33:23.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:33:23.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:33:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:33:23.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:33:23.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:33:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:33:23.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:33:23.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:33:24.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:33:24.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:33:24.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:33:24.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:33:24.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:33:24.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:33:24.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:33:24.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:33:24.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:33:24.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:33:07
2026-05-28T12:33:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68992, datetime.datetime(2026, 5, 28, 12, 33, 7), datetime.datetime(2026, 5, 28, 12, 33, 6), 'salt', 13.28, 33.31, None, 6.81, 208.35, 15.8, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:33:24.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:33:24.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:33:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:06, diff=18.154086s, valid=True
2026-05-28T12:33:24.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:33:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:33:24.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:12, diff=12.156972s, valid=True
2026-05-28T12:33:24.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:33:24.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:33:24.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:05, diff=19.163672s, valid=True
2026-05-28T12:33:24.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:33:24.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:33:24.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:33:24.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:33:24.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:33:24.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:33:24.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:12, diff=12.166728s, valid=True
2026-05-28T12:33:24.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:33:24.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:33:24.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:33:24.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897046.167395s, valid=True
2026-05-28T12:33:24.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:33:24.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:33:24.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:33:24.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:33:24.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:33:24.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:33:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:33:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:33:24.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:33:24.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:33:24.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:33:24.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:33:24.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:33:24.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:33:24.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:33:25.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:33:25.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:33:25.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:33:25.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-28T12:33:25.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-28T12:33:25.419 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:33:25.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:33:55.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:33:55.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:33:55.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:33:56.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:33:56.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:33:56.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:33:56.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:33:56.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:33:56.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:33:56.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:33:56.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:33:56.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:33:56.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-28T12:33:58.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-28T12:33:58.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:33:58.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:33:58.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:33:58.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:33:58.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:33:59.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:33:59.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:33:59.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:33:59.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:33:59.011 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:33:59.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:33:59.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:33:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:33:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:33:59.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:33:59.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:33:59.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:33:59.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:33:59.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:33:59.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:33:59.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:33:59.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:33:59.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:33:59.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:33:37
2026-05-28T12:33:59.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68993, datetime.datetime(2026, 5, 28, 12, 33, 37), datetime.datetime(2026, 5, 28, 12, 33, 36), 'salt', 13.34, 34.04, None, 7.8, 243.71, 15.51, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:33:59.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:33:59.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:33:59.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:36, diff=23.324874s, valid=True
2026-05-28T12:33:59.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:33:59.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:33:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:34:12, diff=-12.6723s, valid=True
2026-05-28T12:33:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:33:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:36, diff=23.334368s, valid=True
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:33:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:33:59.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:34:12, diff=-12.662594s, valid=True
2026-05-28T12:33:59.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:33:59.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:33:59.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:33:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897081.33808s, valid=True
2026-05-28T12:33:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:33:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:33:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:33:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:33:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:33:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:33:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:33:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:33:59.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:33:59.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:33:59.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:33:59.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:33:59.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:33:59.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:33:59.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:34:00.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:34:00.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:34:00.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:34:00.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-28T12:34:00.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-28T12:34:00.569 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:34:00.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:34:30.600 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:34:30.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:34:30.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:34:30.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:34:30.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:34:31.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:34:31.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-28T12:34:31.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:34:31.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:34:31.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:34:31.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:34:31.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:34:31.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-28T12:34:34.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:34:34.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:34:34.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:34:34.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:34:34.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:34:34.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:34:34.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:34:34.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:34:34.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:34:34.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:34:34.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:34:34.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:34:34.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:34:34.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:34:34.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:34:34.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:34:34.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:34:34.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:34:34.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:34:34.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:34:34.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:34:34.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:34:34.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:34:34.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:34:34.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:34:07
2026-05-28T12:34:34.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68994, datetime.datetime(2026, 5, 28, 12, 34, 7), datetime.datetime(2026, 5, 28, 12, 34, 7), 'salt', 13.38, 34.24, None, 8.89, 215.8, 15.44, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:34:34.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:34:34.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:34:34.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:34:07, diff=27.454899s, valid=True
2026-05-28T12:34:34.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:34:34.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:34:34.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:34:12, diff=22.457745s, valid=True
2026-05-28T12:34:34.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:34:34.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:34:34.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:33:59, diff=35.464601s, valid=True
2026-05-28T12:34:34.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:34:34.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:34:34.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:34:34.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:34:34.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:34:34.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:34:34.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:34:12, diff=22.467698s, valid=True
2026-05-28T12:34:34.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:34:34.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:34:34.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:34:34.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897116.468359s, valid=True
2026-05-28T12:34:34.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:34:34.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:34:34.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:34:34.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:34:34.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:34:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:34:34.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:34:34.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:34:34.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:34:34.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:34:34.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:34:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:34:34.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:34:34.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:34:35.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:34:35.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:34:35.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:34:35.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:34:35.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:34:35.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:34:35.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:34:35.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:35:05.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:35:05.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:35:05.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:35:05.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:35:05.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:35:06.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:35:06.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-28T12:35:06.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:35:06.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-28T12:35:06.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:35:06.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:35:06.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:35:06.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-28T12:35:08.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:35:08.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:35:08.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:35:08.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:35:08.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:35:08.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:35:08.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:35:08.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:35:08.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:35:08.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:35:08.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:35:08.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:35:08.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:35:08.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:35:08.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:35:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:35:08.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:35:08.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:35:08.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:35:09.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:35:09.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:35:09.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:35:09.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:35:09.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:35:09.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:35:08
2026-05-28T12:35:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68996, datetime.datetime(2026, 5, 28, 12, 35, 8), datetime.datetime(2026, 5, 28, 12, 35, 7), 'salt', 13.44, 32.98, None, 5.12, 189.89, 15.95, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:35:09.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:35:09.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:35:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:07, diff=2.080778s, valid=True
2026-05-28T12:35:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:35:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:35:09.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:12, diff=-2.916402s, valid=True
2026-05-28T12:35:09.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:35:09.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:00, diff=9.090351s, valid=True
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:35:09.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:35:09.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:12, diff=-2.906601s, valid=True
2026-05-28T12:35:09.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:35:09.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:35:09.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:35:09.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897151.094073s, valid=True
2026-05-28T12:35:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:35:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:35:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:35:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:35:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:35:09.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:35:09.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:35:09.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:35:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:35:09.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:35:09.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:35:09.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:35:09.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:35:09.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:35:09.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:35:10.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:35:10.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:35:10.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:35:10.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:35:10.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:35:10.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:35:10.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:35:40.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:35:40.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:35:40.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:35:40.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:35:40.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:35:41.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:35:41.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-28T12:35:41.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:35:41.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-28T12:35:41.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:35:41.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:35:41.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:35:41.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-28T12:35:43.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:35:43.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:35:43.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:35:43.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:35:43.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:35:43.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:35:43.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:35:43.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:35:43.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:35:43.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:35:43.689 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:35:43.689 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:35:43.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:35:43.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:35:43.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:35:43.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:35:43.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:35:43.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:35:43.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:35:43.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:35:43.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:35:43.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:35:43.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:35:43.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:35:44.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:35:38
2026-05-28T12:35:44.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68997, datetime.datetime(2026, 5, 28, 12, 35, 38), datetime.datetime(2026, 5, 28, 12, 35, 38), 'salt', 13.48, 32.82, None, 7.55, 192.8, 16.03, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:35:44.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:35:44.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:35:44.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:38, diff=6.012708s, valid=True
2026-05-28T12:35:44.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:35:44.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:35:44.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:12, diff=-27.984436s, valid=True
2026-05-28T12:35:44.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:35:44.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:35:32, diff=12.0223s, valid=True
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:35:44.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:35:44.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:12, diff=-27.97467s, valid=True
2026-05-28T12:35:44.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:35:44.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:35:44.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:35:44.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897186.025995s, valid=True
2026-05-28T12:35:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:35:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:35:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:35:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:35:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:35:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:35:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:35:44.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:35:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:35:44.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:35:44.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:35:44.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:35:44.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:35:44.349 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:35:44.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:35:44.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:35:45.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:35:45.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:35:45.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:35:45.030 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:35:45.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:35:45.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:36:15.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:36:15.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:36:15.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:36:15.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:36:15.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:36:15.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:36:15.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-28T12:36:15.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:36:15.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-28T12:36:15.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:36:15.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:36:15.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:36:15.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-28T12:36:18.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:36:18.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:36:18.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:36:18.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:36:18.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:36:18.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:36:18.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:36:18.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:36:18.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:36:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:36:18.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:36:18.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:36:18.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:36:18.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:36:18.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:36:18.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:36:18.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:36:18.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:36:18.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:36:18.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:36:18.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:36:18.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:36:18.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:36:18.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:36:18.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:36:09
2026-05-28T12:36:18.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68998, datetime.datetime(2026, 5, 28, 12, 36, 9), datetime.datetime(2026, 5, 28, 12, 36, 8), 'salt', 13.51, 33.18, None, 8.72, 230.48, 15.88, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:36:18.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:36:18.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:36:18.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:08, diff=10.453769s, valid=True
2026-05-28T12:36:18.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:36:18.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:36:18.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:12, diff=6.456645s, valid=True
2026-05-28T12:36:18.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:36:18.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:03, diff=15.463305s, valid=True
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:36:18.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:36:18.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:12, diff=6.466427s, valid=True
2026-05-28T12:36:18.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:36:18.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:36:18.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:36:18.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897220.46711s, valid=True
2026-05-28T12:36:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:36:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:36:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:36:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:36:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:36:18.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:36:18.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:36:18.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:36:18.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:36:18.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:36:18.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:36:18.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:36:18.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:36:18.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:36:19.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:36:19.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:36:19.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:36:19.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:36:19.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-28T12:36:19.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-28T12:36:19.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:36:19.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:36:49.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:36:49.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:36:49.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:36:49.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:36:49.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:36:50.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:36:50.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-28T12:36:50.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:36:50.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-28T12:36:50.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:36:50.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:36:50.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:36:50.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-28T12:36:52.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:36:52.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:36:52.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:36:52.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:36:52.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:36:52.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:36:52.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:36:52.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:36:52.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:36:52.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:36:52.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:36:52.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:36:52.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:36:52.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:36:52.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:36:52.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:36:52.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:36:52.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:36:52.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:36:52.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:36:52.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:36:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:36:52.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:36:52.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:36:52.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:36:39
2026-05-28T12:36:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(68999, datetime.datetime(2026, 5, 28, 12, 36, 39), datetime.datetime(2026, 5, 28, 12, 36, 38), 'salt', 13.58, 35.47, None, 8.79, 224.5, 14.99, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:36:52.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:36:52.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:36:52.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:38, diff=14.947994s, valid=True
2026-05-28T12:36:52.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:36:52.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:36:52.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:12, diff=-19.049157s, valid=True
2026-05-28T12:36:52.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:36:52.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:36:52.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:36:34, diff=18.95767s, valid=True
2026-05-28T12:36:52.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:36:52.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:36:52.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:36:52.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:36:52.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:36:52.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:36:52.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:12, diff=-19.039287s, valid=True
2026-05-28T12:36:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:36:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:36:52.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:36:52.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897254.961364s, valid=True
2026-05-28T12:36:52.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:36:52.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:36:52.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:36:52.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:36:52.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:36:53.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:36:53.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:36:53.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:36:53.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:36:53.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:36:53.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:36:53.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:36:53.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:36:53.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:36:53.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:36:53.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:36:53.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:36:53.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:36:53.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-28T12:36:53.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-28T12:36:54.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:36:54.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:37:24.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:37:24.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:37:24.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:37:24.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:37:24.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:37:24.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:37:24.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-28T12:37:24.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:37:24.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-28T12:37:24.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:37:24.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:37:24.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:37:24.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-28T12:37:27.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:37:27.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:37:27.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:37:27.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:37:27.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:37:27.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:37:27.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:37:27.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:37:27.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:37:27.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:37:27.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:37:27.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:37:27.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:37:27.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:37:27.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:37:27.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:37:27.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:37:27.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:37:27.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:37:27.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:37:27.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:37:27.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:37:27.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:37:27.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:37:27.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:37:09
2026-05-28T12:37:27.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69000, datetime.datetime(2026, 5, 28, 12, 37, 9), datetime.datetime(2026, 5, 28, 12, 37, 9), 'salt', 13.68, 32.42, None, 6.35, 232.48, 16.22, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:37:27.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:37:27.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:37:27.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:09, diff=18.476191s, valid=True
2026-05-28T12:37:27.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:37:27.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:37:27.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:12, diff=15.479014s, valid=True
2026-05-28T12:37:27.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:37:27.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:37:27.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:06, diff=21.485719s, valid=True
2026-05-28T12:37:27.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:37:27.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:37:27.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:37:27.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:37:27.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:37:27.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:37:27.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:12, diff=15.488759s, valid=True
2026-05-28T12:37:27.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:37:27.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:37:27.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:37:27.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897289.489404s, valid=True
2026-05-28T12:37:27.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:37:27.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:37:27.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:37:27.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:37:27.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:37:27.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:37:27.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:37:27.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:37:27.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:37:27.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:37:27.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:37:27.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:37:27.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:37:27.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:37:28.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:37:28.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:37:28.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:37:28.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:37:28.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-28T12:37:28.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-28T12:37:29.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:37:29.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:37:59.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:37:59.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:37:59.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:37:59.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:37:59.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:37:59.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:37:59.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-28T12:37:59.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:37:59.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-28T12:37:59.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:37:59.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:37:59.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:37:59.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-28T12:38:02.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-28T12:38:02.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:38:02.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:38:02.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:38:02.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:38:02.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:38:02.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:38:02.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:38:02.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:38:02.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:38:02.451 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:38:02.451 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:38:02.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:38:02.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:38:02.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:38:02.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:38:02.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:38:02.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:38:02.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:38:02.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:38:02.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:38:02.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:38:02.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:38:02.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:38:02.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:37:40
2026-05-28T12:38:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69001, datetime.datetime(2026, 5, 28, 12, 37, 40), datetime.datetime(2026, 5, 28, 12, 37, 39), 'salt', 13.81, 32.62, None, 3.95, 209.47, 16.15, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:38:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:38:02.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:38:02.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:39, diff=23.788599s, valid=True
2026-05-28T12:38:02.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:38:02.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:38:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:12, diff=-9.208608s, valid=True
2026-05-28T12:38:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:38:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:37:37, diff=25.798097s, valid=True
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:38:02.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:38:02.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:12, diff=-9.198916s, valid=True
2026-05-28T12:38:02.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:38:02.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:38:02.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:38:02.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897324.801741s, valid=True
2026-05-28T12:38:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:38:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:38:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:38:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:38:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:38:02.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:38:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:38:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:38:02.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:38:02.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:38:03.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:38:03.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:38:03.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:38:03.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:38:03.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:38:03.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:38:03.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:38:03.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:38:03.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-28T12:38:03.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-28T12:38:04.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:38:04.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:38:34.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:38:34.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:38:34.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:38:34.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:38:34.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:38:34.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:38:34.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-28T12:38:34.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:38:34.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-28T12:38:34.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:38:34.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:38:34.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:38:34.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-28T12:38:38.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-28T12:38:38.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:38:38.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:38:38.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:38:38.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:38:38.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:38:38.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:38:38.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:38:38.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:38:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:38:38.308 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:38:38.308 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:38:38.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:38:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:38:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:38:38.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:38:38.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:38:38.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:38:38.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:38:38.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:38:38.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:38:38.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:38:38.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:38:38.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:38:38.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:38:10
2026-05-28T12:38:38.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69002, datetime.datetime(2026, 5, 28, 12, 38, 10), datetime.datetime(2026, 5, 28, 12, 38, 10), 'salt', 13.78, 30.1, None, 5.33, 202.29, 17.23, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:38:38.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:38:38.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:38:38.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:10, diff=28.625255s, valid=True
2026-05-28T12:38:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:38:38.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:38:38.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:12, diff=26.628181s, valid=True
2026-05-28T12:38:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:38:38.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:38:38.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:09, diff=29.634899s, valid=True
2026-05-28T12:38:38.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:38:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:38:38.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:38:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:38:38.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:38:38.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:38:38.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:38:12, diff=26.637911s, valid=True
2026-05-28T12:38:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:38:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:38:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:38:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897360.638581s, valid=True
2026-05-28T12:38:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:38:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:38:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:38:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:38:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:38:38.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:38:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:38:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:38:38.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:38:38.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:38:38.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:38:38.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:38:38.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:38:38.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:38:39.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:38:39.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:38:39.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:38:39.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:38:39.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:38:39.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:38:39.880 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:38:39.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:39:09.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:39:09.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:39:09.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:39:10.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:39:10.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:39:10.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:39:10.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-28T12:39:10.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:39:10.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-28T12:39:10.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:39:10.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:39:10.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:39:10.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-28T12:39:13.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-28T12:39:13.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:39:13.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:39:13.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:39:13.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:39:13.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:39:13.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:39:13.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:39:13.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:39:13.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:39:13.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:39:13.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:39:13.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:39:13.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:39:13.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:39:14.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:39:14.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:39:14.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:39:14.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:39:14.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:39:14.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:39:14.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:39:14.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:39:14.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:39:14.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:39:10
2026-05-28T12:39:14.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69004, datetime.datetime(2026, 5, 28, 12, 39, 10), datetime.datetime(2026, 5, 28, 12, 39, 10), 'salt', 13.71, 32.75, None, 7.41, 253.2, 16.08, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:39:14.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:39:14.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:39:14.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:10, diff=4.157555s, valid=True
2026-05-28T12:39:14.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:39:14.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:39:14.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:12, diff=2.160453s, valid=True
2026-05-28T12:39:14.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:39:14.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:01, diff=13.167053s, valid=True
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:39:14.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:39:14.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:12, diff=2.170251s, valid=True
2026-05-28T12:39:14.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:39:14.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:39:14.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:39:14.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897396.170935s, valid=True
2026-05-28T12:39:14.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:39:14.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:39:14.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:39:14.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:39:14.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:39:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:39:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:39:14.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:39:14.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:39:14.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:39:14.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:39:14.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:39:14.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:39:14.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:39:14.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:39:15.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:39:15.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:39:15.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:39:15.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-28T12:39:15.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-28T12:39:15.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:39:15.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:39:45.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:39:45.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:39:45.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:39:45.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:39:45.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:39:45.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:39:45.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:39:45.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:39:45.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:39:46.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:39:46.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:39:46.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:39:46.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-28T12:39:48.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:39:48.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:39:48.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:39:48.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:39:48.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:39:48.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:39:48.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:39:48.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:39:48.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:39:48.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:39:48.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:39:48.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:39:48.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:39:48.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:39:48.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:39:49.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:39:49.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:39:49.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:39:49.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:39:49.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:39:49.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:39:49.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:39:49.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:39:49.115 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:39:49.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:39:41
2026-05-28T12:39:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69005, datetime.datetime(2026, 5, 28, 12, 39, 41), datetime.datetime(2026, 5, 28, 12, 39, 40), 'salt', 13.71, 33.98, None, 7.02, 251.84, 15.58, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:39:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:39:49.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:39:49.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:40, diff=9.17717s, valid=True
2026-05-28T12:39:49.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:39:49.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:39:49.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:12, diff=-22.820004s, valid=True
2026-05-28T12:39:49.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:39:49.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:39:49.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:39:33, diff=16.186644s, valid=True
2026-05-28T12:39:49.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:39:49.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:39:49.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:39:49.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:39:49.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:39:49.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:39:49.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:12, diff=-22.81035s, valid=True
2026-05-28T12:39:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:39:49.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:39:49.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:39:49.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897431.190306s, valid=True
2026-05-28T12:39:49.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:39:49.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:39:49.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:39:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:39:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:39:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:39:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:39:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:39:49.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:39:49.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:39:49.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:39:49.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:39:49.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:39:49.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:39:49.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:39:50.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:39:50.175 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:39:50.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:39:50.176 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:39:50.176 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:39:50.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:39:50.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:40:20.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:40:20.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:40:20.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:40:20.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:40:20.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:40:21.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:40:21.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-28T12:40:21.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:40:21.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-28T12:40:21.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:40:21.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:40:21.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:40:21.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:40:23.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-28T12:40:23.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:40:23.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:40:23.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:40:23.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:40:23.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:40:23.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:40:23.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:40:23.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:40:23.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:40:23.454 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:40:23.454 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:40:23.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:40:23.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:40:23.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:40:23.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:40:23.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:40:23.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:40:23.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:40:23.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:40:23.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:40:23.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:40:23.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:40:23.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:40:23.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:40:11
2026-05-28T12:40:23.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69006, datetime.datetime(2026, 5, 28, 12, 40, 11), datetime.datetime(2026, 5, 28, 12, 40, 10), 'salt', 13.54, 32.72, None, 5.72, 285.24, 16.07, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:40:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:40:23.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:40:23.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:10, diff=13.769831s, valid=True
2026-05-28T12:40:23.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:40:23.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:40:23.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:12, diff=11.772696s, valid=True
2026-05-28T12:40:23.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:40:23.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:04, diff=19.779369s, valid=True
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:40:23.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:40:23.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:12, diff=11.782453s, valid=True
2026-05-28T12:40:23.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:40:23.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:40:23.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:40:23.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897465.783132s, valid=True
2026-05-28T12:40:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:40:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:40:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:40:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:40:23.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:40:23.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:40:23.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:40:23.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:40:23.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:40:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:40:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:40:24.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:40:24.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:40:24.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:40:24.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:40:24.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:40:24.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:40:24.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:40:24.839 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:40:24.839 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:40:25.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:40:25.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:40:55.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:40:55.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:40:55.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:40:55.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:40:55.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:40:55.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:40:55.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-28T12:40:55.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:40:55.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-28T12:40:55.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:40:55.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:40:55.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:40:55.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-28T12:40:58.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:40:58.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:40:58.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:40:58.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:40:58.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:40:58.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:40:58.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:40:58.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:40:58.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:40:58.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:40:58.690 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:40:58.690 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:40:58.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:40:58.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:40:58.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:40:58.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:40:58.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:40:58.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:40:58.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:40:58.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:40:58.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:40:58.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:40:58.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:40:58.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:40:59.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:40:41
2026-05-28T12:40:59.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69007, datetime.datetime(2026, 5, 28, 12, 40, 41), datetime.datetime(2026, 5, 28, 12, 40, 41), 'salt', 13.61, 32.75, None, 4.84, 258.01, 16.07, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:40:59.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:40:59.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:40:59.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:41, diff=18.014968s, valid=True
2026-05-28T12:40:59.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:40:59.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:40:59.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:12, diff=-12.98199s, valid=True
2026-05-28T12:40:59.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:40:59.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:40:36, diff=23.025091s, valid=True
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:40:59.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:40:59.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:12, diff=-12.971715s, valid=True
2026-05-28T12:40:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:40:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:40:59.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:40:59.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897501.028991s, valid=True
2026-05-28T12:40:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:40:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:40:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:40:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:40:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:40:59.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:40:59.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:40:59.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:40:59.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:40:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:40:59.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:40:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:40:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:40:59.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:40:59.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:40:59.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:41:00.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:41:00.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:41:00.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-28T12:41:00.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-28T12:41:00.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:41:00.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:41:30.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:41:30.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:41:30.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:41:30.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:41:30.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:41:30.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:41:30.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-28T12:41:30.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:41:30.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-28T12:41:30.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:41:30.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:41:30.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:41:30.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-28T12:41:33.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-28T12:41:33.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:41:33.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:41:33.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:41:33.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:41:33.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:41:33.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:41:33.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:41:33.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:41:33.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:41:33.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:41:33.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:41:33.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:41:33.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:41:33.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:41:33.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:41:33.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:41:33.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:41:33.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:41:33.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:41:33.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:41:33.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:41:33.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:41:33.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:41:33.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:41:11
2026-05-28T12:41:33.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69008, datetime.datetime(2026, 5, 28, 12, 41, 11), datetime.datetime(2026, 5, 28, 12, 41, 11), 'salt', 13.51, 34.31, None, 6.57, 227.43, 15.43, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:41:33.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:41:33.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:41:33.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:11, diff=22.530151s, valid=True
2026-05-28T12:41:33.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:41:33.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:41:33.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:12, diff=21.533044s, valid=True
2026-05-28T12:41:33.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:41:33.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:07, diff=26.539624s, valid=True
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:41:33.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:41:33.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:41:33.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:12, diff=21.542609s, valid=True
2026-05-28T12:41:33.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:41:33.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:41:33.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:41:33.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897535.543265s, valid=True
2026-05-28T12:41:33.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:41:33.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:41:33.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:41:33.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:41:33.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:41:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:41:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:41:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:41:33.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:41:33.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:41:33.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:41:33.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:41:33.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:41:33.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:41:34.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:41:34.520 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:41:34.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:41:34.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:41:34.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-28T12:41:34.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-28T12:41:34.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:41:34.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:42:04.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:42:04.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:42:04.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:42:05.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:42:05.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:42:05.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:42:05.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-28T12:42:05.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:42:05.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-28T12:42:05.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:42:05.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:42:05.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:42:05.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-28T12:42:07.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-28T12:42:07.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:42:07.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:42:07.981 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:42:07.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:42:07.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:42:08.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:42:08.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:42:08.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:42:08.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:42:08.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:42:08.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:42:08.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:42:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:42:08.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:42:08.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:42:08.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:42:08.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:42:08.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:42:08.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:42:08.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:42:08.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:42:08.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:42:08.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:42:08.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:41:41
2026-05-28T12:42:08.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69009, datetime.datetime(2026, 5, 28, 12, 41, 41), datetime.datetime(2026, 5, 28, 12, 41, 41), 'salt', 13.61, 34.77, None, 9.64, 188.31, 15.26, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:42:08.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:42:08.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:42:08.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:41, diff=27.317828s, valid=True
2026-05-28T12:42:08.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:42:08.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:42:08.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:42:12, diff=-3.679272s, valid=True
2026-05-28T12:42:08.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:42:08.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:42:08.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:41:38, diff=30.327777s, valid=True
2026-05-28T12:42:08.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:42:08.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:42:08.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:42:08.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:42:08.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:42:08.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:42:08.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:42:12, diff=-3.668488s, valid=True
2026-05-28T12:42:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:42:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:42:08.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:42:08.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897570.332185s, valid=True
2026-05-28T12:42:08.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:42:08.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:42:08.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:42:08.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:42:08.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:42:08.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:42:08.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:42:08.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:42:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:42:08.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:42:08.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:42:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:42:08.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:42:08.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:42:08.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:42:09.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:42:09.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:42:09.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:42:09.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-28T12:42:09.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-28T12:42:09.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:42:09.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:42:39.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:42:39.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:42:39.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:42:39.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:42:39.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:42:40.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:42:40.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:42:40.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:42:40.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-28T12:42:40.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:42:40.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:42:40.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:42:40.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-28T12:42:43.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-28T12:42:43.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:42:43.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:42:43.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:42:43.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:42:43.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:42:43.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:42:43.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:42:43.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:42:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:42:43.040 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:42:43.040 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:42:43.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:42:43.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:42:43.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:42:43.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:42:43.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:42:43.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:42:43.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:42:43.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:42:43.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:42:43.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:42:43.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:42:43.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:42:43.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:42:42
2026-05-28T12:42:43.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69011, datetime.datetime(2026, 5, 28, 12, 42, 42), datetime.datetime(2026, 5, 28, 12, 42, 41), 'salt', 13.41, 33.38, None, 10.27, 257.47, 15.79, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:42:43.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:42:43.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:42:43.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:42:41, diff=2.362222s, valid=True
2026-05-28T12:42:43.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:42:43.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:42:43.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:12, diff=-28.634963s, valid=True
2026-05-28T12:42:43.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:42:43.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:42:42, diff=1.37159s, valid=True
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:42:43.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:42:43.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:42:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:12, diff=-28.625405s, valid=True
2026-05-28T12:42:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:42:43.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:42:43.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:42:43.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897605.375245s, valid=True
2026-05-28T12:42:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:42:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:42:43.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:42:43.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:42:43.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:42:43.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:42:43.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:42:43.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:42:43.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:42:43.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:42:43.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:42:43.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:42:43.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:42:43.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:42:43.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:42:44.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:42:44.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:42:44.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:42:44.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-28T12:42:44.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-28T12:42:44.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:42:44.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:43:14.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:43:14.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:43:14.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:43:14.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:43:14.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:43:15.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:43:15.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-28T12:43:15.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:43:15.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-28T12:43:15.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:43:15.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:43:15.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:43:15.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-28T12:43:17.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:43:17.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:43:17.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:43:17.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:43:17.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:43:17.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:43:17.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:43:17.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:43:17.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:43:17.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:43:17.632 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:43:17.632 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:43:17.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:43:17.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:43:17.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:43:17.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:43:17.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:43:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:43:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:43:17.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:43:17.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:43:17.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:43:17.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:43:17.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:43:17.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:43:12
2026-05-28T12:43:17.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69012, datetime.datetime(2026, 5, 28, 12, 43, 12), datetime.datetime(2026, 5, 28, 12, 43, 12), 'salt', 13.34, 33.15, None, 9.99, 271.37, 15.87, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:43:17.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:43:17.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:43:17.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:12, diff=5.969943s, valid=True
2026-05-28T12:43:17.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:43:17.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:43:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:12, diff=5.972848s, valid=True
2026-05-28T12:43:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:43:17.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:03, diff=14.979589s, valid=True
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:43:17.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:43:17.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:43:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:12, diff=5.982601s, valid=True
2026-05-28T12:43:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:43:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:43:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:43:17.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897639.983302s, valid=True
2026-05-28T12:43:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:43:17.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:43:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:43:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:43:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:43:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:43:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:43:18.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:43:18.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:43:18.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:43:18.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:43:18.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:43:18.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:43:18.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:43:18.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:43:18.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:43:19.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:43:19.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:43:19.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-28T12:43:19.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-28T12:43:19.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:43:19.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:43:49.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:43:49.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:43:49.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:43:49.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:43:49.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:43:49.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:43:49.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-28T12:43:49.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:43:49.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-28T12:43:49.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:43:49.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:43:49.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:43:49.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:43:52.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-28T12:43:52.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:43:52.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:43:52.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:43:52.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:43:52.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:43:52.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:43:52.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:43:52.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:43:52.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:43:52.501 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:43:52.501 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:43:52.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:43:52.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:43:52.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:43:52.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:43:52.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:43:52.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:43:52.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:43:52.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:43:52.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:43:52.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:43:52.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:43:52.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:43:52.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:43:42
2026-05-28T12:43:52.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69013, datetime.datetime(2026, 5, 28, 12, 43, 42), datetime.datetime(2026, 5, 28, 12, 43, 42), 'salt', 13.34, 35.4, None, 9.21, 250.01, 14.98, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:43:52.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:43:52.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:43:52.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:42, diff=10.820337s, valid=True
2026-05-28T12:43:52.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:43:52.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:43:52.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:12, diff=-19.176787s, valid=True
2026-05-28T12:43:52.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:43:52.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:43:34, diff=18.829989s, valid=True
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:43:52.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:43:52.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:12, diff=-19.166902s, valid=True
2026-05-28T12:43:52.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:43:52.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:43:52.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:43:52.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897674.833765s, valid=True
2026-05-28T12:43:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:43:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:43:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:43:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:43:52.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:43:52.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:43:52.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:43:52.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:43:52.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:43:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:43:53.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:43:53.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:43:53.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:43:53.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:43:53.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:43:53.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:43:53.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:43:53.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:43:53.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-28T12:43:53.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:43:53.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:43:53.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:44:23.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:44:23.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:44:23.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:44:24.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:44:24.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:44:24.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:44: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-28T12:44:24.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:44: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-28T12:44:24.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:44:24.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:44:24.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:44: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-28T12:44:27.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-28T12:44:27.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:44:27.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:44:27.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:44:27.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:44:27.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:44:27.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:44:27.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:44:27.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:44:27.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:44:27.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:44:27.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:44:27.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:44:27.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:44:27.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:44:27.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:44:27.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:44:27.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:44:27.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:44:27.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:44:27.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:44:27.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:44:27.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:44:27.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:44:27.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:44:12
2026-05-28T12:44:27.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69014, datetime.datetime(2026, 5, 28, 12, 44, 12), datetime.datetime(2026, 5, 28, 12, 44, 12), 'salt', 13.48, 33.35, None, 6.71, 238.75, 15.81, 830.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:44:27.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:44:27.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:44:27.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:12, diff=15.89657s, valid=True
2026-05-28T12:44:27.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:44:27.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:44:27.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:12, diff=15.899498s, valid=True
2026-05-28T12:44:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:44:27.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:05, diff=22.906105s, valid=True
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:44:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:44:27.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:12, diff=15.909147s, valid=True
2026-05-28T12:44:27.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:44:27.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:44:27.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:44:27.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897709.909814s, valid=True
2026-05-28T12:44:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:44:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:44:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:44:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:44:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:44:27.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:44:27.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:44:27.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:44:27.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:44:28.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:44:28.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:44:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:44:28.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:44:28.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:44:28.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:44:28.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:44:28.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:44:28.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:44:28.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-28T12:44:28.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-28T12:44:29.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:44:29.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:44:59.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:44:59.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:44:59.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:44:59.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:44:59.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:44:59.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:44:59.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-28T12:44:59.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:44:59.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-28T12:44:59.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:44:59.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:44:59.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:44:59.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:45:02.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-28T12:45:02.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:45:02.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:45:02.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:45:02.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:45:02.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:45:02.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:45:02.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:45:02.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:45:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:45:02.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:45:02.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:45:02.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:45:02.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:45:02.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:45:02.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:45:02.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:45:02.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:45:02.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:45:03.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:45:03.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:45:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:45:03.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:45:03.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:45:03.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:44:43
2026-05-28T12:45:03.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69015, datetime.datetime(2026, 5, 28, 12, 44, 43), datetime.datetime(2026, 5, 28, 12, 44, 42), 'salt', 13.38, 32.62, None, 5.93, 226.09, 16.1, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:45:03.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:45:03.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:45:03.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:42, diff=21.079336s, valid=True
2026-05-28T12:45:03.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:45:03.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:45:03.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:12, diff=-8.917791s, valid=True
2026-05-28T12:45:03.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:45:03.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:45:03.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:44:37, diff=26.088913s, valid=True
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:45:03.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:45:03.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:12, diff=-8.908062s, valid=True
2026-05-28T12:45:03.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:45:03.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:45:03.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:45:03.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897745.092596s, valid=True
2026-05-28T12:45:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:45:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:45:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:45:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:45:03.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:45:03.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:45:03.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:45:03.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:45:03.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:45:03.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:45:03.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:45:03.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:45:03.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:45:03.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:45:03.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:45:03.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:45:04.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:45:04.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:45:04.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-28T12:45:04.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-28T12:45:04.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:45:04.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:45:34.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:45:34.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:45:34.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:45:34.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:45:34.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:45:34.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:45: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-28T12:45:34.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:45:34.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:45:34.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:45:34.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:45:34.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:45: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-28T12:45:37.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:45:37.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:45:37.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:45:37.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:45:37.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:45:37.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:45:37.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:45:37.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:45:37.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:45:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:45:37.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:45:37.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:45:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:45:37.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:45:37.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:45:38.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:45:38.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:45:38.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:45:38.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:45:38.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:45:38.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:45:38.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:45:38.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:45:38.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:45:38.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:45:13
2026-05-28T12:45:38.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69016, datetime.datetime(2026, 5, 28, 12, 45, 13), datetime.datetime(2026, 5, 28, 12, 45, 12), 'salt', 13.28, 34.74, None, 5.97, 226.72, 15.23, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:45:38.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:45:38.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:45:38.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:12, diff=26.222946s, valid=True
2026-05-28T12:45:38.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:45:38.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:45:38.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:12, diff=26.22581s, valid=True
2026-05-28T12:45:38.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:45:38.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:09, diff=29.23253s, valid=True
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:45:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:45:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:12, diff=26.235569s, valid=True
2026-05-28T12:45:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:45:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:45:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:45:38.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897780.236267s, valid=True
2026-05-28T12:45:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:45:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:45:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:45:38.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:45:38.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:45:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:45:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:45:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:45:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:45:38.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:45:38.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:45:38.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:45:38.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:45:38.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:45:38.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:45:39.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:45:39.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:45:39.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:45:39.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-28T12:45:39.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-28T12:45:39.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:45:39.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:46:09.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:46:09.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:46:09.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:46:09.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:46:09.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:46:10.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:46:10.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-28T12:46:10.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:46:10.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-28T12:46:10.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:46:10.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:46:10.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:46:10.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-28T12:46:12.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:46:12.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:46:12.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:46:12.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:46:12.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:46:12.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:46:12.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:46:12.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:46:12.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:46:12.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:46:12.631 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:46:12.631 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:46:12.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:46:12.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:46:12.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:46:12.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:46:12.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:46:12.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:46:12.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:46:12.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:46:12.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:46:12.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:46:12.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:46:12.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:46:12.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:45:43
2026-05-28T12:46:12.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69017, datetime.datetime(2026, 5, 28, 12, 45, 43), datetime.datetime(2026, 5, 28, 12, 45, 43), 'salt', 13.28, 33.58, None, 7.27, 243.19, 15.69, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:46:12.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:46:12.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:46:12.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:43, diff=29.948798s, valid=True
2026-05-28T12:46:12.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:46:12.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:46:12.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:46:12, diff=0.951691s, valid=True
2026-05-28T12:46:12.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:46:12.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:45:40, diff=32.958322s, valid=True
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:46:12.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:46:12.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:46:12, diff=0.961376s, valid=True
2026-05-28T12:46:12.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:46:12.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:46:12.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:46:12.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897814.962043s, valid=True
2026-05-28T12:46:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:46:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:46:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:46:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:46:12.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:46:13.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:46:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:46:13.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:46:13.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:46:13.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:46:13.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:46:13.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:46:13.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:46:13.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:46:13.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:46:13.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:46:13.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:46:13.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:46:13.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-28T12:46:13.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-28T12:46:14.184 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:46:14.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:46:44.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:46:44.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:46:44.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:46:44.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:46:44.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:46:44.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:46:44.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-28T12:46:44.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:46:44.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:46:44.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:46:44.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:46:44.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:46:44.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-28T12:46:48.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-28T12:46:48.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:46:48.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:46:48.025 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:46:48.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:46:48.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:46:48.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:46:48.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:46:48.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:46:48.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:46:48.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:46:48.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:46:48.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:46:48.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:46:48.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:46:48.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:46:48.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:46:48.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:46:48.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:46:48.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:46:48.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:46:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:46:48.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:46:48.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:46:48.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:46:44
2026-05-28T12:46:48.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69019, datetime.datetime(2026, 5, 28, 12, 46, 44), datetime.datetime(2026, 5, 28, 12, 46, 43), 'salt', 13.11, 33.05, None, 5.86, 268.11, 15.88, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:46:48.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:46:48.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:46:48.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:46:43, diff=5.364065s, valid=True
2026-05-28T12:46:48.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:46:48.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:46:48.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:12, diff=-23.633061s, valid=True
2026-05-28T12:46:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:46:48.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:46:35, diff=13.373482s, valid=True
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:46:48.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:46:48.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:12, diff=-23.623534s, valid=True
2026-05-28T12:46:48.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:46:48.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:46:48.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:46:48.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897850.377118s, valid=True
2026-05-28T12:46:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:46:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:46:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:46:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:46:48.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:46:48.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:46:48.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:46:48.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:46:48.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:46:48.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:46:48.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:46:48.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:46:48.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:46:48.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:46:48.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:46:49.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:46:49.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:46:49.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:46:49.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-28T12:46:49.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-28T12:46:49.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:46:49.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:47:19.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:47:19.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:47:19.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:47:19.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:47:19.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:47:19.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:47:19.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-28T12:47:19.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:47:19.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-28T12:47:19.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:47:19.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:47:19.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:47:19.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-28T12:47:22.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-28T12:47:22.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:47:22.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:47:22.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:47:22.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:47:22.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:47:22.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:47:22.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:47:22.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:47:22.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:47:22.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:47:22.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:47:22.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:47:22.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:47:22.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:47:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:47:22.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:47:22.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:47:22.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:47:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:47:22.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:47:22.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:47:22.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:47:22.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:47:22.735 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:47:14
2026-05-28T12:47:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69020, datetime.datetime(2026, 5, 28, 12, 47, 14), datetime.datetime(2026, 5, 28, 12, 47, 13), 'salt', 13.11, 35.96, None, 2.97, 235.1, 14.74, 830.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:47:22.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:47:22.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:47:22.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:13, diff=9.741744s, valid=True
2026-05-28T12:47:22.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:47:22.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:47:22.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:12, diff=10.744599s, valid=True
2026-05-28T12:47:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:47:22.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:05, diff=17.751276s, valid=True
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:47:22.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:47:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:12, diff=10.754277s, valid=True
2026-05-28T12:47:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:47:22.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:47:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:47:22.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897884.754938s, valid=True
2026-05-28T12:47:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:47:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:47:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:47:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:47:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:47:22.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:47:22.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:47:22.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:47:22.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:47:22.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:47:22.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:47:22.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:47:23.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:47:23.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:47:23.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:47:23.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:47:23.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:47:23.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:47:23.713 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:47:23.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-28T12:47:23.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:47:23.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:47:54.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:47:54.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:47:54.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:47:54.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:47:54.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:47:54.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:47:54.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-28T12:47:54.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:47:54.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-28T12:47:54.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:47:54.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:47:54.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:47:54.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-28T12:47:56.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-28T12:47:56.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:47:56.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:47:56.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:47:56.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:47:56.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:47:56.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:47:56.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:47:56.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:47:56.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:47:56.871 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:47:56.871 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:47:56.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:47:56.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:47:56.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:47:57.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:47:57.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:47:57.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:47:57.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:47:57.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:47:57.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:47:57.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:47:57.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:47:57.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:47:57.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:47:44
2026-05-28T12:47:57.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69021, datetime.datetime(2026, 5, 28, 12, 47, 44), datetime.datetime(2026, 5, 28, 12, 47, 44), 'salt', 13.21, 34.37, None, 1.7, 238.45, 15.37, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:47:57.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:47:57.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:47:57.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:44, diff=13.181458s, valid=True
2026-05-28T12:47:57.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:47:57.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:47:57.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:12, diff=-14.815776s, valid=True
2026-05-28T12:47:57.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:47:57.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:47:57.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:47:36, diff=21.19072s, valid=True
2026-05-28T12:47:57.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:47:57.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:47:57.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:47:57.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:47:57.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:47:57.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:47:57.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:12, diff=-14.806302s, valid=True
2026-05-28T12:47:57.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:47:57.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:47:57.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:47:57.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897919.19433s, valid=True
2026-05-28T12:47:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:47:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:47:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:47:57.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:47:57.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:47:57.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:47:57.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:47:57.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:47:57.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:47:57.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:47:57.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:47:57.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:47:57.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:47:57.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:47:57.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:47:58.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:47:58.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:47:58.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:47:58.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-28T12:47:58.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-28T12:47:58.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:47:58.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:48:28.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:48:28.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:48:28.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:48:28.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:48:28.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:48:28.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:48:28.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-28T12:48:28.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:48: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-28T12:48:28.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:48:28.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:48:28.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:48:28.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-28T12:48:31.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:48:31.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:48:31.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:48:31.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:48:31.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:48:31.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:48:31.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:48:31.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:48:31.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:48:31.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:48:31.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:48:31.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:48:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:48:31.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:48:31.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:48:31.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:48:31.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:48:31.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:48:31.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:48:31.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:48:31.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:48:31.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:48:31.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:48:31.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:48:31.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:48:14
2026-05-28T12:48:31.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69022, datetime.datetime(2026, 5, 28, 12, 48, 14), datetime.datetime(2026, 5, 28, 12, 48, 14), 'salt', 13.31, 33.28, None, 4.2, 301.53, 15.81, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:48:31.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:48:31.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:48:31.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:14, diff=17.344893s, valid=True
2026-05-28T12:48:31.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:48:31.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:48:31.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:12, diff=19.347747s, valid=True
2026-05-28T12:48:31.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:48:31.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:07, diff=24.35443s, valid=True
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:48:31.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:48:31.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:12, diff=19.357442s, valid=True
2026-05-28T12:48:31.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:48:31.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:48:31.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:48:31.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897953.358102s, valid=True
2026-05-28T12:48:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:48:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:48:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:48:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:48:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:48:31.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:48:31.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:48:31.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:48:31.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:48:31.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:48:31.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:48:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:48:31.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:48:31.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:48:31.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:48:32.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:48:32.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:48:32.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:48:32.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-28T12:48:32.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-28T12:48:32.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:48:32.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:49:02.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:49:02.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:49:02.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:49:03.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:49:03.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:49:03.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:49:03.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-28T12:49:03.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:49:03.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-28T12:49:03.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:49:03.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:49:03.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:49:03.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-28T12:49:05.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:49:05.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:49:05.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:49:05.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:49:05.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:49:05.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:49:05.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:49:05.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:49:05.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:49:05.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:49:05.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:49:05.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:49:05.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:49:05.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:49:05.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:49:05.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:49:05.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:49:05.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:49:05.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:49:05.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:49:05.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:49:05.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:49:05.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:49:05.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:49:06.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:48:44
2026-05-28T12:49:06.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69023, datetime.datetime(2026, 5, 28, 12, 48, 44), datetime.datetime(2026, 5, 28, 12, 48, 44), 'salt', 13.34, 33.81, None, 5.05, 7.09, 15.6, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:49:06.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:49:06.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:49:06.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:44, diff=22.030626s, valid=True
2026-05-28T12:49:06.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:49:06.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:49:06.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:12, diff=-5.966451s, valid=True
2026-05-28T12:49:06.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:49:06.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:48:39, diff=27.040391s, valid=True
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:49:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:49:06.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:12, diff=-5.956508s, valid=True
2026-05-28T12:49:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:49:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:49:06.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:49:06.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=897988.044164s, valid=True
2026-05-28T12:49:06.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:49:06.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:49:06.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:49:06.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:49:06.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:49:06.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:49:06.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:49:06.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:49:06.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:49:06.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:49:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:49:06.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:49:06.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:49:06.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:49:06.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:49:06.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:49:07.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:49:07.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:49:07.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-28T12:49:07.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-28T12:49:07.243 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:49:07.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:49:37.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:49:37.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:49:37.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:49:37.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:49:37.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:49:38.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:49:38.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-28T12:49:38.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:49:38.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:49:38.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:49:38.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:49:38.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:49:38.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-28T12:49:40.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-28T12:49:40.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:49:40.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:49:40.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:49:40.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:49:40.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:49:40.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:49:40.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:49:40.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:49:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:49:40.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:49:40.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:49:40.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:49:40.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:49:40.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:49:40.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:49:40.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:49:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:49:40.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:49:41.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:49:41.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:49:41.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:49:41.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:49:41.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:49:41.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:49:15
2026-05-28T12:49:41.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69024, datetime.datetime(2026, 5, 28, 12, 49, 15), datetime.datetime(2026, 5, 28, 12, 49, 14), 'salt', 13.44, 32.28, None, 2.23, 16.66, 16.24, 830.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:49:41.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:49:41.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:49:41.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:14, diff=27.069224s, valid=True
2026-05-28T12:49:41.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:49:41.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:49:41.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:12, diff=29.073151s, valid=True
2026-05-28T12:49:41.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:49:41.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:49:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:10, diff=31.081651s, valid=True
2026-05-28T12:49:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:49:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:49:41.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:49:41.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:49:41.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:49:41.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:49:41.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:49:12, diff=29.084833s, valid=True
2026-05-28T12:49:41.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:49:41.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:49:41.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:49:41.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898023.085501s, valid=True
2026-05-28T12:49:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:49:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:49:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:49:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:49:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:49:41.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:49:41.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:49:41.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:49:41.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:49:41.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:49:41.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:49:41.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:49:41.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:49:41.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:49:41.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:49:42.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:49:42.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:49:42.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:49:42.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:49:42.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:49:42.289 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:49:42.289 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:50:12.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:50:12.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:50:12.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:50:12.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:50:12.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:50:12.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:50:12.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-28T12:50:12.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:50:12.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-28T12:50:12.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:50:12.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:50:12.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:50:12.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-28T12:50:15.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-28T12:50:15.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:50:15.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:50:15.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:50:15.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:50:15.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:50:15.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:50:15.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:50:15.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:50:15.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:50:15.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:50:15.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:50:15.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:50:15.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:50:15.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:50:15.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:50:15.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:50:15.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:50:15.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:50:15.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:50:15.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:50:15.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:50:15.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:50:15.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:50:15.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:50:15
2026-05-28T12:50:15.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69026, datetime.datetime(2026, 5, 28, 12, 50, 15), datetime.datetime(2026, 5, 28, 12, 50, 15), 'salt', 13.61, 31.79, None, 1.49, 273.55, 16.47, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:50:15.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:50:15.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:50:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:15, diff=0.673155s, valid=True
2026-05-28T12:50:15.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:50:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:50:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:12, diff=3.676054s, valid=True
2026-05-28T12:50:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:50:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:50:15.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:13, diff=2.682812s, valid=True
2026-05-28T12:50:15.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:50:15.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:50:15.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:50:15.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:50:15.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:50:15.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:50:15.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:12, diff=3.685813s, valid=True
2026-05-28T12:50:15.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:50:15.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:50:15.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:50:15.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898057.686483s, valid=True
2026-05-28T12:50:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:50:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:50:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:50:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:50:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:50:15.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:50:15.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:50:15.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:50:15.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:50:15.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:50:15.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:50:15.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:50:15.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:50:16.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:50:16.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:50:16.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:50:16.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:50:16.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:50:16.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-28T12:50:16.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-28T12:50:16.753 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:50:16.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:50:46.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:50:46.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:50:46.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:50:47.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:50:47.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:50:47.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:50:47.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:50:47.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:50:47.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-28T12:50:47.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:50:47.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:50:47.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:50:47.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-28T12:50:50.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-28T12:50:50.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:50:50.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:50:50.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:50:50.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:50:50.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:50:50.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:50:50.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:50:50.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:50:50.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:50:50.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:50:50.164 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:50:50.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:50:50.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:50:50.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:50:50.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:50:50.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:50:50.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:50:50.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:50:50.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:50:50.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:50:50.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:50:50.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:50:50.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:50:50.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:50:45
2026-05-28T12:50:50.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69027, datetime.datetime(2026, 5, 28, 12, 50, 45), datetime.datetime(2026, 5, 28, 12, 50, 45), 'salt', 13.67, 31.69, None, 4.77, 259.29, 16.52, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:50:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:50:50.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:50:50.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:45, diff=5.485846s, valid=True
2026-05-28T12:50:50.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:50:50.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:50:50.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:12, diff=-21.511297s, valid=True
2026-05-28T12:50:50.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:50:50.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:50:45, diff=5.495354s, valid=True
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:50:50.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:50:50.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:12, diff=-21.501643s, valid=True
2026-05-28T12:50:50.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:50:50.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:50:50.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:50:50.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898092.499025s, valid=True
2026-05-28T12:50:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:50:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:50:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:50:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:50:50.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:50:50.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:50:50.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:50:50.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:50:50.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:50:50.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:50:50.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:50:50.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:50:50.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:50:50.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:50:51.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:50:51.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:50:51.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:50:51.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:50:51.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-28T12:50:51.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-28T12:50:51.846 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:50:51.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:51:21.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:51:21.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:51:21.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:51:22.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:51:22.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:51:22.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:51:22.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-28T12:51:22.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:51:22.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-28T12:51:22.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:51:22.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:51:22.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:51:22.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-28T12:51:25.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-28T12:51:25.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:51:25.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:51:25.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:51:25.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:51:25.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:51:25.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:51:25.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:51:25.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:51:25.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:51:25.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:51:25.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:51:25.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:51:25.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:51:25.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:51:26.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:51:26.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:51:26.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:51:26.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:51:26.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:51:26.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:51:26.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:51:26.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:51:26.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:51:26.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:51:15
2026-05-28T12:51:26.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69028, datetime.datetime(2026, 5, 28, 12, 51, 15), datetime.datetime(2026, 5, 28, 12, 51, 15), 'salt', 13.57, 32.15, None, 4.27, 238.24, 16.31, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:51:26.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:51:26.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:51:26.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:15, diff=11.172246s, valid=True
2026-05-28T12:51:26.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:51:26.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:51:26.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:12, diff=14.17509s, valid=True
2026-05-28T12:51:26.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:51:26.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:51:26.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:07, diff=19.181884s, valid=True
2026-05-28T12:51:26.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:51:26.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:51:26.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:51:26.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:51:26.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:51:26.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:51:26.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:12, diff=14.184881s, valid=True
2026-05-28T12:51:26.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:51:26.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:51:26.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:51:26.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898128.185529s, valid=True
2026-05-28T12:51:26.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:51:26.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:51:26.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:51:26.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:51:26.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:51:26.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:51:26.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:51:26.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:51:26.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:51:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:51:26.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:51:26.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:51:26.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:51:26.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:51:26.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:51:27.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:51:27.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:51:27.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:51:27.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-28T12:51:27.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-28T12:51:27.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:51:27.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:51:57.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:51:57.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:51:57.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:51:57.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:51:57.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:51:58.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:51:58.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-28T12:51:58.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:51:58.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-28T12:51:58.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:51:58.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:51:58.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:51:58.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-28T12:52:00.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-28T12:52:00.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:52:00.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:52:00.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:52:00.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:52:00.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:52:00.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:52:00.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:52:00.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:52:00.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:52:00.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:52:00.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:52:00.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:52:00.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:52:00.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:52:00.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:52:00.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:52:00.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:52:00.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:52:00.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:52:00.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:52:00.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:52:00.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:52:00.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:52:00.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:51:46
2026-05-28T12:52:00.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69029, datetime.datetime(2026, 5, 28, 12, 51, 46), datetime.datetime(2026, 5, 28, 12, 51, 45), 'salt', 13.61, 31.09, None, 4.48, 250.41, 16.77, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:52:00.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:52:00.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:52:00.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:45, diff=15.85091s, valid=True
2026-05-28T12:52:00.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:52:00.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:52:00.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:12, diff=-11.146181s, valid=True
2026-05-28T12:52:00.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:52:00.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:51:37, diff=23.860406s, valid=True
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:52:00.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:52:00.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:12, diff=-11.136562s, valid=True
2026-05-28T12:52:00.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:52:00.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:52:00.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:52:00.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898162.864103s, valid=True
2026-05-28T12:52:00.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:52:00.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:52:00.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:52:00.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:52:00.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:52:00.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:52:00.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:52:00.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:52:00.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:52:00.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:52:01.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:52:01.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:52:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:52:01.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:52:01.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:52:01.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:52:01.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:52:01.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:52:01.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-28T12:52:01.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-28T12:52:02.199 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:52:02.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:52:32.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:52:32.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:52:32.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:52:32.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:52:32.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:52:32.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:52:32.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-28T12:52:32.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:52:32.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-28T12:52:32.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:52:32.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:52:32.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:52:32.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-28T12:52:35.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-28T12:52:35.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:52:35.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:52:35.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:52:35.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:52:35.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:52:35.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:52:35.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:52:35.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:52:35.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:52:35.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:52:35.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:52:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:52:35.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:52:35.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:52:35.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:52:35.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:52:35.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:52:35.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:52:35.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:52:35.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:52:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:52:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:52:35.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:52:35.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:52:16
2026-05-28T12:52:35.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69030, datetime.datetime(2026, 5, 28, 12, 52, 16), datetime.datetime(2026, 5, 28, 12, 52, 15), 'salt', 13.44, 31.46, None, 2.37, 281.69, 16.59, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:52:35.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:52:35.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:52:35.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:15, diff=20.569779s, valid=True
2026-05-28T12:52:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:52:35.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:52:35.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:12, diff=23.572662s, valid=True
2026-05-28T12:52:35.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:52:35.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:08, diff=27.579287s, valid=True
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:52:35.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:52:35.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:12, diff=23.582276s, valid=True
2026-05-28T12:52:35.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:52:35.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:52:35.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:52:35.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898197.582928s, valid=True
2026-05-28T12:52:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:52:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:52:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:52:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:52:35.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:52:35.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:52:35.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:52:35.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:52:35.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:52:35.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:52:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:52:35.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:52:35.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:52:35.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:52:36.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:52:36.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:52:36.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:52:36.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:52:36.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-28T12:52:36.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-28T12:52:36.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:52:36.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:53:06.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:53:06.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:53:06.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:53:07.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:53:07.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:53:07.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:53:07.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-28T12:53:07.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:53:07.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-28T12:53:07.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:53:07.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:53:07.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:53:07.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-28T12:53:09.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-28T12:53:09.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:53:09.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:53:09.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:53:09.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:53:09.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:53:09.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:53:09.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:53:09.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:53:09.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:53:09.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:53:09.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:53:09.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:53:09.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:53:09.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:53:10.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:53:10.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:53:10.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:53:10.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:53:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:53:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:53:10.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:53:10.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:53:10.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:53:10.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:52:46
2026-05-28T12:53:10.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69031, datetime.datetime(2026, 5, 28, 12, 52, 46), datetime.datetime(2026, 5, 28, 12, 52, 46), 'salt', 13.54, 32.68, None, 3.95, 249.87, 16.09, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:53:10.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:53:10.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:53:10.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:46, diff=24.181657s, valid=True
2026-05-28T12:53:10.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:53:10.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:53:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:12, diff=-1.814322s, valid=True
2026-05-28T12:53:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:53:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:52:40, diff=30.192456s, valid=True
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:53:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:53:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:12, diff=-1.804489s, valid=True
2026-05-28T12:53:10.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:53:10.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:53:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:53:10.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898232.196186s, valid=True
2026-05-28T12:53:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:53:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:53:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:53:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:53:10.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:53:10.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:53:10.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:53:10.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:53:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:53:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:53:10.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:53:10.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:53:10.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:53:10.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:53:10.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:53:11.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:53:11.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:53:11.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:53:11.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-28T12:53:11.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-28T12:53:11.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:53:11.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:53:41.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:53:41.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:53:41.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:53:41.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:53:41.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:53:42.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:53:42.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-28T12:53:42.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:53:42.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-28T12:53:42.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:53:42.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:53:42.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:53:42.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-28T12:53:44.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:53:44.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:53:44.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:53:44.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:53:44.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:53:44.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:53:44.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:53:44.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:53:44.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:53:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:53:44.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:53:44.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:53:44.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:53:44.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:53:44.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:53:44.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:53:44.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:53:44.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:53:44.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:53:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:53:44.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:53:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:53:44.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:53:44.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:53:44.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:53:16
2026-05-28T12:53:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69032, datetime.datetime(2026, 5, 28, 12, 53, 16), datetime.datetime(2026, 5, 28, 12, 53, 16), 'salt', 13.57, 33.11, None, 6.5, 241.59, 15.91, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:53:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:53:44.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:53:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:16, diff=28.969229s, valid=True
2026-05-28T12:53:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:53:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:53:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:12, diff=32.972185s, valid=True
2026-05-28T12:53:44.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:53:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:53:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:11, diff=33.978968s, valid=True
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:53:44.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:53:44.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:53:12, diff=32.982065s, valid=True
2026-05-28T12:53:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:53:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:53:44.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:53:44.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898266.982738s, valid=True
2026-05-28T12:53:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:53:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:53:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:53:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:53:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:53:45.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:53:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:53:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:53:45.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:53:45.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:53:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:53:45.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:53:45.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:53:45.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:53:45.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:53:45.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:53:45.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:53:45.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:53:45.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-28T12:53:45.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-28T12:53:46.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:53:46.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:54:16.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:54:16.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:54:16.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:54:16.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:54:16.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:54:16.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:54:16.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-28T12:54:16.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:54:16.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-28T12:54:16.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:54:16.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:54:16.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:54:16.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:54:19.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-28T12:54:19.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:54:19.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:54:19.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:54:19.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:54:19.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:54:19.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:54:19.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:54:19.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:54:19.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:54:19.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:54:19.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:54:19.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:54:19.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:54:19.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:54:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:54:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:54:19.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:54:19.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:54:19.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:54:19.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:54:19.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:54:19.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:54:19.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:54:19.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:54:17
2026-05-28T12:54:19.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69034, datetime.datetime(2026, 5, 28, 12, 54, 17), datetime.datetime(2026, 5, 28, 12, 54, 16), 'salt', 13.74, 32.62, None, 7.8, 223.02, 16.14, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:54:19.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:54:19.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:54:19.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:16, diff=3.717066s, valid=True
2026-05-28T12:54:19.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:54:19.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:54:19.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:12, diff=7.719862s, valid=True
2026-05-28T12:54:19.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:54:19.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:15, diff=4.726379s, valid=True
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:54:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:54:19.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:12, diff=7.729366s, valid=True
2026-05-28T12:54:19.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:54:19.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:54:19.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:54:19.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898301.730022s, valid=True
2026-05-28T12:54:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:54:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:54:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:54:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:54:19.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:54:19.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:54:19.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:54:19.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:54:19.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:54:19.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:54:19.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:54:19.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:54:20.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:54:20.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:54:20.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:54:20.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:54:20.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:54:20.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:54: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-28T12:54: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-28T12:54:20.842 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:54:20.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:54:50.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:54:50.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:54:50.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:54:51.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:54:51.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:54:51.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:54:51.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-28T12:54:51.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:54:51.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-28T12:54:51.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:54:51.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:54:51.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:54:51.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-28T12:54:53.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:54:53.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:54:53.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:54:53.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:54:53.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:54:53.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:54:53.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:54:53.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:54:53.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:54:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:54:53.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:54:53.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:54:53.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:54:53.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:54:53.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:54:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:54:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:54:54.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:54:54.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:54:54.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:54:54.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:54:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:54:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:54:54.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:54:54.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:54:47
2026-05-28T12:54:54.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69035, datetime.datetime(2026, 5, 28, 12, 54, 47), datetime.datetime(2026, 5, 28, 12, 54, 46), 'salt', 13.77, 34.47, None, 7.45, 253.08, 15.39, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:54:54.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:54:54.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:54:54.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:46, diff=8.12461s, valid=True
2026-05-28T12:54:54.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:54:54.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:54:54.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:12, diff=-17.87258s, valid=True
2026-05-28T12:54:54.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:54:54.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:54:46, diff=8.133984s, valid=True
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:54:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:54:54.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:12, diff=-17.863026s, valid=True
2026-05-28T12:54:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:54:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:54:54.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:54:54.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898336.137666s, valid=True
2026-05-28T12:54:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:54:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:54:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:54:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:54:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:54:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:54:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:54:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:54:54.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:54:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:54:54.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:54:54.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:54:54.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:54:54.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:54:54.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:54:55.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:54:55.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:54:55.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:54:55.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-28T12:54:55.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-28T12:54:55.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:54:55.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:55:25.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:55:25.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:55:25.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:55:25.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:55:25.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:55:26.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:55:26.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-28T12:55:26.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:55:26.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:55:26.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:55:26.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:55:26.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:55:26.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-28T12:55:28.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-28T12:55:28.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:55:28.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:55:28.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:55:28.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:55:28.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:55:28.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:55:28.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:55:28.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:55:28.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:55:28.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:55:28.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:55:28.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:55:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:55:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:55:29.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:55:29.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:55:29.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:55:29.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:55:29.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:55:29.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:55:29.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:55:29.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:55:29.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:55:29.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:55:17
2026-05-28T12:55:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69036, datetime.datetime(2026, 5, 28, 12, 55, 17), datetime.datetime(2026, 5, 28, 12, 55, 17), 'salt', 13.94, 33.74, None, 7.52, 223.09, 15.7, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:55:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:55:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:55:29.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:17, diff=12.229089s, valid=True
2026-05-28T12:55:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:55:29.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:55:29.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:12, diff=17.231907s, valid=True
2026-05-28T12:55:29.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:55:29.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:09, diff=20.238514s, valid=True
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:55:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:55:29.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:12, diff=17.241558s, valid=True
2026-05-28T12:55:29.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:55:29.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:55:29.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:55:29.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898371.242222s, valid=True
2026-05-28T12:55:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:55:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:55:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:55:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:55:29.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:55:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:55:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:55:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:55:29.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:55:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:55:29.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:55:29.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:55:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:55:29.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:55:29.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:55:30.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:55:30.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:55:30.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:55:30.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-28T12:55:30.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-28T12:55:30.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:55:30.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:56:00.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:56:00.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:56:00.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:56:00.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:56:00.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:56:01.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:56:01.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-28T12:56:01.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:56:01.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-28T12:56:01.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:56:01.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:56:01.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:56:01.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-28T12:56:03.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-28T12:56:03.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:56:03.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:56:03.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:56:03.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:56:03.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:56:03.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:56:03.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:56:03.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:56:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:56:03.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:56:03.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:56:03.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:56:03.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:56:03.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:56:04.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:56:04.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:56:04.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:56:04.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:56:04.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:56:04.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:56:04.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:56:04.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:56:04.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:56:04.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:55:47
2026-05-28T12:56:04.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69037, datetime.datetime(2026, 5, 28, 12, 55, 47), datetime.datetime(2026, 5, 28, 12, 55, 47), 'salt', 14.1, 31.72, None, 5.37, 234.69, 16.55, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:56:04.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:56:04.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:56:04.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:47, diff=17.226553s, valid=True
2026-05-28T12:56:04.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:56:04.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:56:04.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:12, diff=-7.7705s, valid=True
2026-05-28T12:56:04.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:56:04.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:55:40, diff=24.236317s, valid=True
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:56:04.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:56:04.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:12, diff=-7.760564s, valid=True
2026-05-28T12:56:04.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:56:04.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:56:04.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:56:04.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898406.240126s, valid=True
2026-05-28T12:56:04.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:56:04.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:56:04.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:56:04.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:56:04.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:56:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:56:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:56:04.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:56:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:56:04.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:56:04.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:56:04.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:56:04.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:56:04.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:56:04.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:56:05.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:56:05.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:56:05.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:56:05.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-28T12:56:05.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-28T12:56:05.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:56:05.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:56:35.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:56:35.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:56:35.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:56:35.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:56:35.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:56:35.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:56:35.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-28T12:56:35.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:56:35.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-28T12:56:35.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:56:35.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:56:35.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:56:35.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T12:56:38.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-28T12:56:38.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:56:38.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:56:38.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:56:38.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:56:38.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:56:38.323 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:56:38.323 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:56:38.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:56:38.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:56:38.324 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:56:38.324 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:56:38.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:56:38.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:56:38.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:56:38.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:56:38.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:56:38.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:56:38.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:56:38.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:56:38.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:56:38.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:56:38.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:56:38.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:56:38.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:56:17
2026-05-28T12:56:38.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69038, datetime.datetime(2026, 5, 28, 12, 56, 17), datetime.datetime(2026, 5, 28, 12, 56, 17), 'salt', 14.07, 31.99, None, 9.64, 239.71, 16.44, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:56:38.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:56:38.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:56:38.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:17, diff=21.659372s, valid=True
2026-05-28T12:56:38.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:56:38.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:56:38.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:12, diff=26.662296s, valid=True
2026-05-28T12:56:38.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:56:38.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:10, diff=28.669086s, valid=True
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:56:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:56:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:12, diff=26.672214s, valid=True
2026-05-28T12:56:38.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:56:38.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:56:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:56:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898440.672907s, valid=True
2026-05-28T12:56:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:56:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:56:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:56:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:56:38.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:56:38.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:56:38.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:56:38.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:56:38.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:56:38.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:56:39.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:56:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:56:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:56:39.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:56:39.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:56:39.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:56:39.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:56:39.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:56:39.835 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T12:56:39.835 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T12:56:39.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:56:39.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:57:09.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:57:09.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:57:09.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:57:10.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:57:10.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:57:10.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:57:10.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T12:57:10.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:57:10.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T12:57:10.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:57:10.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:57:10.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:57:10.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-28T12:57:13.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-28T12:57:13.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:57:13.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:57:13.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:57:13.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:57:13.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:57:13.619 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:57:13.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:57:13.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:57:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:57:13.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:57:13.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:57:13.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:57:13.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:57:13.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:57:13.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:57:13.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:57:13.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:57:13.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:57:13.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:57:13.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:57:13.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:57:13.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:57:13.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:57:13.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:56:48
2026-05-28T12:57:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69039, datetime.datetime(2026, 5, 28, 12, 56, 48), datetime.datetime(2026, 5, 28, 12, 56, 47), 'salt', 13.97, 32.58, None, 8.47, 246.11, 16.18, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:57:13.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:57:13.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:57:13.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:47, diff=26.966199s, valid=True
2026-05-28T12:57:13.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:57:13.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:57:13.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:57:12, diff=1.969137s, valid=True
2026-05-28T12:57:13.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:57:13.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:57:13.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:56:41, diff=32.975963s, valid=True
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:57:13.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:57:13.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:57:12, diff=1.97904s, valid=True
2026-05-28T12:57:13.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:57:13.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:57:13.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:57:13.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898475.979701s, valid=True
2026-05-28T12:57:13.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:57:13.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:57:13.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:57:13.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:57:13.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:57:14.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:57:14.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:57:14.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:57:14.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:57:14.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:57:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:57:14.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:57:14.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:57:14.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:57:14.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:57:14.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:57:15.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:57:15.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:57:15.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-28T12:57:15.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-28T12:57:16.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:57:16.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:57:47.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:57:47.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:57:47.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:57:47.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:57:47.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:57:47.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:57:47.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-28T12:57:47.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:57:47.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-28T12:57:47.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:57:47.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:57:47.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:57:47.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-28T12:57:50.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-28T12:57:50.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:57:50.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:57:50.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:57:50.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:57:50.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:57:50.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:57:50.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:57:50.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:57:50.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:57:50.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:57:50.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:57:50.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:57:50.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:57:50.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:57:50.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:57:50.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:57:50.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:57:50.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:57:50.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T12:57:50.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:57:50.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:57:50.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:57:50.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:57:50.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:57:48
2026-05-28T12:57:50.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69041, datetime.datetime(2026, 5, 28, 12, 57, 48), datetime.datetime(2026, 5, 28, 12, 57, 48), 'salt', 13.87, 32.02, None, 11.26, 266.14, 16.4, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:57:50.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:57:50.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:57:50.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:57:48, diff=2.841732s, valid=True
2026-05-28T12:57:50.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:57:50.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:57:50.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:12, diff=-21.155365s, valid=True
2026-05-28T12:57:50.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:57:50.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:57:44, diff=6.851414s, valid=True
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:57:50.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T12:57:50.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:12, diff=-21.145547s, valid=True
2026-05-28T12:57:50.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:57:50.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:57:50.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:57:50.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898512.85511s, valid=True
2026-05-28T12:57:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:57:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:57:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:57:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:57:50.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:57:50.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:57:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:57:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:57:50.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:57:50.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:57:51.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:57:51.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:57:51.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:57:51.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:57:51.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:57:51.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:57:51.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:57:51.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:57:51.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-28T12:57:51.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-28T12:57:52.075 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:57:52.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:58:22.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:58:22.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:58:22.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:58:22.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:58:22.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:58:22.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:58:22.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-28T12:58:22.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:58:22.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-28T12:58:22.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:58:22.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:58:22.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:58:22.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-28T12:58:25.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T12:58:25.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:58:25.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:58:25.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:58:25.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:58:25.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:58:25.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:58:25.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:58:25.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:58:25.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:58:25.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:58:25.059 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:58:25.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:58:25.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T12:58:25.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:58:25.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T12:58:25.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:58:25.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:58:25.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:58:25.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:58:25.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:58:25.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:58:25.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:58:25.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:58:25.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:58:18
2026-05-28T12:58:25.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69042, datetime.datetime(2026, 5, 28, 12, 58, 18), datetime.datetime(2026, 5, 28, 12, 58, 18), 'salt', 13.81, 32.75, None, 9.49, 270.45, 16.1, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:58:25.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:58:25.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T12:58:25.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:18, diff=7.386085s, valid=True
2026-05-28T12:58:25.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:58:25.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:58:25.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:12, diff=13.388921s, valid=True
2026-05-28T12:58:25.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:58:25.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:15, diff=10.395501s, valid=True
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:58:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:58:25.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:12, diff=13.398535s, valid=True
2026-05-28T12:58:25.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:58:25.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:58:25.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:58:25.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898547.399195s, valid=True
2026-05-28T12:58:25.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:58:25.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:58:25.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:58:25.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:58:25.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:58:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:58:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:58:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:58:25.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:58:25.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:58:25.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:58:25.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:58:25.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:58:25.788 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:58:26.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:58:26.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:58:26.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:58:26.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:58:26.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-28T12:58:26.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-28T12:58:26.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:58:26.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:58:56.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:58:56.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:58:56.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:58:56.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:58:56.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:58:57.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:58:57.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-28T12:58:57.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:58:57.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-28T12:58:57.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:58:57.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:58:57.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:58:57.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-28T12:58:59.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-28T12:58:59.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:58:59.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:58:59.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:58:59.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:58:59.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:58:59.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:58:59.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:58:59.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:58:59.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:58:59.511 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:58:59.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:58:59.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:58:59.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:58:59.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:58:59.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:58:59.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:58:59.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:58:59.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:58:59.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:58:59.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:58:59.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:58:59.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:58:59.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:58:59.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:58:49
2026-05-28T12:58:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69043, datetime.datetime(2026, 5, 28, 12, 58, 49), datetime.datetime(2026, 5, 28, 12, 58, 48), 'salt', 13.71, 33.05, None, 6.46, 219.38, 15.96, 829.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:58:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:58:59.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:58:59.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:48, diff=11.826485s, valid=True
2026-05-28T12:58:59.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:58:59.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:58:59.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:12, diff=-12.170599s, valid=True
2026-05-28T12:58:59.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:58:59.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:58:59.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:58:47, diff=12.837772s, valid=True
2026-05-28T12:58:59.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:58:59.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:58:59.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:58:59.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:58:59.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:58:59.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:58:59.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:12, diff=-12.158361s, valid=True
2026-05-28T12:58:59.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:58:59.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:58:59.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:58:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898581.842398s, valid=True
2026-05-28T12:58:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:58:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:58:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:58:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:58:59.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:58:59.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:58:59.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:58:59.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:58:59.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:58:59.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:59:00.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:59:00.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:59:00.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:59:00.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:59:00.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:59:00.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:59:00.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:59:00.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:59:00.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-28T12:59:00.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-28T12:59:01.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:59:01.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T12:59:31.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T12:59:31.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T12:59:31.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T12:59:31.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T12:59:31.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T12:59:31.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T12:59:31.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-28T12:59:31.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T12:59: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-28T12:59:31.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T12:59:31.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T12:59:31.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T12:59:31.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-28T12:59:34.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-28T12:59:34.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T12:59:34.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T12:59:34.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T12:59:34.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T12:59:34.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T12:59:34.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T12:59:34.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T12:59:34.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T12:59:34.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T12:59:34.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T12:59:34.239 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T12:59:34.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T12:59:34.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T12:59:34.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T12:59:34.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T12:59:34.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:59:34.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:59:34.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T12:59:34.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T12:59:34.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T12:59:34.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T12:59:34.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T12:59:34.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T12:59:34.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:59:19
2026-05-28T12:59:34.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69044, datetime.datetime(2026, 5, 28, 12, 59, 19), datetime.datetime(2026, 5, 28, 12, 59, 18), 'salt', 13.57, 32.28, None, 6.25, 247.4, 16.25, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T12:59:34.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T12:59:34.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T12:59:34.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:18, diff=16.566574s, valid=True
2026-05-28T12:59:34.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T12:59:34.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:59:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:12, diff=22.56937s, valid=True
2026-05-28T12:59:34.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T12:59:34.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:18, diff=16.576s, valid=True
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T12:59:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T12:59:34.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:12, diff=22.579014s, valid=True
2026-05-28T12:59:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T12:59:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T12:59:34.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T12:59:34.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898616.579676s, valid=True
2026-05-28T12:59:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T12:59:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T12:59:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T12:59:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T12:59:34.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T12:59:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T12:59:34.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T12:59:34.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T12:59:34.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T12:59:34.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T12:59:34.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T12:59:34.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T12:59:34.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T12:59:34.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T12:59:35.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:59:35.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T12:59:35.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T12:59:35.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T12:59: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-28T12:59: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-28T12:59:35.737 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T12:59:35.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:00:05.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:00:05.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:00:05.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:00:06.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:00:06.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:00:06.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:00:06.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-28T13:00:06.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:00:06.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-28T13:00:06.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:00:06.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:00:06.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:00:06.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-28T13:00:08.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-28T13:00:08.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:00:08.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:00:08.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:00:08.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:00:08.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:00:08.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:00:08.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:00:08.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:00:08.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:00:08.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:00:08.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:00:08.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:00:09.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:00:09.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:00:09.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:00:09.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:00:09.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:00:09.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:00:09.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:00:09.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:00:09.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:00:09.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:00:09.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:00:09.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 12:59:49
2026-05-28T13:00:09.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69045, datetime.datetime(2026, 5, 28, 12, 59, 49), datetime.datetime(2026, 5, 28, 12, 59, 49), 'salt', 13.74, 34.21, None, 6.95, 239.29, 15.49, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:00:09.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:00:09.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:00:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:49, diff=20.278386s, valid=True
2026-05-28T13:00:09.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:00:09.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:00:09.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:12, diff=-2.718964s, valid=True
2026-05-28T13:00:09.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:00:09.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 12:59:42, diff=27.287233s, valid=True
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:00:09.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:00:09.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:12, diff=-2.709939s, valid=True
2026-05-28T13:00:09.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:00:09.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:00:09.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:00:09.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898651.290678s, valid=True
2026-05-28T13:00:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:00:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:00:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:00:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:00:09.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:00:09.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:00:09.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:00:09.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:00:09.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:00:09.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:00:09.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:00:09.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:00:09.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:00:09.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:00:09.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:00:10.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:00:10.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:00:10.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:00:10.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-28T13:00:10.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-28T13:00:10.397 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:00:10.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:00:40.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:00:40.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:00:40.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:00:40.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:00:40.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:00:41.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:00:41.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-28T13:00:41.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:00:41.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-28T13:00:41.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:00:41.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:00:41.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:00:41.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-28T13:00:43.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-28T13:00:43.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:00:43.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:00:43.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:00:43.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:00:43.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:00:43.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:00:43.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:00:43.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:00:43.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:00:43.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:00:43.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:00:43.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:00:44.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:00:44.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:00:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:00:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:00:44.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:00:44.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:00:44.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:00:44.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:00:44.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:00:44.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:00:44.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:00:44.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:00:19
2026-05-28T13:00:44.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69046, datetime.datetime(2026, 5, 28, 13, 0, 19), datetime.datetime(2026, 5, 28, 13, 0, 19), 'salt', 13.81, 34.14, None, 4.48, 237.34, 15.53, 830.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:00:44.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:00:44.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:00:44.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:19, diff=25.237615s, valid=True
2026-05-28T13:00:44.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:00:44.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:00:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:12, diff=32.240424s, valid=True
2026-05-28T13:00:44.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:00:44.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:12, diff=32.247056s, valid=True
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:00:44.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:00:44.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:12, diff=32.250114s, valid=True
2026-05-28T13:00:44.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:00:44.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:00:44.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:00:44.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898686.250778s, valid=True
2026-05-28T13:00:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:00:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:00:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:00:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:00:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:00:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:00:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:00:44.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:00:44.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:00:44.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:00:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:00:44.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:00:44.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:00:44.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:00:44.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:00:45.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:00:45.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:00:45.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:00:45.237 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:00:45.237 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:00:45.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:00:45.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:01:15.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:01:15.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:01:15.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:01:15.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:01:15.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:01:16.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:01:16.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-28T13:01:16.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:01:16.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-28T13:01:16.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:01:16.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:01:16.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:01:16.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-28T13:01:18.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-28T13:01:18.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:01:18.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:01:18.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:01:18.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:01:18.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:01:18.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:01:18.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:01:18.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:01:18.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:01:18.899 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:01:18.899 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:01:18.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:01:18.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:01:18.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:01:19.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:01:19.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:01:19.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:01:19.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:01:19.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:01:19.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:01:19.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:01:19.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:01:19.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:01:19.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:00:49
2026-05-28T13:01:19.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69047, datetime.datetime(2026, 5, 28, 13, 0, 49), datetime.datetime(2026, 5, 28, 13, 0, 49), 'salt', 13.97, 34.04, None, 4.48, 255.91, 15.59, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:01:19.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:01:19.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:01:19.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:49, diff=30.218202s, valid=True
2026-05-28T13:01:19.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:01:19.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:01:19.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:01:12, diff=7.221017s, valid=True
2026-05-28T13:01:19.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:01:19.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:00:42, diff=37.227562s, valid=True
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:01:19.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:01:19.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:01:19.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:01:12, diff=7.230569s, valid=True
2026-05-28T13:01:19.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:01:19.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:01:19.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:01:19.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898721.231252s, valid=True
2026-05-28T13:01:19.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:01:19.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:01:19.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:01:19.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:01:19.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:01:19.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:01:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:01:19.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:01:19.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:01:19.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:01:19.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:01:19.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:01:19.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:01:19.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:01:19.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:01:20.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:01:20.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:01:20.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:01:20.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-28T13:01:20.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-28T13:01:20.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:01:20.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:01:50.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:01:50.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:01:50.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:01:50.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:01:50.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:01:51.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:01:51.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-28T13:01:51.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:01:51.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-28T13:01:51.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:01:51.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:01:51.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:01:51.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-28T13:01:54.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-28T13:01:54.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:01:54.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:01:54.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:01:54.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:01:54.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:01:54.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:01:54.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:01:54.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:01:54.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:01:54.077 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:01:54.077 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:01:54.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:01:54.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:01:54.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:01:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:01:54.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:01:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:01:54.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:01:54.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:01:54.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:01:54.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:01:54.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:01:54.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:01:54.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:01:50
2026-05-28T13:01:54.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69049, datetime.datetime(2026, 5, 28, 13, 1, 50), datetime.datetime(2026, 5, 28, 13, 1, 49), 'salt', 14.07, 32.28, None, 7.2, 290.36, 16.32, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:01:54.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:01:54.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:01:54.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:01:49, diff=5.39255s, valid=True
2026-05-28T13:01:54.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:01:54.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:01:54.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:12, diff=-17.604542s, valid=True
2026-05-28T13:01:54.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:01:54.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:01:45, diff=9.402151s, valid=True
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:01:54.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:01:54.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:12, diff=-17.594809s, valid=True
2026-05-28T13:01:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:01:54.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:01:54.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:01:54.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898756.40586s, valid=True
2026-05-28T13:01:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:01:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:01:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:01:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:01:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:01:54.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:01:54.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:01:54.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:01:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:01:54.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:01:54.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:01:54.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:01:54.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:01:54.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:01:54.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:01:55.281 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:01:55.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:01:55.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:01:55.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-28T13:01:55.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-28T13:01:55.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:01:55.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:02:25.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:02:25.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:02:25.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:02:25.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:02:25.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:02:26.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:02:26.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:02:26.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:02:26.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-28T13:02:26.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:02:26.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:02:26.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:02:26.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-28T13:02:29.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-28T13:02:29.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:02:29.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:02:29.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:02:29.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:02:29.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:02:29.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:02:29.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:02:29.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:02:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:02:29.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:02:29.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:02:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:02:29.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:02:29.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:02:29.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:02:29.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:02:29.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:02:29.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:02:29.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:02:29.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:02:29.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:02:29.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:02:29.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:02:29.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:02:20
2026-05-28T13:02:29.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69050, datetime.datetime(2026, 5, 28, 13, 2, 20), datetime.datetime(2026, 5, 28, 13, 2, 20), 'salt', 14.1, 31.49, None, 6.64, 282.93, 16.65, 830.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:02:29.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:02:29.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:02:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:20, diff=9.452734s, valid=True
2026-05-28T13:02:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:02:29.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:02:29.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:12, diff=17.455613s, valid=True
2026-05-28T13:02:29.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:02:29.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:16, diff=13.462441s, valid=True
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:02:29.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:02:29.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:12, diff=17.465502s, valid=True
2026-05-28T13:02:29.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:02:29.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:02:29.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:02:29.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898791.466176s, valid=True
2026-05-28T13:02:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:02:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:02:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:02:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:02:29.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:02:29.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:02:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:02:29.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:02:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:02:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:02:29.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:02:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:02:29.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:02:29.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:02:30.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:02:30.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:02:30.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:02:30.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:02:30.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-28T13:02:30.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-28T13:02:30.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:02:30.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:03:00.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:03:00.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:03:00.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:03:01.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:03:01.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:03:01.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:03:01.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-28T13:03:01.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:03:01.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-28T13:03:01.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:03:01.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:03:01.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:03:01.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-28T13:03: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-28T13:03:04.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:03:04.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:03:04.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:03:04.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:03:04.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:03:04.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:03:04.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:03:04.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:03:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:03:04.683 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:03:04.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:03:04.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:03:04.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:03:04.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:03:04.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:03:04.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:03:04.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:03:04.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:03:04.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:03:04.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:03:04.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:03:04.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:03:04.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:03:05.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:02:50
2026-05-28T13:03:05.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69051, datetime.datetime(2026, 5, 28, 13, 2, 50), datetime.datetime(2026, 5, 28, 13, 2, 50), 'salt', 13.97, 31.32, None, 7.52, 247.85, 16.71, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:03:05.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:03:05.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:03:05.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:50, diff=15.032277s, valid=True
2026-05-28T13:03:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:03:05.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:03:05.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:12, diff=-6.96486s, valid=True
2026-05-28T13:03:05.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:03:05.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:03:05.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:02:48, diff=17.041887s, valid=True
2026-05-28T13:03:05.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:03:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:03:05.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:03:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:03:05.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:03:05.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:03:05.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:12, diff=-6.955118s, valid=True
2026-05-28T13:03:05.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:03:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:03:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:03:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898827.045535s, valid=True
2026-05-28T13:03:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:03:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:03:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:03:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:03:05.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:03:05.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:03:05.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:03:05.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:03:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:03:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:03:05.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:03:05.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:03:05.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:03:05.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:03:05.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:03:05.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:03:06.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:03:06.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:03:06.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-28T13:03:06.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-28T13:03:06.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:03:06.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:03:36.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:03:36.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:03:36.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:03:36.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:03:36.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:03:36.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:03:36.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-28T13:03:36.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:03:36.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-28T13:03:36.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:03:36.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:03:36.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:03:36.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-28T13:03:39.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-28T13:03:39.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:03:39.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:03:39.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:03:39.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:03:39.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:03:39.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:03:39.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:03:39.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:03:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:03:39.108 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:03:39.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:03:39.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:03:39.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:03:39.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:03:39.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:03:39.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:03:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:03:39.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:03:39.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:03:39.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:03:39.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:03:39.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:03:39.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:03:39.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:03:20
2026-05-28T13:03:39.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69052, datetime.datetime(2026, 5, 28, 13, 3, 20), datetime.datetime(2026, 5, 28, 13, 3, 20), 'salt', 13.97, 31.99, None, 7.02, 240.11, 16.43, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:03:39.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:03:39.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:03:39.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:20, diff=19.427456s, valid=True
2026-05-28T13:03:39.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:03:39.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:03:39.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:12, diff=27.430242s, valid=True
2026-05-28T13:03:39.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:03:39.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:03:39.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:19, diff=20.436882s, valid=True
2026-05-28T13:03:39.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:03:39.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:03:39.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:03:39.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:03:39.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:03:39.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:03:39.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:12, diff=27.439889s, valid=True
2026-05-28T13:03:39.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:03:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:03:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:03:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898861.44054s, valid=True
2026-05-28T13:03:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:03:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:03:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:03:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:03:39.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:03:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:03:39.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:03:39.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:03:39.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:03:39.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:03:39.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:03:39.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:03:39.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:03:39.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:03:40.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:03:40.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:03:40.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:03:40.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:03:40.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-28T13:03:40.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-28T13:03:40.772 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:03:40.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:04:10.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:04:10.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:04:10.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:04:11.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:04:11.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:04:11.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:04:11.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:04:11.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:04:11.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-28T13:04:11.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:04:11.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:04:11.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:04:11.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-28T13:04:13.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-28T13:04:13.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:04:13.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:04:13.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:04:13.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:04:13.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:04:13.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:04:13.884 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:04:13.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:04:13.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:04:13.884 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:04:13.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:04:13.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:04:13.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:04:13.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:04:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:04:14.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:04:14.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:04:14.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:04:14.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:04:14.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:04:14.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:04:14.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:04:14.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:04:14.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:03:51
2026-05-28T13:04:14.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69053, datetime.datetime(2026, 5, 28, 13, 3, 51), datetime.datetime(2026, 5, 28, 13, 3, 50), 'salt', 14.1, 32.35, None, 6.85, 269.58, 16.29, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:04:14.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:04:14.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:04:14.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:50, diff=24.197775s, valid=True
2026-05-28T13:04:14.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:04:14.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:04:14.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:12, diff=2.200646s, valid=True
2026-05-28T13:04:14.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:04:14.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:03:43, diff=31.207234s, valid=True
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:04:14.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:04:14.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:12, diff=2.210282s, valid=True
2026-05-28T13:04:14.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:04:14.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:04:14.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:04:14.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898896.210931s, valid=True
2026-05-28T13:04:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:04:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:04:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:04:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:04:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:04:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:04:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:04:14.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:04:14.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:04:14.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:04:14.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:04:14.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:04:14.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:04:14.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:04:14.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:04:15.089 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:04:15.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:04:15.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:04:15.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-28T13:04:15.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-28T13:04:15.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:04:15.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:04:45.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:04:45.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:04:45.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:04:45.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:04:45.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:04:45.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:04:45.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-28T13:04:45.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:04:45.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-28T13:04:45.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:04:45.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:04:45.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:04:45.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-28T13:04:48.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-28T13:04:48.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:04:48.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:04:48.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:04:48.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:04:48.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:04:48.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:04:48.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:04:48.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:04:48.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:04:48.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:04:48.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:04:48.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:04:49.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:04:49.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:04:49.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:04:49.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:04:49.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:04:49.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:04:49.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:04:49.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:04:49.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:04:49.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:04:49.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:04:49.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:04:21
2026-05-28T13:04:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69054, datetime.datetime(2026, 5, 28, 13, 4, 21), datetime.datetime(2026, 5, 28, 13, 4, 20), 'salt', 14.27, 32.98, None, 7.13, 257.93, 16.05, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:04:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:04:49.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:04:49.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:20, diff=29.293254s, valid=True
2026-05-28T13:04:49.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:04:49.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:04:49.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:12, diff=37.296154s, valid=True
2026-05-28T13:04:49.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:04:49.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:04:49.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:13, diff=36.302821s, valid=True
2026-05-28T13:04:49.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:04:49.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:04:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:04:49.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:04:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:04:49.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:04:49.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:04:12, diff=37.305878s, valid=True
2026-05-28T13:04:49.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:04:49.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:04:49.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:04:49.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898931.306528s, valid=True
2026-05-28T13:04:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:04:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:04:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:04:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:04:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:04:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:04:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:04:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:04:49.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:04:49.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:04:49.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:04:49.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:04:49.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:04:49.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:04:49.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:04:50.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:04:50.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:04:50.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:04:50.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-28T13:04:50.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-28T13:04:50.462 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:04:50.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:05:20.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:05:20.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:05:20.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:05:21.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:05:21.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:05:21.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:05:21.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-28T13:05:21.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:05:21.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-28T13:05:21.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:05:21.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:05:21.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:05:21.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-28T13:05:24.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-28T13:05:24.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:05:24.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:05:24.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:05:24.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:05:24.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:05:24.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:05:24.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:05:24.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:05:24.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:05:24.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:05:24.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:05:24.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:05:24.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:05:24.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:05:24.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:05:24.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:05:24.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:05:24.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:05:24.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:05:24.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:05:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:05:24.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:05:24.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:05:24.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:05:21
2026-05-28T13:05:24.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69056, datetime.datetime(2026, 5, 28, 13, 5, 21), datetime.datetime(2026, 5, 28, 13, 5, 21), 'salt', 14.17, 33.01, None, 8.96, 259.1, 16.03, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:05:24.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:05:24.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:05:24.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:21, diff=3.506615s, valid=True
2026-05-28T13:05:24.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:05:24.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:05:24.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:12, diff=12.509438s, valid=True
2026-05-28T13:05:24.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:05:24.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:15, diff=9.516088s, valid=True
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:05:24.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:05:24.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:12, diff=12.519101s, valid=True
2026-05-28T13:05:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:05:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:05:24.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:05:24.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=898966.519769s, valid=True
2026-05-28T13:05:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:05:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:05:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:05:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:05:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:05:24.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:05:24.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:05:24.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:05:24.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:05:24.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:05:24.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:05:24.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:05:24.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:05:24.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:05:25.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:05:25.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:05:25.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:05:25.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:05:25.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-28T13:05:25.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-28T13:05:25.713 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:05:25.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:05:55.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:05:55.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:05:55.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:05:56.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:05:56.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:05:56.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:05:56.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-28T13:05:56.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:05:56.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-28T13:05:56.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:05:56.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:05:56.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:05:56.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:05:58.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-28T13:05:58.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:05:58.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:05:58.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:05:58.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:05:58.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:05:58.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:05:58.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:05:58.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:05:58.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:05:58.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:05:58.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:05:58.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:05:58.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:05:58.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:05:59.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:05:59.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:05:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:05:59.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:05:59.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:05:59.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:05:59.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:05:59.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:05:59.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:05:59.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:05:51
2026-05-28T13:05:59.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69057, datetime.datetime(2026, 5, 28, 13, 5, 51), datetime.datetime(2026, 5, 28, 13, 5, 51), 'salt', 14.07, 33.48, None, 7.45, 293.85, 15.83, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:05:59.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:05:59.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:05:59.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:51, diff=8.198224s, valid=True
2026-05-28T13:05:59.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:05:59.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:05:59.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:12, diff=-12.798944s, valid=True
2026-05-28T13:05:59.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:05:59.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:05:59.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:05:46, diff=13.207656s, valid=True
2026-05-28T13:05:59.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:05:59.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:05:59.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:05:59.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:05:59.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:05:59.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:05:59.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:12, diff=-12.789326s, valid=True
2026-05-28T13:05:59.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:05:59.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:05:59.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:05:59.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899001.211345s, valid=True
2026-05-28T13:05:59.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:05:59.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:05:59.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:05:59.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:05:59.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:05:59.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:05:59.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:05:59.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:05:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:05:59.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:05:59.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:05:59.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:05:59.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:05:59.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:05:59.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:06:00.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:06:00.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:06:00.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:06:00.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-28T13:06:00.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-28T13:06:00.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:06:00.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:06:30.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:06:30.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:06:30.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:06:30.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:06:30.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:06:30.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:06:30.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-28T13:06:30.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:06:30.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-28T13:06:30.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:06:30.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:06:30.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:06:30.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-28T13:06:33.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-28T13:06:33.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:06:33.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:06:33.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:06:33.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:06:33.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:06:33.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:06:33.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:06:33.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:06:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:06:33.644 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:06:33.644 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:06:33.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:06:33.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:06:33.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:06:33.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:06:33.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:06:33.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:06:33.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:06:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:06:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:06:33.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:06:33.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:06:33.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:06:33.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:06:22
2026-05-28T13:06:33.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69058, datetime.datetime(2026, 5, 28, 13, 6, 22), datetime.datetime(2026, 5, 28, 13, 6, 21), 'salt', 13.97, 32.12, None, 6.46, 317.23, 16.37, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:06:33.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:06:33.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:06:33.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:21, diff=12.961419s, valid=True
2026-05-28T13:06:33.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:06:33.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:06:33.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:12, diff=21.964386s, valid=True
2026-05-28T13:06:33.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:06:33.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:17, diff=16.971271s, valid=True
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:06:33.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:06:33.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:12, diff=21.974361s, valid=True
2026-05-28T13:06:33.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:06:33.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:06:33.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:06:33.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899035.975071s, valid=True
2026-05-28T13:06:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:06:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:06:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:06:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:06:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:06:34.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:06:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:06:34.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:06:34.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:06:34.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:06:34.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:06:34.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:06:34.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:06:34.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:06:34.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:06:34.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:06:35.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:06:35.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:06:35.092 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:06:35.092 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:06:35.335 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:06:35.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:07:05.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:07:05.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:07:05.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:07:05.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:07:05.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:07:05.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:07:05.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-28T13:07:05.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:07:05.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-28T13:07:05.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:07:05.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:07:05.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:07:05.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-28T13:07:08.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-28T13:07:08.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:07:08.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:07:08.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:07:08.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:07:08.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:07:08.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:07:08.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:07:08.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:07:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:07:08.404 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:07:08.405 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:07:08.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:07:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:07:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:07:08.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:07:08.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:07:08.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:07:08.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:07:08.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:07:08.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:07:08.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:07:08.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:07:08.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:07:08.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:06:52
2026-05-28T13:07:08.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69059, datetime.datetime(2026, 5, 28, 13, 6, 52), datetime.datetime(2026, 5, 28, 13, 6, 51), 'salt', 14.0, 32.32, None, 3.28, 319.92, 16.29, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:07:08.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:07:08.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:07:08.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:51, diff=17.728443s, valid=True
2026-05-28T13:07:08.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:07:08.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:07:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:12, diff=-3.268663s, valid=True
2026-05-28T13:07:08.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:07:08.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:06:49, diff=19.738128s, valid=True
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:07:08.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:07:08.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:12, diff=-3.258778s, valid=True
2026-05-28T13:07:08.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:07:08.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:07:08.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:07:08.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899070.741898s, valid=True
2026-05-28T13:07:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:07:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:07:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:07:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:07:08.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:07:08.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:07:08.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:07:08.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:07:08.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:07:08.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:07:08.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:07:08.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:07:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:07:09.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:07:09.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:07:09.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:07:09.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:07:09.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:07:09.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-28T13:07:09.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-28T13:07:10.038 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:07:10.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:07:40.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:07:40.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:07:40.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:07:40.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:07:40.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:07:40.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:07:40.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-28T13:07:40.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:07:40.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:07:40.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:07:40.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:07:40.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:07:40.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-28T13:07:43.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-28T13:07:43.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:07:43.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:07:43.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:07:43.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:07:43.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:07:43.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:07:43.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:07:43.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:07:43.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:07:43.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:07:43.579 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:07:43.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:07:43.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:07:43.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:07:43.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:07:43.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:07:43.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:07:43.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:07:43.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:07:43.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:07:43.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:07:43.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:07:43.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:07:43.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:07:22
2026-05-28T13:07:43.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69060, datetime.datetime(2026, 5, 28, 13, 7, 22), datetime.datetime(2026, 5, 28, 13, 7, 21), 'salt', 14.07, 32.91, None, 5.9, 284.96, 16.06, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:07:43.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:07:43.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:07:43.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:21, diff=22.969297s, valid=True
2026-05-28T13:07:43.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:07:43.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:07:43.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:12, diff=31.972253s, valid=True
2026-05-28T13:07:43.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:07:43.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:20, diff=23.979111s, valid=True
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:07:43.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:07:43.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:12, diff=31.982243s, valid=True
2026-05-28T13:07:43.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:07:43.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:07:43.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:07:43.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899105.982914s, valid=True
2026-05-28T13:07:43.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:07:43.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:07:43.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:07:43.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:07:43.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:07:44.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:07:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:07:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:07:44.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:07:44.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:07:44.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:07:44.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:07:44.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:07:44.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:07:44.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:07:44.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:07:45.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:07:45.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:07:45.098 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:07:45.098 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:07:45.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:07:45.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:08:15.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:08:15.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:08:15.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:08:15.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:08:15.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:08:15.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:08:15.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:08:15.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:08:15.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-28T13:08:15.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:08:15.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:08:15.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:08:15.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-28T13:08:18.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:08:18.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:08:18.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:08:18.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:08:18.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:08:18.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:08:18.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:08:18.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:08:18.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:08:18.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:08:18.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:08:18.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:08:18.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:08:18.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:08:18.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:08:18.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:08:18.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:08:18.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:08:18.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:08:18.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:08:18.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:08:18.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:08:18.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:08:18.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:08:18.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:07:52
2026-05-28T13:08:18.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69061, datetime.datetime(2026, 5, 28, 13, 7, 52), datetime.datetime(2026, 5, 28, 13, 7, 52), 'salt', 14.14, 33.18, None, 5.37, 305.6, 15.96, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:08:18.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:08:18.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:08:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:52, diff=26.745792s, valid=True
2026-05-28T13:08:18.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:08:18.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:08:18.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:08:12, diff=6.748674s, valid=True
2026-05-28T13:08:18.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:08:18.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:07:52, diff=26.755241s, valid=True
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:08:18.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:08:18.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:08:12, diff=6.758239s, valid=True
2026-05-28T13:08:18.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:08:18.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:08:18.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:08:18.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899140.758891s, valid=True
2026-05-28T13:08:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:08:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:08:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:08:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:08:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:08:18.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:08:18.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:08:18.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:08:18.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:08:18.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:08:18.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:08:18.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:08:19.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:08:19.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:08:19.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:08:19.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:08:19.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:08:19.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:08:19.732 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:08:19.732 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:08:19.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:08:19.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:08:49.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:08:49.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:08:49.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:08:50.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:08:50.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:08:50.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:08:50.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-28T13:08:50.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:08:50.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-28T13:08:50.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:08:50.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:08:50.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:08:50.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-28T13:08:53.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-28T13:08:53.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:08:53.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:08:53.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:08:53.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:08:53.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:08:53.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:08:53.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:08:53.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:08:53.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:08:53.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:08:53.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:08:53.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:08:53.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:08:53.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:08:53.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:08:53.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:08:53.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:08:53.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:08:53.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:08:53.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:08:53.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:08:53.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:08:53.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:08:53.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:08:53
2026-05-28T13:08:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69063, datetime.datetime(2026, 5, 28, 13, 8, 53), datetime.datetime(2026, 5, 28, 13, 8, 52), 'salt', 14.3, 32.42, None, 10.94, 286.97, 16.29, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:08:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:08:53.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:08:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:08:52, diff=1.573645s, valid=True
2026-05-28T13:08:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:08:53.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:08:53.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:12, diff=-18.423456s, valid=True
2026-05-28T13:08:53.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:08:53.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:08:46, diff=7.583231s, valid=True
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:08:53.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:08:53.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:12, diff=-18.413748s, valid=True
2026-05-28T13:08:53.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:08:53.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:08:53.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:08:53.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899175.586915s, valid=True
2026-05-28T13:08:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:08:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:08:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:08:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:08:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:08:53.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:08:53.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:08:53.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:08:53.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:08:53.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:08:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:08:53.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:08:53.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:08:53.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:08:54.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:08:54.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:08:54.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:08:54.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:08:54.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-28T13:08:54.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-28T13:08:54.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:08:54.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:09:24.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:09:24.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:09:24.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:09:25.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:09:25.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:09:25.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:09:25.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-28T13:09:25.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:09:25.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-28T13:09:25.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:09:25.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:09:25.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:09:25.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-28T13:09:27.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-28T13:09:27.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:09:27.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:09:27.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:09:27.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:09:27.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:09:27.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:09:27.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:09:27.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:09:27.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:09:27.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:09:27.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:09:27.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:09:27.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:09:27.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:09:27.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:09:27.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:09:27.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:09:27.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:09:27.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:09:27.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:09:27.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:09:27.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:09:27.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:09:28.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:09:23
2026-05-28T13:09:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69064, datetime.datetime(2026, 5, 28, 13, 9, 23), datetime.datetime(2026, 5, 28, 13, 9, 22), 'salt', 14.27, 31.89, None, 12.88, 258.08, 16.51, 830.04, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:09:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:09:28.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:09:28.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:22, diff=6.033489s, valid=True
2026-05-28T13:09:28.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:09:28.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:09:28.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:12, diff=16.036335s, valid=True
2026-05-28T13:09:28.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:09:28.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:16, diff=12.043061s, valid=True
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:09:28.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:09:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:12, diff=16.046072s, valid=True
2026-05-28T13:09:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:09:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:09:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:09:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899210.046723s, valid=True
2026-05-28T13:09:28.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:09:28.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:09:28.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:09:28.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:09:28.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:09:28.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:09:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:09:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:09:28.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:09:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:09:28.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:09:28.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:09:28.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:09:28.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:09:28.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:09:28.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:09:29.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:09:29.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:09: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-28T13:09: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-28T13:09:29.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:09:29.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:09:59.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:09:59.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:09:59.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:09:59.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:09:59.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:09:59.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:09:59.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:09:59.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:09:59.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-28T13:09:59.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:09:59.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:09:59.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:09:59.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-28T13:10:02.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:10:02.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:10:02.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:10:02.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:10:02.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:10:02.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:10:02.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:10:02.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:10:02.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:10:02.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:10:02.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:10:02.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:10:02.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:10:02.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:10:02.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:10:02.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:10:02.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:10:02.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:10:02.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:10:02.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:10:02.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:10:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:10:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:10:02.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:10:02.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:09:53
2026-05-28T13:10:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69065, datetime.datetime(2026, 5, 28, 13, 9, 53), datetime.datetime(2026, 5, 28, 13, 9, 53), 'salt', 14.33, 33.38, None, 11.08, 287.44, 15.89, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:10:02.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:10:02.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:10:02.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:53, diff=9.550995s, valid=True
2026-05-28T13:10:02.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:10:02.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:10:02.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:12, diff=-9.446167s, valid=True
2026-05-28T13:10:02.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:10:02.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:09:47, diff=15.560481s, valid=True
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:10:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:10:02.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:12, diff=-9.436504s, valid=True
2026-05-28T13:10:02.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:10:02.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:10:02.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:10:02.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899244.564242s, valid=True
2026-05-28T13:10:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:10:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:10:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:10:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:10:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:10:02.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:10:02.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:10:02.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:10:02.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:10:02.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:10:02.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:10:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:10:02.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:10:02.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:10:03.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:10:03.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:10:03.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:10:03.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:10:03.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-28T13:10:03.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-28T13:10:03.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:10:03.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:10:33.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:10:33.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:10:33.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:10:34.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:10:34.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:10:34.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:10:34.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-28T13:10:34.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:10:34.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-28T13:10:34.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:10:34.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:10:34.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:10:34.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:10:36.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-28T13:10:36.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:10:36.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:10:36.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:10:36.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:10:36.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:10:36.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:10:36.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:10:36.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:10:36.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:10:36.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:10:36.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:10:36.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:10:36.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:10:36.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:10:36.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:10:36.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:10:36.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:10:36.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:10:37.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:10:37.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:10:37.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:10:37.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:10:37.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:10:37.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:10:23
2026-05-28T13:10:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69066, datetime.datetime(2026, 5, 28, 13, 10, 23), datetime.datetime(2026, 5, 28, 13, 10, 23), 'salt', 14.2, 31.72, None, 6.85, 307.63, 16.57, 830.1, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:10:37.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:10:37.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:10:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:23, diff=14.076544s, valid=True
2026-05-28T13:10:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:10:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:10:37.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:12, diff=25.079353s, valid=True
2026-05-28T13:10:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:10:37.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:19, diff=18.086111s, valid=True
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:10:37.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:10:37.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:12, diff=25.089116s, valid=True
2026-05-28T13:10:37.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:10:37.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:10:37.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:10:37.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899279.089784s, valid=True
2026-05-28T13:10:37.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:10:37.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:10:37.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:10:37.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:10:37.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:10:37.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:10:37.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:10:37.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:10:37.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:10:37.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:10:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:10:37.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:10:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:10:37.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:10:37.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:10:38.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:10:38.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:10:38.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:10:38.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-28T13:10:38.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-28T13:10:38.304 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:10:38.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:11:08.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:11:08.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:11:08.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:11:08.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:11:08.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:11:09.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:11:09.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-28T13:11:09.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:11: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-28T13:11:09.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:11:09.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:11:09.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:11:09.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-28T13:11:11.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:11:11.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:11:11.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:11:11.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:11:11.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:11:11.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:11:11.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:11:11.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:11:11.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:11:11.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:11:11.557 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:11:11.557 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:11:11.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:11:11.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:11:11.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:11:11.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:11:11.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:11:11.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:11:11.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:11:11.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:11:11.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:11:11.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:11:11.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:11:11.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:11:11.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:10:54
2026-05-28T13:11:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69067, datetime.datetime(2026, 5, 28, 13, 10, 54), datetime.datetime(2026, 5, 28, 13, 10, 53), 'salt', 14.13, 31.59, None, 8.4, 263.97, 16.62, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:11:11.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:11:11.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:11:11.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:53, diff=18.876506s, valid=True
2026-05-28T13:11:11.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:11:11.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:11:11.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:12, diff=-0.120657s, valid=True
2026-05-28T13:11:11.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:11:11.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:10:50, diff=21.886183s, valid=True
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:11:11.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:11:11.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:12, diff=-0.110776s, valid=True
2026-05-28T13:11:11.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:11:11.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:11:11.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:11:11.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899313.889881s, valid=True
2026-05-28T13:11:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:11:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:11:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:11:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:11:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:11:11.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:11:11.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:11:11.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:11:11.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:11:12.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:11:12.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:11:12.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:11:12.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:11:12.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:11:12.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:11:12.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:11:12.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:11:12.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:11:12.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-28T13:11:12.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-28T13:11:12.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:11:12.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:11:42.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:11:42.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:11:42.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:11:43.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:11:43.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:11:43.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:11:43.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:11:43.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:11:43.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-28T13:11:43.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:11:43.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:11:43.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:11:43.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-28T13:11:46.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:11:46.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:11:46.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:11:46.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:11:46.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:11:46.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:11:46.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:11:46.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:11:46.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:11:46.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:11:46.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:11:46.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:11:46.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:11:46.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:11:46.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:11:46.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:11:46.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:11:46.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:11:46.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:11:46.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:11:46.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:11:46.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:11:46.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:11:46.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:11:46.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:11:24
2026-05-28T13:11:46.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69068, datetime.datetime(2026, 5, 28, 13, 11, 24), datetime.datetime(2026, 5, 28, 13, 11, 24), 'salt', 14.17, 32.58, None, 7.24, 269.57, 16.21, 829.98, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:11:46.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:11:46.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:11:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:24, diff=22.503093s, valid=True
2026-05-28T13:11:46.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:11:46.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:11:46.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:12, diff=34.505956s, valid=True
2026-05-28T13:11:46.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:11:46.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:11:46.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:21, diff=25.512708s, valid=True
2026-05-28T13:11:46.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:11:46.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:11:46.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:11:46.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:11:46.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:11:46.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:11:46.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:12, diff=34.515751s, valid=True
2026-05-28T13:11:46.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:11:46.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:11:46.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:11:46.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899348.516409s, valid=True
2026-05-28T13:11:46.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:11:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:11:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:11:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:11:46.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:11:46.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:11:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:11:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:11:46.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:11:46.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:11:46.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:11:46.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:11:46.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:11:46.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:11:47.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:11:47.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:11:47.595 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:11:47.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:11:47.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-28T13:11:47.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-28T13:11:47.771 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:11:47.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:12:17.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:12:17.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:12: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-28T13:12:17.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:12:17.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:12:18.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:12:18.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-28T13:12:18.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:12:18.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-28T13:12:18.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:12:18.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:12:18.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:12:18.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:12:20.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-28T13:12:20.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:12:20.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:12:20.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:12:20.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:12:20.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:12:20.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:12:20.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:12:20.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:12:20.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:12:20.836 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:12:20.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:12:20.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:12:20.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:12:20.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:12:21.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:12:21.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:12:21.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:12:21.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:12:21.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:12:21.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:12:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:12:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:12:21.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:12:21.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:11:55
2026-05-28T13:12:21.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69069, datetime.datetime(2026, 5, 28, 13, 11, 55), datetime.datetime(2026, 5, 28, 13, 11, 55), 'salt', 14.07, 31.39, None, 12.21, 274.82, 16.7, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:12:21.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:12:21.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:12:21.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:55, diff=26.168318s, valid=True
2026-05-28T13:12:21.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:12:21.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:12:21.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:12, diff=9.171324s, valid=True
2026-05-28T13:12:21.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:12:21.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:11:53, diff=28.178224s, valid=True
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:12:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:12:21.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:12, diff=9.1815s, valid=True
2026-05-28T13:12:21.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:12:21.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:12:21.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:12:21.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899383.182241s, valid=True
2026-05-28T13:12:21.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:12:21.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:12:21.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:12:21.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:12:21.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:12:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:12:21.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:12:21.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:12:21.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:12:21.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:12:21.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:12:21.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:12:21.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:12:21.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:12:21.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:12:22.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:12:22.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:12:22.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:12:22.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-28T13:12:22.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-28T13:12:22.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:12:22.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:12:52.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:12:52.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:12:52.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:12:52.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:12:52.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:12:52.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:12:52.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-28T13:12:53.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:12:53.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-28T13:12:53.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:12:53.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:12:53.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:12:53.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-28T13:12:55.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-28T13:12:55.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:12:55.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:12:55.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:12:55.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:12:55.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:12:55.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:12:55.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:12:55.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:12:55.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:12:55.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:12:55.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:12:55.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:12:55.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:12:55.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:12:55.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:12:55.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:12:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:12:55.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:12:55.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:12:55.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:12:55.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:12:55.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:12:55.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:12:55.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:12:25
2026-05-28T13:12:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69070, datetime.datetime(2026, 5, 28, 13, 12, 25), datetime.datetime(2026, 5, 28, 13, 12, 25), 'salt', 13.9, 29.7, None, 12.07, 261.86, 17.42, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:12:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:12:55.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:12:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:25, diff=30.889356s, valid=True
2026-05-28T13:12:55.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:12:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:12:55.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:12, diff=43.892278s, valid=True
2026-05-28T13:12:55.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:12:55.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:24, diff=31.900509s, valid=True
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:12:55.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:12:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:12:55.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:12:12, diff=43.903676s, valid=True
2026-05-28T13:12:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:12:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:12:55.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:12:55.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899417.904345s, valid=True
2026-05-28T13:12:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:12:55.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:12:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:12:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:12:55.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:12:55.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:12:55.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:12:55.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:12:55.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:12:56.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:12:56.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:12:56.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:12:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:12:56.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:12:56.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:12:56.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:12:56.995 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:12:56.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:12:56.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-28T13:12:56.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-28T13:12:57.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:12:57.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:13:27.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:13:27.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:13:27.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:13:27.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:13:27.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:13:27.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:13:27.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-28T13:13:27.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:13:27.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:13:27.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:13:27.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:13:27.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:13:27.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-28T13:13:30.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-28T13:13:30.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:13:30.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:13:30.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:13:30.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:13:30.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:13:30.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:13:30.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:13:30.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:13:30.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:13:30.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:13:30.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:13:30.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:13:30.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:13:30.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:13:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:13:31.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:13:31.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:13:31.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:13:31.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:13:31.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:13:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:13:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:13:31.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:13:31.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:13:26
2026-05-28T13:13:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69072, datetime.datetime(2026, 5, 28, 13, 13, 26), datetime.datetime(2026, 5, 28, 13, 13, 26), 'salt', 13.87, 29.07, None, 7.48, 251.84, 17.7, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:13:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:13:31.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:13:31.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:26, diff=5.18512s, valid=True
2026-05-28T13:13:31.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:13:31.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:13:31.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:12, diff=19.188049s, valid=True
2026-05-28T13:13:31.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:13:31.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:13:31.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:19, diff=12.194855s, valid=True
2026-05-28T13:13:31.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:13:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:13:31.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:13:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:13:31.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:13:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:13:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:12, diff=19.197972s, valid=True
2026-05-28T13:13:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:13:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:13:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:13:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899453.198643s, valid=True
2026-05-28T13:13:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:13:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:13:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:13:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:13:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:13:31.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:13:31.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:13:31.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:13:31.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:13:31.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:13:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:13:31.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:13:31.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:13:31.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:13:31.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:13:32.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:13:32.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:13:32.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:13:32.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-28T13:13:32.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-28T13:13:32.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:13:32.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:14:02.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:14:02.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:14: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-28T13:14:02.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:14:02.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:14:03.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:14:03.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-28T13:14:03.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:14:03.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-28T13:14:03.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:14:03.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:14:03.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:14:03.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:14:05.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-28T13:14:05.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:14:05.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:14:05.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:14:05.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:14:05.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:14:05.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:14:05.741 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:14:05.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:14:05.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:14:05.741 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:14:05.741 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:14:05.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:14:05.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:14:05.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:14:05.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:14:05.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:14:05.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:14:05.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:14:05.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:14:05.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:14:05.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:14:05.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:14:05.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:14:06.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:13:56
2026-05-28T13:14:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69073, datetime.datetime(2026, 5, 28, 13, 13, 56), datetime.datetime(2026, 5, 28, 13, 13, 56), 'salt', 13.67, 29.3, None, 7.09, 261.74, 17.57, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:14:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:14:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:14:06.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:56, diff=10.056065s, valid=True
2026-05-28T13:14:06.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:14:06.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:14:06.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:12, diff=-5.941056s, valid=True
2026-05-28T13:14:06.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:14:06.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:14:06.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:13:49, diff=17.065636s, valid=True
2026-05-28T13:14:06.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:14:06.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:14:06.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:14:06.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:14:06.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:14:06.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:14:06.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:12, diff=-5.931282s, valid=True
2026-05-28T13:14:06.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:14:06.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:14:06.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:14:06.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899488.069424s, valid=True
2026-05-28T13:14:06.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:14:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:14:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:14:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:14:06.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:14:06.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:14:06.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:14:06.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:14:06.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:14:06.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:14:06.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:14:06.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:14:06.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:14:06.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:14:06.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:14:07.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:14:07.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:14:07.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:14:07.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-28T13:14:07.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-28T13:14:07.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:14:07.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:14:37.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:14:37.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:14:37.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:14:37.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:14:37.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:14:38.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:14:38.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-28T13:14:38.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:14:38.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-28T13:14:38.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:14:38.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:14:38.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:14:38.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-28T13:14:40.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:14:40.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:14:40.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:14:40.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:14:40.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:14:40.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:14:40.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:14:40.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:14:40.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:14:40.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:14:40.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:14:40.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:14:40.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:14:40.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:14:40.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:14:40.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:14:40.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:14:40.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:14:40.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:14:40.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:14:40.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:14:40.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:14:40.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:14:40.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:14:40.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:14:26
2026-05-28T13:14:40.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69074, datetime.datetime(2026, 5, 28, 13, 14, 26), datetime.datetime(2026, 5, 28, 13, 14, 26), 'salt', 13.8, 28.64, None, 7.59, 244.88, 17.89, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:14:40.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:14:40.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:14:40.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:26, diff=14.939961s, valid=True
2026-05-28T13:14:40.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:14:40.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:14:40.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:12, diff=28.942946s, valid=True
2026-05-28T13:14:40.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:14:40.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:14:40.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:19, diff=21.949726s, valid=True
2026-05-28T13:14:40.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:14:40.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:14:40.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:14:40.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:14:40.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:14:40.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:14:40.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:12, diff=28.952746s, valid=True
2026-05-28T13:14:40.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:14:40.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:14:40.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:14:40.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899522.95342s, valid=True
2026-05-28T13:14:40.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:14:40.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:14:40.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:14:40.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:14:40.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:14:41.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:14:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:14:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:14:41.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:14:41.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:14:41.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:14:41.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:14:41.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:14:41.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:14:41.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:14:41.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:14:41.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:14:41.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:14:41.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-28T13:14:41.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-28T13:14:42.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:14:42.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:15:12.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:15:12.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:15:12.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:15:12.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:15:12.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:15:12.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:15:12.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-28T13:15:12.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:15:12.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:15:12.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:15:12.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:15:12.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:15:12.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-28T13:15:15.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-28T13:15:15.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:15:15.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:15:15.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:15:15.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:15:15.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:15:15.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:15:15.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:15:15.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:15:15.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:15:15.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:15:15.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:15:15.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:15:15.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:15:15.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:15:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:15:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:15:15.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:15:15.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:15:15.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:15:15.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:15:15.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:15:15.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:15:15.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:15:15.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:14:57
2026-05-28T13:15:15.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69075, datetime.datetime(2026, 5, 28, 13, 14, 57), datetime.datetime(2026, 5, 28, 13, 14, 56), 'salt', 13.87, 28.44, None, 10.45, 262.09, 17.99, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:15:15.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:15:15.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:15:15.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:56, diff=19.560609s, valid=True
2026-05-28T13:15:15.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:15:15.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:15:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:12, diff=3.563445s, valid=True
2026-05-28T13:15:15.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:15:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:14:51, diff=24.570092s, valid=True
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:15:15.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:15:15.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:12, diff=3.573075s, valid=True
2026-05-28T13:15:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:15:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:15:15.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:15:15.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899557.573729s, valid=True
2026-05-28T13:15:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:15:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:15:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:15:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:15:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:15:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:15:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:15:15.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:15:15.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:15:15.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:15:15.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:15:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:15:15.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:15:15.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:15:16.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:15:16.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:15:16.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:15:16.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:15:16.591 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:15:16.591 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:15:16.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:15:16.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:15:46.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:15:46.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:15:46.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:15:47.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:15:47.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:15:47.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:15:47.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-28T13:15:47.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:15:47.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:15:47.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:15:47.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:15:47.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:15:47.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-28T13:15:49.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:15:49.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:15:49.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:15:49.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:15:49.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:15:49.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:15:49.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:15:49.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:15:49.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:15:49.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:15:49.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:15:49.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:15:49.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:15:50.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:15:50.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:15:50.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:15:50.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:15:50.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:15:50.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:15:50.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:15:50.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:15:50.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:15:50.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:15:50.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:15:50.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:15:27
2026-05-28T13:15:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69076, datetime.datetime(2026, 5, 28, 13, 15, 27), datetime.datetime(2026, 5, 28, 13, 15, 27), 'salt', 13.8, 25.42, None, 7.59, 242.58, 19.46, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:15:50.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:15:50.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:15:50.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:27, diff=23.302595s, valid=True
2026-05-28T13:15:50.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:15:50.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:15:50.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:12, diff=38.305463s, valid=True
2026-05-28T13:15:50.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:15:50.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:22, diff=28.312042s, valid=True
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:15:50.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:15:50.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:12, diff=38.315061s, valid=True
2026-05-28T13:15:50.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:15:50.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:15:50.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:15:50.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899592.315719s, valid=True
2026-05-28T13:15:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:15:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:15:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:15:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:15:50.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:15:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:15:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:15:50.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:15:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:15:50.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:15:50.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:15:50.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:15:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:15:50.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:15:50.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:15:51.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:15:51.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:15:51.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:15:51.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-28T13:15:51.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-28T13:15:51.660 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:15:51.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:16:21.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:16:21.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:16:21.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:16:22.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:16:22.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:16:22.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:16:22.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-28T13:16:22.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:16:22.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:16:22.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:16:22.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:16:22.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:16:22.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:16:25.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-28T13:16:25.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:16:25.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:16:25.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:16:25.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:16:25.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:16:25.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:16:25.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:16:25.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:16:25.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:16:25.119 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:16:25.119 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:16:25.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:16:25.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:16:25.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:16:25.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:16:25.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:16:25.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:16:25.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:16:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:16:25.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:16:25.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:16:25.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:16:25.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:16:25.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:15:57
2026-05-28T13:16:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69077, datetime.datetime(2026, 5, 28, 13, 15, 57), datetime.datetime(2026, 5, 28, 13, 15, 57), 'salt', 13.93, 26.38, None, 8.15, 244.03, 18.99, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:16:25.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:16:25.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:16:25.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:57, diff=28.457541s, valid=True
2026-05-28T13:16:25.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:16:25.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:16:25.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:16:12, diff=13.460434s, valid=True
2026-05-28T13:16:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:16:25.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:15:54, diff=31.467196s, valid=True
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:16:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:16:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:16:12, diff=13.470264s, valid=True
2026-05-28T13:16:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:16:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:16:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:16:25.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899627.470929s, valid=True
2026-05-28T13:16:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:16:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:16:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:16:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:16:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:16:25.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:16:25.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:16:25.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:16:25.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:16:25.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:16:25.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:16:25.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:16:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:16:25.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:16:26.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:16:26.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:16:26.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:16:26.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:16:26.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-28T13:16:26.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-28T13:16:26.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:16:26.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:16:56.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:16:56.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:16:56.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:16:56.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:16:56.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:16:56.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:16:56.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-28T13:16:57.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:16:57.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:16:57.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:16:57.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:16:57.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:16:57.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-28T13:17:00.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:17:00.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:17:00.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:17:00.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:17:00.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:17:00.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:17:00.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:17:00.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:17:00.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:17:00.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:17:00.028 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:17:00.028 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:17:00.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:17:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:17:00.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:17:00.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:17:00.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:17:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:17:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:17:00.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:17:00.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:17:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:17:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:17:00.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:17:00.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:16:58
2026-05-28T13:17:00.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69079, datetime.datetime(2026, 5, 28, 13, 16, 58), datetime.datetime(2026, 5, 28, 13, 16, 57), 'salt', 14.03, 30.56, None, 12.25, 254.51, 17.05, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:17:00.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:17:00.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:17:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:16:57, diff=3.366605s, valid=True
2026-05-28T13:17:00.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:17:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:17:00.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:12, diff=-11.6304s, valid=True
2026-05-28T13:17:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:17:00.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:17:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:16:57, diff=3.376603s, valid=True
2026-05-28T13:17:00.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:17:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:17:00.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:17:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:17:00.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:17:00.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:17:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:12, diff=-11.62021s, valid=True
2026-05-28T13:17:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:17:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:17:00.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:17:00.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899662.380501s, valid=True
2026-05-28T13:17:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:17:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:17:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:17:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:17:00.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:17:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:17:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:17:00.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:17:00.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:17:00.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:17:00.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:17:00.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:17:00.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:17:00.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:17:00.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:17:01.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:17:01.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:17:01.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:17:01.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-28T13:17:01.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-28T13:17:01.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:17:01.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:17:31.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:17:31.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:17:31.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:17:32.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:17:32.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:17:32.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:17:32.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-28T13:17:32.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:17:32.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-28T13:17:32.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:17:32.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:17:32.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:17:32.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-28T13:17:34.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-28T13:17:34.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:17:34.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:17:34.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:17:34.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:17:34.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:17:34.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:17:34.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:17:34.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:17:34.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:17:34.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:17:34.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:17:34.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:17:34.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:17:34.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:17:34.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:17:34.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:17:34.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:17:34.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:17:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:17:34.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:17:34.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:17:34.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:17:34.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:17:35.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:17:28
2026-05-28T13:17:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69080, datetime.datetime(2026, 5, 28, 13, 17, 28), datetime.datetime(2026, 5, 28, 13, 17, 27), 'salt', 14.07, 26.85, None, 13.09, 258.29, 18.79, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:17:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:17:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:17:35.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:27, diff=8.053066s, valid=True
2026-05-28T13:17:35.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:17:35.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:17:35.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:12, diff=23.055911s, valid=True
2026-05-28T13:17:35.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:17:35.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:21, diff=14.062457s, valid=True
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:17:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:17:35.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:12, diff=23.065517s, valid=True
2026-05-28T13:17:35.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:17:35.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:17:35.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:17:35.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899697.066176s, valid=True
2026-05-28T13:17:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:17:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:17:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:17:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:17:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:17:35.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:17:35.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:17:35.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:17:35.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:17:35.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:17:35.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:17:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:17:35.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:17:35.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:17:35.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:17:35.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:17:36.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:17:36.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:17:36.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-28T13:17:36.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-28T13:17:36.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:17:36.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:18:06.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:18:06.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:18:06.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:18:06.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:18:06.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:18:06.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:18:06.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-28T13:18:06.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:18:06.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-28T13:18:06.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:18:06.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:18:06.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:18:06.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-28T13:18:09.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-28T13:18:09.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:18:09.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:18:09.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:18:09.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:18:09.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:18:09.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:18:09.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:18:09.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:18:09.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:18:09.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:18:09.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:18:09.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:18:09.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:18:09.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:18:09.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:18:09.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:18:09.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:18:09.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:18:09.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:18:09.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:18:09.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:18:09.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:18:09.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:18:09.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:17:58
2026-05-28T13:18:09.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69081, datetime.datetime(2026, 5, 28, 13, 17, 58), datetime.datetime(2026, 5, 28, 13, 17, 58), 'salt', 13.87, 27.58, None, 11.29, 262.04, 18.4, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:18:09.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:18:09.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:18:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:58, diff=11.707026s, valid=True
2026-05-28T13:18:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:18:09.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:18:09.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:12, diff=-2.290111s, valid=True
2026-05-28T13:18:09.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:18:09.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:17:51, diff=18.716462s, valid=True
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:18:09.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:18:09.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:12, diff=-2.28052s, valid=True
2026-05-28T13:18:09.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:18:09.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:18:09.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:18:09.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899731.720141s, valid=True
2026-05-28T13:18:09.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:18:09.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:18:09.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:18:09.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:18:09.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:18:09.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:18:09.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:18:09.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:18:09.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:18:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:18:09.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:18:10.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:18:10.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:18:10.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:18:10.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:18:10.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:18:10.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:18:10.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:18:10.815 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:18:10.815 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:18:11.096 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:18:11.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:18:41.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:18:41.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:18:41.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:18:41.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:18:41.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:18:41.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:18:41.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-28T13:18:41.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:18:41.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-28T13:18:41.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:18:41.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:18:41.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:18:41.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-28T13:18:44.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-28T13:18:44.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:18:44.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:18:44.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:18:44.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:18:44.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:18:44.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:18:44.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:18:44.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:18:44.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:18:44.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:18:44.226 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:18:44.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:18:44.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:18:44.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:18:44.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:18:44.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:18:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:18:44.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:18:44.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:18:44.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:18:44.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:18:44.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:18:44.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:18:44.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:18:28
2026-05-28T13:18:44.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69082, datetime.datetime(2026, 5, 28, 13, 18, 28), datetime.datetime(2026, 5, 28, 13, 18, 28), 'salt', 14.03, 27.54, None, 9.18, 284.55, 18.44, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:18:44.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:18:44.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:18:44.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:28, diff=16.54326s, valid=True
2026-05-28T13:18:44.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:18:44.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:18:44.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:12, diff=32.546076s, valid=True
2026-05-28T13:18:44.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:18:44.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:18:44.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:21, diff=23.552737s, valid=True
2026-05-28T13:18:44.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:18:44.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:18:44.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:18:44.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:18:44.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:18:44.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:18:44.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:12, diff=32.555726s, valid=True
2026-05-28T13:18:44.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:18:44.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:18:44.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:18:44.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899766.556371s, valid=True
2026-05-28T13:18:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:18:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:18:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:18:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:18:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:18:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:18:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:18:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:18:44.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:18:44.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:18:44.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:18:44.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:18:44.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:18:44.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:18:45.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:18:45.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:18:45.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:18:45.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:18:45.548 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:18:45.548 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:18:45.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:18:45.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:19:15.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:19:15.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:19:15.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:19:16.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:19:16.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:19:16.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:19: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-28T13:19:16.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:19: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-28T13:19:16.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:19:16.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:19:16.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:19:16.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-28T13:19:18.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-28T13:19:18.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:19:18.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:19:18.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:19:18.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:19:18.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:19:18.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:19:18.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:19:18.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:19:18.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:19:18.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:19:18.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:19:18.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:19:18.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:19:18.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:19:18.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:19:18.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:19:18.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:19:18.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:19:18.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:19:18.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:19:18.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:19:18.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:19:18.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:19:19.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:18:58
2026-05-28T13:19:19.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69083, datetime.datetime(2026, 5, 28, 13, 18, 58), datetime.datetime(2026, 5, 28, 13, 18, 58), 'salt', 14.13, 28.37, None, 9.11, 321.53, 18.06, 829.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:19:19.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:19:19.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:19:19.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:58, diff=21.048189s, valid=True
2026-05-28T13:19:19.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:19:19.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:19:19.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:12, diff=7.051066s, valid=True
2026-05-28T13:19:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:19:19.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:19:19.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:18:52, diff=27.057782s, valid=True
2026-05-28T13:19:19.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:19:19.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:19:19.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:19:19.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:19:19.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:19:19.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:19:19.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:12, diff=7.06085s, valid=True
2026-05-28T13:19:19.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:19:19.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:19:19.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:19:19.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899801.061504s, valid=True
2026-05-28T13:19:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:19:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:19:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:19:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:19:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:19:19.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:19:19.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:19:19.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:19:19.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:19:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:19:19.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:19:19.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:19:19.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:19:19.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:19:19.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:19:20.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:19:20.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:19:20.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:19:20.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:19:20.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:19:20.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:19:20.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:19:50.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:19:50.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:19:50.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:19:50.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:19:51.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:19:51.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:19:51.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-28T13:19:51.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:19:51.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-28T13:19:51.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:19:51.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:19:51.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:19:51.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-28T13:19:53.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:19:53.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:19:53.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:19:53.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:19:53.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:19:53.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:19:53.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:19:53.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:19:53.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:19:53.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:19:53.792 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:19:53.792 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:19:53.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:19:53.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:19:53.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:19:53.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:19:53.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:19:54.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:19:54.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:19:54.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:19:54.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:19:54.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:19:54.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:19:54.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:19:54.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:19:29
2026-05-28T13:19:54.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69084, datetime.datetime(2026, 5, 28, 13, 19, 29), datetime.datetime(2026, 5, 28, 13, 19, 28), 'salt', 14.2, 28.07, None, 11.68, 292.66, 18.21, 829.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:19:54.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:19:54.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:19:54.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:28, diff=26.11378s, valid=True
2026-05-28T13:19:54.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:19:54.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:19:54.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:12, diff=42.116645s, valid=True
2026-05-28T13:19:54.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:19:54.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:23, diff=31.1233s, valid=True
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:19:54.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:19:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:12, diff=42.126299s, valid=True
2026-05-28T13:19:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:19:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:19:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:19:54.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899836.126945s, valid=True
2026-05-28T13:19:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:19:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:19:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:19:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:19:54.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:19:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:19:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:19:54.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:19:54.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:19:54.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:19:54.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:19:54.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:19:54.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:19:54.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:19:54.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:19:55.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:19:55.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:19:55.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:19:55.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-28T13:19:55.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-28T13:19:55.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:19:55.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:20:25.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:20:25.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:20:25.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:20:25.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:20:25.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:20:25.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:20:25.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:20:25.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:20:25.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-28T13:20:26.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:20:26.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:20:26.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:20:26.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-28T13:20:28.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-28T13:20:28.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:20:28.591 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:20:28.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:20:28.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:20:28.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:20:28.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:20:28.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:20:28.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:20:28.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:20:28.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:20:28.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:20:28.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:20:28.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:20:28.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:20:28.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:20:28.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:20:28.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:20:28.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:20:28.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:20:28.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:20:28.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:20:28.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:20:28.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:20:28.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:19:59
2026-05-28T13:20:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69085, datetime.datetime(2026, 5, 28, 13, 19, 59), datetime.datetime(2026, 5, 28, 13, 19, 58), 'salt', 14.07, 26.25, None, 9.0, 293.65, 19.09, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:20:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:20:28.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:20:28.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:58, diff=30.92468s, valid=True
2026-05-28T13:20:28.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:20:28.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:20:28.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:20:12, diff=16.927574s, valid=True
2026-05-28T13:20:28.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:20:28.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:19:55, diff=33.934299s, valid=True
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:20:28.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:20:28.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:20:12, diff=16.937334s, valid=True
2026-05-28T13:20:28.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:20:28.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:20:28.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:20:28.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899870.937993s, valid=True
2026-05-28T13:20:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:20:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:20:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:20:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:20:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:20:29.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:20:29.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:20:29.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:20:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:20:29.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:20:29.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:20:29.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:20:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:20:29.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:20:29.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:20:29.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:20:29.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:20:29.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:20:29.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-28T13:20:29.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-28T13:20:32.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:20:32.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:21:02.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:21:02.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:21:02.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:21:02.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:21:02.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:21:02.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:21:02.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-28T13:21:02.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:21:02.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-28T13:21:02.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:21:02.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:21:02.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:21:02.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-28T13:21:05.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-28T13:21:05.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:21:05.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:21:05.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:21:05.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:21:05.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:21:05.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:21:05.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:21:05.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:21:05.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:21:05.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:21:05.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:21:05.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:21:05.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:21:05.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:21:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:21:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:21:05.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:21:05.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:21:05.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:21:05.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:21:05.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:21:05.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:21:05.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:21:05.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:20:59
2026-05-28T13:21:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69087, datetime.datetime(2026, 5, 28, 13, 20, 59), datetime.datetime(2026, 5, 28, 13, 20, 59), 'salt', 14.03, 26.68, None, 7.06, 341.79, 18.86, 829.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:21:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:21:05.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:21:05.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:20:59, diff=6.710122s, valid=True
2026-05-28T13:21:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:21:05.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:21:05.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:12, diff=-6.287068s, valid=True
2026-05-28T13:21:05.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:21:05.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:20:58, diff=7.719487s, valid=True
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:21:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:21:05.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:12, diff=-6.27684s, valid=True
2026-05-28T13:21:05.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:21:05.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:21:05.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:21:05.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899907.724116s, valid=True
2026-05-28T13:21:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:21:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:21:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:21:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:21:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:21:05.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:21:05.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:21:05.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:21:05.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:21:05.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:21:05.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:21:05.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:21:06.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:21:06.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:21:06.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:21:06.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:21:06.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:21:06.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:21:06.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-28T13:21:06.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-28T13:21:06.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:21:06.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:21:36.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:21:36.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:21:36.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:21:37.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:21:37.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:21:37.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:21:37.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-28T13:21:37.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:21: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-28T13:21:37.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:21:37.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:21:37.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:21:37.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-28T13:21:39.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-28T13:21:39.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:21:39.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:21:39.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:21:39.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:21:39.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:21:39.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:21:39.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:21:39.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:21:39.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:21:39.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:21:39.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:21:39.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:21:39.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:21:39.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:21:39.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:21:39.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:21:39.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:21:39.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:21:40.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:21:40.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:21:40.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:21:40.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:21:40.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:21:40.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:21:29
2026-05-28T13:21:40.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69088, datetime.datetime(2026, 5, 28, 13, 21, 29), datetime.datetime(2026, 5, 28, 13, 21, 29), 'salt', 14.07, 28.14, None, 5.82, 343.0, 18.16, 829.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:21:40.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:21:40.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:21:40.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:29, diff=11.105051s, valid=True
2026-05-28T13:21:40.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:21:40.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:21:40.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:12, diff=28.10794s, valid=True
2026-05-28T13:21:40.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:21:40.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:29, diff=11.11499s, valid=True
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:21:40.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:21:40.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:12, diff=28.118557s, valid=True
2026-05-28T13:21:40.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:21:40.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:21:40.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:21:40.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899942.11929s, valid=True
2026-05-28T13:21:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:21:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:21:40.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:21:40.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:21:40.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:21:40.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:21:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:21:40.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:21:40.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:21:40.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:21:40.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:21:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:21:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:21:40.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:21:40.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:21:41.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:21:41.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:21:41.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:21:41.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-28T13:21:41.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-28T13:21:41.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:21:41.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:22:11.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:22:11.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:22:11.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:22:11.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:22:11.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:22:11.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:22:11.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-28T13:22:11.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:22:11.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-28T13:22:11.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:22:11.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:22:11.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:22:11.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-28T13:22:14.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-28T13:22:14.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:22:14.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:22:14.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:22:14.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:22:14.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:22:14.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:22:14.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:22:14.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:22:14.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:22:14.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:22:14.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:22:14.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:22:14.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:22:14.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:22:14.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:22:14.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:22:14.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:22:14.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:22:14.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:22:14.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:22:14.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:22:14.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:22:14.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:22:14.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:22:00
2026-05-28T13:22:14.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69089, datetime.datetime(2026, 5, 28, 13, 22), datetime.datetime(2026, 5, 28, 13, 21, 59), 'salt', 14.23, 29.46, None, 8.54, 321.1, 17.57, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:22:14.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:22:14.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:22:14.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:59, diff=15.553286s, valid=True
2026-05-28T13:22:14.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:22:14.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:22:14.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:12, diff=2.556201s, valid=True
2026-05-28T13:22:14.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:22:14.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:22:14.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:21:53, diff=21.562876s, valid=True
2026-05-28T13:22:14.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:22:14.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:22:14.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:22:14.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:22:14.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:22:14.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:22:14.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:12, diff=2.565986s, valid=True
2026-05-28T13:22:14.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:22:14.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:22:14.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:22:14.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=899976.566653s, valid=True
2026-05-28T13:22:14.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:22:14.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:22:14.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:22:14.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:22:14.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:22:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:22:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:22:14.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:22:14.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:22:14.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:22:14.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:22:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:22:14.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:22:14.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:22:15.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:22:15.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:22:15.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:22:15.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:22:15.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-28T13:22:15.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-28T13:22:15.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:22:15.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:22:45.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:22:45.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:22:45.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:22:46.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:22:46.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:22:46.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:22:46.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-28T13:22:46.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:22:46.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-28T13:22:46.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:22:46.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:22:46.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:22:46.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-28T13:22:48.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-28T13:22:48.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:22:48.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:22:48.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:22:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:22:48.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:22:48.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:22:48.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:22:48.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:22:48.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:22:48.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:22:48.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:22:48.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:22:49.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:22:49.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:22:49.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:22:49.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:22:49.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:22:49.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:22:49.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:22:49.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:22:49.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:22:49.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:22:49.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:22:49.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:22:30
2026-05-28T13:22:49.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69090, datetime.datetime(2026, 5, 28, 13, 22, 30), datetime.datetime(2026, 5, 28, 13, 22, 30), 'salt', 14.33, 29.7, None, 13.45, 265.6, 17.47, 829.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:22:49.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:22:49.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:22:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:30, diff=19.242219s, valid=True
2026-05-28T13:22:49.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:22:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:22:49.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:12, diff=37.245088s, valid=True
2026-05-28T13:22:49.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:22:49.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:22:49.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:24, diff=25.251849s, valid=True
2026-05-28T13:22:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:22:49.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:22:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:22:49.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:22:49.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:22:49.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:22:49.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:12, diff=37.254969s, valid=True
2026-05-28T13:22:49.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:22:49.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:22:49.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:22:49.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900011.255652s, valid=True
2026-05-28T13:22:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:22:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:22:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:22:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:22:49.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:22:49.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:22:49.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:22:49.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:22:49.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:22:49.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:22:49.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:22:49.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:22:49.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:22:49.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:22:49.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:22:50.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:22:50.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:22:50.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:22:50.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-28T13:22:50.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-28T13:22:50.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:22:50.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:23:20.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:23:20.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:23:20.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:23:20.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:23:20.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:23:21.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:23:21.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-28T13:23:21.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:23:21.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-28T13:23:21.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:23:21.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:23:21.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:23:21.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-28T13:23:23.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-28T13:23:23.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:23:23.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:23:23.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:23:23.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:23:23.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:23:23.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:23:23.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:23:23.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:23:23.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:23:23.719 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:23:23.719 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:23:23.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:23:23.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:23:23.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:23:23.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:23:23.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:23:23.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:23:23.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:23:23.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:23:23.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:23:23.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:23:23.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:23:23.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:23:24.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:23:00
2026-05-28T13:23:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69091, datetime.datetime(2026, 5, 28, 13, 23), datetime.datetime(2026, 5, 28, 13, 23), 'salt', 14.4, 29.83, None, 10.55, 271.93, 17.43, 829.85, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:23:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:23:24.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:23:24.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:00, diff=24.038407s, valid=True
2026-05-28T13:23:24.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:23:24.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:23:24.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:12, diff=12.041267s, valid=True
2026-05-28T13:23:24.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:23:24.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:23:24.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:22:54, diff=30.047862s, valid=True
2026-05-28T13:23:24.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:23:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:23:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:23:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:23:24.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:23:24.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:23:24.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:12, diff=12.050939s, valid=True
2026-05-28T13:23:24.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:23:24.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:23:24.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:23:24.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900046.051592s, valid=True
2026-05-28T13:23:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:23:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:23:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:23:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:23:24.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:23:24.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:23:24.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:23:24.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:23:24.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:23:24.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:23:24.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:23:24.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:23:24.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:23:24.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:23:24.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:23:25.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:23:25.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:23:25.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:23:25.108 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:23:25.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:23:25.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:23:25.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:23:55.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:23:55.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:23:55.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:23:55.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:23:55.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:23:55.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:23:55.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-28T13:23:55.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:23:55.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:23:55.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:23:55.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:23:55.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:23:55.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-28T13:23:58.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-28T13:23:58.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:23:58.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:23:58.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:23:58.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:23:58.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:23:58.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:23:58.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:23:58.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:23:58.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:23:58.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:23:58.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:23:58.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:23:58.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:23:58.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:23:58.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:23:58.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:23:58.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:23:58.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:23:58.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:23:58.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:23:58.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:23:58.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:23:58.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:23:58.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:23:30
2026-05-28T13:23:58.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69092, datetime.datetime(2026, 5, 28, 13, 23, 30), datetime.datetime(2026, 5, 28, 13, 23, 30), 'salt', 14.33, 28.01, None, 8.12, 272.36, 18.26, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:23:58.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:23:58.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:23:58.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:30, diff=28.717299s, valid=True
2026-05-28T13:23:58.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:23:58.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:23:58.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:12, diff=46.720188s, valid=True
2026-05-28T13:23:58.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:23:58.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:23:58.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:25, diff=33.72686s, valid=True
2026-05-28T13:23:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:23:58.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:23:58.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:23:58.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:23:58.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:23:58.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:23:58.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:23:12, diff=46.729871s, valid=True
2026-05-28T13:23:58.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:23:58.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:23:58.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:23:58.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900080.730529s, valid=True
2026-05-28T13:23:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:23:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:23:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:23:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:23:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:23:58.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:23:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:23:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:23:58.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:23:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:23:58.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:23:58.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:23:59.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:23:59.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:23:59.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:23:59.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:23:59.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:23:59.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:23:59.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-28T13:23:59.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-28T13:23:59.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:23:59.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:24:29.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:24:29.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:24:29.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:24:30.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:24:30.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:24:30.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:24:30.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-28T13:24:30.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:24:30.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-28T13:24:30.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:24:30.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:24:30.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:24:30.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-28T13:24:32.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-28T13:24:32.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:24:32.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:24:32.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:24:32.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:24:32.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:24:32.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:24:32.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:24:32.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:24:32.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:24:32.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:24:32.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:24:32.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:24:32.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:24:32.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:24:32.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:24:32.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:24:32.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:24:32.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:24:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:24:32.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:24:32.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:24:32.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:24:32.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:24:33.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:24:31
2026-05-28T13:24:33.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69094, datetime.datetime(2026, 5, 28, 13, 24, 31), datetime.datetime(2026, 5, 28, 13, 24, 30), 'salt', 14.33, 29.03, None, 7.17, 281.19, 17.78, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:24:33.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:24:33.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:24:33.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:24:30, diff=3.05801s, valid=True
2026-05-28T13:24:33.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:24:33.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:24:33.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:24:12, diff=21.060873s, valid=True
2026-05-28T13:24:33.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:24:33.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:24:28, diff=5.067574s, valid=True
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:24:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:24:33.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:24:33.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:24:12, diff=21.070599s, valid=True
2026-05-28T13:24:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:24:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:24:33.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:24:33.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900115.07127s, valid=True
2026-05-28T13:24:33.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:24:33.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:24:33.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:24:33.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:24:33.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:24:33.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:24:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:24:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:24:33.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:24:33.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:24:33.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:24:33.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:24:33.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:24:33.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:24:33.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:24:34.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:24:34.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:24:34.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:24:34.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-28T13:24:34.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-28T13:24:34.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:24:34.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:25:04.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:25:04.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:25:04.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:25:04.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:25:04.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:25:05.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:25:05.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-28T13:25:05.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:25:05.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:25:05.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:25:05.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:25:05.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:25:05.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-28T13:25:07.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-28T13:25:07.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:25:07.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:25:07.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:25:07.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:25:07.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:25:07.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:25:07.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:25:07.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:25:07.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:25:07.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:25:07.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:25:07.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:25:07.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:25:07.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:25:07.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:25:07.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:25:07.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:25:07.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:25:07.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:25:07.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:25:07.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:25:07.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:25:07.708 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:25:07.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:25:01
2026-05-28T13:25:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69095, datetime.datetime(2026, 5, 28, 13, 25, 1), datetime.datetime(2026, 5, 28, 13, 25, 1), 'salt', 14.2, 28.47, None, 5.33, 282.98, 18.02, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:25:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:25:07.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:25:07.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:01, diff=6.773421s, valid=True
2026-05-28T13:25:07.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:25:07.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:25:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:12, diff=-4.223762s, valid=True
2026-05-28T13:25:07.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:25:07.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:24:59, diff=8.783018s, valid=True
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:25:07.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:25:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:12, diff=-4.213953s, valid=True
2026-05-28T13:25:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:25:07.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:25:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:25:07.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900149.786716s, valid=True
2026-05-28T13:25:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:25:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:25:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:25:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:25:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:25:07.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:25:07.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:25:07.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:25:07.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:25:07.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:25:07.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:25:08.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:25:08.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:25:08.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:25:08.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:25:08.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:25:08.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:25:08.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:25:08.776 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:25:08.776 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:25:08.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:25:08.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:25:38.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:25:38.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:25:38.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:25:38.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:25:38.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:25:39.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:25:39.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-28T13:25:39.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:25:39.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-28T13:25:39.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:25:39.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:25:39.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:25:39.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-28T13:25:41.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-28T13:25:41.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:25:41.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:25:41.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:25:41.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:25:41.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:25:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:25:41.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:25:41.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:25:41.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:25:41.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:25:41.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:25:41.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:25:41.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:25:41.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:25:41.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:25:41.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:25:41.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:25:41.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:25:42.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:25:42.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:25:42.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:25:42.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:25:42.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:25:42.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:25:31
2026-05-28T13:25:42.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69096, datetime.datetime(2026, 5, 28, 13, 25, 31), datetime.datetime(2026, 5, 28, 13, 25, 31), 'salt', 14.16, 28.24, None, 6.28, 313.22, 18.12, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:25:42.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:25:42.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:25:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:31, diff=11.068907s, valid=True
2026-05-28T13:25:42.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:25:42.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:25:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:12, diff=30.071764s, valid=True
2026-05-28T13:25:42.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:25:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:30, diff=12.078317s, valid=True
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:25:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:25:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:12, diff=30.081312s, valid=True
2026-05-28T13:25:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:25:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:25:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:25:42.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900184.081974s, valid=True
2026-05-28T13:25:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:25:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:25:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:25:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:25:42.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:25:42.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:25:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:25:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:25:42.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:25:42.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:25:42.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:25:42.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:25:42.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:25:42.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:25:42.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:25:42.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:25:43.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:25:43.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:25:43.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-28T13:25:43.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-28T13:25:43.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:25:43.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:26:13.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:26:13.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:26:13.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:26:13.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:26:13.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:26:14.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:26:14.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:26:14.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:26:14.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-28T13:26:14.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:26:14.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:26:14.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:26:14.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-28T13:26:16.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-28T13:26:16.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:26:16.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:26:16.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:26:16.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:26:16.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:26:16.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:26:16.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:26:16.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:26:16.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:26:16.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:26:16.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:26:16.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:26:16.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:26:16.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:26:16.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:26:16.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:26:16.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:26:16.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:26:16.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:26:16.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:26:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:26:16.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:26:16.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:26:16.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:26:01
2026-05-28T13:26:16.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69097, datetime.datetime(2026, 5, 28, 13, 26, 1), datetime.datetime(2026, 5, 28, 13, 26, 1), 'salt', 14.1, 29.43, None, 6.35, 303.73, 17.57, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:26:16.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:26:16.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:26:16.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:01, diff=15.974768s, valid=True
2026-05-28T13:26:16.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:26:16.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:26:16.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:12, diff=4.977669s, valid=True
2026-05-28T13:26:16.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:26:16.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:25:55, diff=21.984379s, valid=True
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:26:16.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:26:16.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:12, diff=4.987437s, valid=True
2026-05-28T13:26:16.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:26:16.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:26:16.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:26:16.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900218.988107s, valid=True
2026-05-28T13:26:16.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:26:16.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:26:16.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:26:16.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:26:16.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:26:17.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:26:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:26:17.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:26:17.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:26:17.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:26:17.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:26:17.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:26:17.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:26:17.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:26:17.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:26:17.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:26:18.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:26:18.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:26:18.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-28T13:26:18.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-28T13:26:18.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:26:18.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:26:48.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:26:48.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:26:48.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:26:48.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:26:48.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:26:48.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:26:48.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-28T13:26:48.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:26:48.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-28T13:26:48.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:26:48.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:26:48.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:26:48.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-28T13:26:51.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-28T13:26:51.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:26:51.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:26:51.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:26:51.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:26:51.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:26:51.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:26:51.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:26:51.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:26:51.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:26:51.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:26:51.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:26:51.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:26:51.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:26:51.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:26:51.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:26:51.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:26:51.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:26:51.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:26:51.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:26:51.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:26:51.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:26:51.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:26:51.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:26:51.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:26:32
2026-05-28T13:26:51.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69098, datetime.datetime(2026, 5, 28, 13, 26, 32), datetime.datetime(2026, 5, 28, 13, 26, 31), 'salt', 14.07, 29.33, None, 6.07, 309.52, 17.61, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:26:51.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:26:51.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:26:51.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:31, diff=20.44205s, valid=True
2026-05-28T13:26:51.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:26:51.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:26:51.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:12, diff=39.44498s, valid=True
2026-05-28T13:26:51.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:26:51.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:26:51.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:26, diff=25.451723s, valid=True
2026-05-28T13:26:51.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:26:51.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:26:51.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:26:51.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:26:51.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:26:51.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:26:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:12, diff=39.454885s, valid=True
2026-05-28T13:26:51.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:26:51.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:26:51.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:26:51.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900253.455549s, valid=True
2026-05-28T13:26:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:26:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:26:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:26:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:26:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:26:51.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:26:51.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:26:51.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:26:51.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:26:51.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:26:51.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:26:51.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:26:51.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:26:51.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:26:52.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:26:52.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:26:52.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:26:52.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:26:52.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-28T13:26:52.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-28T13:26:52.517 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:26:52.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:27:22.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:27:22.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:27:22.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:27:23.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:27:23.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:27:23.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:27:23.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-28T13:27:23.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:27:23.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-28T13:27:23.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:27:23.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:27:23.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:27:23.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-28T13:27:26.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:27:26.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:27:26.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:27:26.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:27:26.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:27:26.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:27:26.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:27:26.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:27:26.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:27:26.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:27:26.287 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:27:26.287 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:27:26.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:27:26.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:27:26.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:27:26.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:27:26.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:27:26.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:27:26.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:27:26.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:27:26.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:27:26.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:27:26.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:27:26.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:27:26.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:27:02
2026-05-28T13:27:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69099, datetime.datetime(2026, 5, 28, 13, 27, 2), datetime.datetime(2026, 5, 28, 13, 27, 1), 'salt', 14.03, 28.3, None, 6.28, 283.02, 18.07, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:27:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:27:26.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:27:26.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:01, diff=25.644432s, valid=True
2026-05-28T13:27:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:27:26.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:27:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=14.64738s, valid=True
2026-05-28T13:27:26.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:27:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:26:56, diff=30.654165s, valid=True
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:27:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:27:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=14.657297s, valid=True
2026-05-28T13:27:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:27:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:27:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:27:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900288.657973s, valid=True
2026-05-28T13:27:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:27:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:27:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:27:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:27:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:27:26.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:27:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:27:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:27:26.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:27:26.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:27:26.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:27:26.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:27:26.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:27:27.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:27:27.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:27:27.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:27:27.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:27:27.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:27:27.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-28T13:27:27.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-28T13:27:27.915 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:27:27.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:27:57.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:27:57.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:27:57.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:27:58.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:27:58.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:27:58.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:27:58.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-28T13:27:58.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:27: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-28T13:27:58.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:27:58.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:27:58.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:27:58.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-28T13:28:00.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-28T13:28:00.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:28:00.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:28:00.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:28:00.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:28:00.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:28:00.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:28:00.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:28:00.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:28:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:28:00.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:28:00.908 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:28:00.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:28:00.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:28:00.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:28:01.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:28:01.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:28:01.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:28:01.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:28:01.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:28:01.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:28:01.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:28:01.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:28:01.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:28:01.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:27:32
2026-05-28T13:28:01.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69100, datetime.datetime(2026, 5, 28, 13, 27, 32), datetime.datetime(2026, 5, 28, 13, 27, 31), 'salt', 14.1, 27.91, None, 10.98, 238.85, 18.28, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:28:01.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:28:01.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:28:01.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:31, diff=30.221768s, valid=True
2026-05-28T13:28:01.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:28:01.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:28:01.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=49.224666s, valid=True
2026-05-28T13:28:01.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:28:01.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:27, diff=34.231363s, valid=True
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:28:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:28:01.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=49.234392s, valid=True
2026-05-28T13:28:01.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:28:01.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:28:01.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:28:01.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900323.235078s, valid=True
2026-05-28T13:28:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:28:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:28:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:28:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:28:01.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:28:01.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:28:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:28:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:28:01.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:28:01.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:28:01.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:28:01.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:28:01.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:28:01.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:28:01.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:28:02.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:28:02.260 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:28:02.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:28:02.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-28T13:28:02.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-28T13:28:02.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:28:02.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:28:32.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:28:32.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:28:32.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:28:32.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:28:32.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:28:32.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:28:32.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:28:32.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:28:32.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-28T13:28:32.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:28:32.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:28:32.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:28:32.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-28T13:28:35.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-28T13:28:35.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:28:35.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:28:35.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:28:35.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:28:35.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:28:35.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:28:35.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:28:35.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:28:35.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:28:35.493 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:28:35.493 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:28:35.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:28:35.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:28:35.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:28:35.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:28:35.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:28:35.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:28:35.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:28:35.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:28:35.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:28:35.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:28:35.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:28:35.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:28:35.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:28:33
2026-05-28T13:28:35.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69102, datetime.datetime(2026, 5, 28, 13, 28, 33), datetime.datetime(2026, 5, 28, 13, 28, 32), 'salt', 14.23, 28.24, None, 9.81, 239.15, 18.13, 829.91, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:28:35.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:28:35.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:28:35.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:28:32, diff=3.818666s, valid=True
2026-05-28T13:28:35.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:28:35.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:28:35.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=83.821612s, valid=True
2026-05-28T13:28:35.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:28:35.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:28:29, diff=6.828463s, valid=True
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:28:35.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:28:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=83.831544s, valid=True
2026-05-28T13:28:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:28:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:28:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:28:35.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900357.83222s, valid=True
2026-05-28T13:28:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:28:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:28:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:28:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:28:35.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:28:35.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:28:35.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:28:35.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:28:35.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:28:36.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:28:36.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:28:36.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:28:36.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:28:36.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:28:36.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:28:36.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:28:37.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:28:37.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:28:37.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-28T13:28:37.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-28T13:28:37.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:28:37.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:29:07.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:29:07.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:29:07.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:29:07.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:29:07.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:29:07.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:29:07.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-28T13:29:07.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:29:07.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-28T13:29:07.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:29:07.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:29:07.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:29:07.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-28T13:29:10.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-28T13:29:10.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:29:10.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:29:10.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:29:10.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:29:10.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:29:10.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:29:10.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:29:10.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:29:10.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:29:10.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:29:10.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:29:10.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:29:10.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:29:10.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:29:10.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:29:10.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:29:10.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:29:10.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:29:10.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T13:29:10.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:29:10.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:29:10.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:29:10.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:29:10.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:29:03
2026-05-28T13:29:10.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69103, datetime.datetime(2026, 5, 28, 13, 29, 3), datetime.datetime(2026, 5, 28, 13, 29, 2), 'salt', 14.26, 29.07, None, 11.79, 271.65, 17.75, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:29:10.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:29:10.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:29:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:29:02, diff=8.703591s, valid=True
2026-05-28T13:29:10.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:29:10.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:29:10.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=118.706443s, valid=True
2026-05-28T13:29:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:29:10.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:29:00, diff=10.713094s, valid=True
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:29:10.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T13:29:10.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=118.716103s, valid=True
2026-05-28T13:29:10.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:29:10.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:29:10.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:29:10.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900392.716764s, valid=True
2026-05-28T13:29:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:29:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:29:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:29:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:29:10.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:29:10.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:29:10.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:29:10.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:29:10.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:29:10.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:29:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:29:10.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:29:10.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:29:11.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:29:11.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:29:11.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:29:11.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:29:11.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:29:11.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-28T13:29:11.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-28T13:29:11.760 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:29:11.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:29:41.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:29:41.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:29:41.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:29:42.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:29:42.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:29:42.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:29:42.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-28T13:29:42.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:29:42.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-28T13:29:42.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:29:42.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:29:42.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:29: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-28T13:29:44.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-28T13:29:44.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:29:44.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:29:44.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:29:44.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:29:44.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:29:44.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:29:44.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:29:44.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:29:44.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:29:44.980 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:29:44.980 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:29:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:29:45.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:29:45.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:29:45.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:29:45.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:29:45.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:29:45.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:29:45.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:29:45.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:29:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:29:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:29:45.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:29:45.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:29:33
2026-05-28T13:29:45.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69104, datetime.datetime(2026, 5, 28, 13, 29, 33), datetime.datetime(2026, 5, 28, 13, 29, 33), 'salt', 14.13, 28.5, None, 9.64, 257.82, 18.0, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:29:45.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:29:45.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:29:45.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:29:33, diff=12.290797s, valid=True
2026-05-28T13:29:45.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:29:45.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:29:45.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=153.293654s, valid=True
2026-05-28T13:29:45.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:29:45.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:29:31, diff=14.300316s, valid=True
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:29:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:29:45.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=153.303338s, valid=True
2026-05-28T13:29:45.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:29:45.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:29:45.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:29:45.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900427.303998s, valid=True
2026-05-28T13:29:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:29:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:29:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:29:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:29:45.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:29:45.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:29:45.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:29:45.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:29:45.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:29:45.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:29:45.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:29:45.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:29:45.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:29:45.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:29:45.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:29:46.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:29:46.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:29:46.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:29:46.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:29:46.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:29:46.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:29:46.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:30:16.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:30:16.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:30:16.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:30:17.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:30:17.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:30:17.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:30:17.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-28T13:30:17.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:30:17.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-28T13:30:17.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:30:17.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:30:17.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:30:17.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-28T13:30:19.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-28T13:30:19.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:30:19.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:30:19.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:30:19.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:30:19.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:30:19.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:30:19.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:30:19.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:30:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:30:19.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:30:19.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:30:19.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:30:19.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:30:19.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:30:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:30:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:30:19.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:30:19.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:30:20.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T13:30:20.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:30:20.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:30:20.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:30:20.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:30:20.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:30:03
2026-05-28T13:30:20.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69105, datetime.datetime(2026, 5, 28, 13, 30, 3), datetime.datetime(2026, 5, 28, 13, 30, 3), 'salt', 14.13, 29.07, None, 12.28, 264.22, 17.73, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:30:20.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:30:20.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:30:20.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:30:03, diff=17.107732s, valid=True
2026-05-28T13:30:20.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:30:20.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:30:20.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=188.11083s, valid=True
2026-05-28T13:30:20.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:30:20.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:30:20.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:30:03, diff=17.117876s, valid=True
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:30:20.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T13:30:20.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=188.120978s, valid=True
2026-05-28T13:30:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:30:20.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:30:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:30:20.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900462.121666s, valid=True
2026-05-28T13:30:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:30:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:30:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:30:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:30:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:30:20.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:30:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:30:20.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:30:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:30:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:30:20.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:30:20.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:30:20.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:30:20.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:30:20.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:30:21.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:30:21.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:30:21.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:30:21.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-28T13:30:21.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-28T13:30:21.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:30:21.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:30:51.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:30:51.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:30:51.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:30:51.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:30:51.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:30:52.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:30:52.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-28T13:30:52.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:30:52.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-28T13:30:52.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:30:52.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:30:52.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:30:52.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-28T13:30:54.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-28T13:30:54.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:30:54.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:30:54.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:30:54.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:30:54.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:30:54.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:30:54.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:30:54.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:30:54.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:30:54.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:30:54.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:30:54.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:30:54.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:30:54.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:30:54.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:30:54.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:30:55.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:30:55.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:30:55.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:30:55.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:30:55.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:30:55.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:30:55.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:30:55.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:30:33
2026-05-28T13:30:55.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69106, datetime.datetime(2026, 5, 28, 13, 30, 33), datetime.datetime(2026, 5, 28, 13, 30, 33), 'salt', 14.13, 28.5, None, 13.9, 272.68, 18.0, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:30:55.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:30:55.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:30:55.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:30:33, diff=22.132815s, valid=True
2026-05-28T13:30:55.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:30:55.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:30:55.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=223.135613s, valid=True
2026-05-28T13:30:55.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:30:55.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:30:29, diff=26.142176s, valid=True
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:30:55.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:30:55.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=223.145214s, valid=True
2026-05-28T13:30:55.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:30:55.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:30:55.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:30:55.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900497.145857s, valid=True
2026-05-28T13:30:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:30:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:30:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:30:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:30:55.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:30:55.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:30:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:30:55.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:30:55.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:30:55.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:30:55.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:30:55.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:30:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:30:55.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:30:55.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:30:56.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:30:56.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:30:56.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:30:56.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-28T13:30:56.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-28T13:30:56.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:30:56.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:31:26.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:31:26.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:31:26.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:31:26.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:31:26.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:31:26.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:31:26.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-28T13:31:26.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:31:26.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-28T13:31:26.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:31:26.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:31:26.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:31:26.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-28T13:31:28.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-28T13:31:28.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:31:28.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:31:28.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:31:28.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:31:28.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:31:29.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:31:29.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:31:29.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:31:29.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:31:29.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:31:29.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:31:29.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:31:29.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:31:29.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:31:29.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:31:29.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:31:29.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:31:29.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:31:29.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:31:29.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:31:29.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:31:29.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:31:29.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:31:29.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:31:03
2026-05-28T13:31:29.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69107, datetime.datetime(2026, 5, 28, 13, 31, 3), datetime.datetime(2026, 5, 28, 13, 31, 3), 'salt', 13.97, 28.64, None, 9.95, 261.99, 17.92, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:31:29.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:31:29.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:31:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:31:03, diff=26.313357s, valid=True
2026-05-28T13:31:29.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:31:29.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:31:29.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=257.316243s, valid=True
2026-05-28T13:31:29.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:31:29.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:30:59, diff=30.322981s, valid=True
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:31:29.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:31:29.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=257.326079s, valid=True
2026-05-28T13:31:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:31:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:31:29.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:31:29.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900531.326753s, valid=True
2026-05-28T13:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:31:29.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:31:29.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:31:29.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:31:29.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:31:29.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:31:29.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:31:29.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:31:29.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:31:29.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:31:29.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:31:30.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:31:30.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:31:30.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:31:30.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-28T13:31:30.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-28T13:31:30.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:31:30.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:32:00.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:32:00.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:32:00.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:32:00.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:32:00.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:32:00.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:32:00.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-28T13:32:00.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:32:00.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-28T13:32:00.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:32:00.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:32:00.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:32: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-28T13:32:03.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-28T13:32:03.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:32:03.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:32:03.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:32:03.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:32:03.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:32:03.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:32:03.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:32:03.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:32:03.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:32:03.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:32:03.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:32:03.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:32:03.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:32:03.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:32:03.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:32:03.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:32:03.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:32:03.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:32:03.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:32:03.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:32:03.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:32:03.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:32:03.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:32:03.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:31:34
2026-05-28T13:32:03.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69108, datetime.datetime(2026, 5, 28, 13, 31, 34), datetime.datetime(2026, 5, 28, 13, 31, 33), 'salt', 14.03, 29.03, None, 9.92, 252.12, 17.74, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:32:03.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:32:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:32:03.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:31:33, diff=30.877669s, valid=True
2026-05-28T13:32:03.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:32:03.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:32:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=291.880546s, valid=True
2026-05-28T13:32:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:32:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:31:29, diff=34.887286s, valid=True
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:32:03.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:32:03.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:27:12, diff=291.890362s, valid=True
2026-05-28T13:32:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:32:03.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:32:03.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:32:03.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900565.891028s, valid=True
2026-05-28T13:32:03.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:32:03.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:32:03.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:32:03.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:32:03.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:32:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:32:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:32:03.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:32:03.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:32:04.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:32:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:32:04.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:32:04.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:32:04.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:32:04.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:32:04.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:32:04.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:32:04.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:32:04.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-28T13:32:04.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-28T13:32:04.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:32:04.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:32:34.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:32:34.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:32:34.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:32:35.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:32:35.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:32:35.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:32:35.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-28T13:32:35.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:32:35.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-28T13:32:35.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:32:35.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:32:35.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:32:35.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-28T13:32:37.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-28T13:32:37.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:32:37.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:32:37.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:32:37.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:32:37.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:32:37.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:32:37.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:32:37.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:32:37.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:32:37.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:32:37.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:32:37.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:32:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:32:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:32:38.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:32:38.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:32:38.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:32:38.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:32:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:32:38.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:32:38.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:32:38.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:32:38.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:32:38.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:32:34
2026-05-28T13:32:38.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69110, datetime.datetime(2026, 5, 28, 13, 32, 34), datetime.datetime(2026, 5, 28, 13, 32, 34), 'salt', 14.23, 28.14, None, 8.86, 234.79, 18.18, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:32:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:32:38.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:32:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:32:34, diff=4.242765s, valid=True
2026-05-28T13:32:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:32:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:32:38.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:12, diff=-33.754312s, valid=True
2026-05-28T13:32:38.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:32:38.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:32:30, diff=8.252318s, valid=True
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:32:38.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:32:38.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:12, diff=-33.744657s, valid=True
2026-05-28T13:32:38.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:32:38.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:32:38.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:32:38.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900600.256003s, valid=True
2026-05-28T13:32:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:32:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:32:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:32:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:32:38.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:32:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:32:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:32:38.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:32:38.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:32:38.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:32:38.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:32:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:32:38.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:32:38.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:32:38.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:32:39.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:32:39.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:32:39.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:32:39.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-28T13:32:39.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-28T13:32:39.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:32:39.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:33:09.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:33:09.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:33:09.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:33:09.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:33:10.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:33:10.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:33:10.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-28T13:33:10.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:33: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-28T13:33:10.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:33:10.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:33:10.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:33: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-28T13:33:12.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-28T13:33:12.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:33:12.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:33:12.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:33:12.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:33:12.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:33:12.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:33:12.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:33:12.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:33:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:33:12.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:33:12.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:33:12.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:33:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:33:12.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:33:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:33:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:33:12.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:33:12.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:33:12.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:33:12.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:33:12.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:33:12.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:33:12.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:33:12.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:33:04
2026-05-28T13:33:12.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69111, datetime.datetime(2026, 5, 28, 13, 33, 4), datetime.datetime(2026, 5, 28, 13, 33, 4), 'salt', 14.13, 28.24, None, 10.8, 232.75, 18.12, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:33:12.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:33:12.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:33:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:04, diff=8.991921s, valid=True
2026-05-28T13:33:12.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:33:12.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:33:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:12, diff=0.994742s, valid=True
2026-05-28T13:33:12.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:33:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:01, diff=12.001306s, valid=True
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:33:13.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:33:13.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:12, diff=1.004355s, valid=True
2026-05-28T13:33:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:33:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:33:13.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:33:13.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900635.005008s, valid=True
2026-05-28T13:33:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:33:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:33:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:33:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:33:13.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:33:13.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:33:13.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:33:13.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:33:13.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:33:13.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:33:13.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:33:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:33:13.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:33:13.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:33:13.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:33:13.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:33:13.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:33:13.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:33:13.983 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:33:13.983 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:33:14.146 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:33:14.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:33:44.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:33:44.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:33:44.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:33:44.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:33:44.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:33:44.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:33:44.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:33:44.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:33:44.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-28T13:33:44.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:33:44.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:33:44.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:33:44.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-28T13:33:47.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-28T13:33:47.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:33:47.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:33:47.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:33:47.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:33:47.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:33:47.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:33:47.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:33:47.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:33:47.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:33:47.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:33:47.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:33:47.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:33:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:33:47.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:33:47.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:33:47.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:33:47.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:33:47.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:33:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:33:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:33:47.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:33:47.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:33:47.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:33:47.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:33:35
2026-05-28T13:33:47.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69112, datetime.datetime(2026, 5, 28, 13, 33, 35), datetime.datetime(2026, 5, 28, 13, 33, 34), 'salt', 14.06, 29.0, None, 9.6, 234.67, 17.75, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:33:47.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:33:47.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:33:47.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:34, diff=13.435962s, valid=True
2026-05-28T13:33:47.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:33:47.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:33:47.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:12, diff=-24.56114s, valid=True
2026-05-28T13:33:47.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:33:47.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:33:47.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:33:33, diff=14.445604s, valid=True
2026-05-28T13:33:47.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:33:47.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:33:47.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:33:47.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:33:47.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:33:47.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:33:47.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:12, diff=-24.551308s, valid=True
2026-05-28T13:33:47.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:33:47.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:33:47.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:33:47.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900669.449356s, valid=True
2026-05-28T13:33:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:33:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:33:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:33:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:33:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:33:47.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:33:47.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:33:47.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:33:47.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:33:47.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:33:47.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:33:47.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:33:47.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:33:47.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:33:48.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:33:48.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:33:48.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:33:48.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:33:48.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-28T13:33:48.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-28T13:33:48.699 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:33:48.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:34:18.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:34:18.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:34:18.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:34:18.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:34:18.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:34:19.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:34:19.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-28T13:34:19.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:34:19.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-28T13:34:19.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:34:19.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:34:19.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:34:19.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-28T13:34:21.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-28T13:34:21.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:34:21.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:34:21.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:34:21.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:34:21.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:34:21.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:34:21.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:34:21.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:34:21.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:34:21.892 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:34:21.892 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:34:21.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:34:21.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:34:21.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:34:22.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:34:22.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:34:22.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:34:22.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:34:22.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:34:22.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:34:22.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:34:22.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:34:22.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:34:22.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:34:05
2026-05-28T13:34:22.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69113, datetime.datetime(2026, 5, 28, 13, 34, 5), datetime.datetime(2026, 5, 28, 13, 34, 4), 'salt', 13.87, 29.13, None, 10.23, 250.76, 17.67, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:34:22.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:34:22.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:34:22.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:04, diff=18.221346s, valid=True
2026-05-28T13:34:22.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:34:22.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:34:22.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:12, diff=10.224287s, valid=True
2026-05-28T13:34:22.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:34:22.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:34:22.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:04, diff=18.230965s, valid=True
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:34:22.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:34:22.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:12, diff=10.234011s, valid=True
2026-05-28T13:34:22.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:34:22.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:34:22.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:34:22.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900704.234675s, valid=True
2026-05-28T13:34:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:34:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:34:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:34:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:34:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:34:22.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:34:22.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:34:22.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:34:22.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:34:22.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:34:22.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:34:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:34:22.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:34:22.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:34:22.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:34:23.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:34:23.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:34:23.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:34:23.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-28T13:34:23.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-28T13:34:23.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:34:23.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:34:53.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:34:53.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:34:53.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:34:53.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:34:53.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:34:53.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:34:53.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-28T13:34:54.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:34:54.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-28T13:34:54.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:34:54.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:34:54.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:34:54.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-28T13:34:56.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-28T13:34:56.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:34:56.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:34:56.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:34:56.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:34:56.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:34:56.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:34:56.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:34:56.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:34:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:34:56.472 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:34:56.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:34:56.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:34:56.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:34:56.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:34:56.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:34:56.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:34:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:34:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:34:56.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:34:56.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:34:56.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:34:56.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:34:56.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:34:56.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:34:35
2026-05-28T13:34:56.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69114, datetime.datetime(2026, 5, 28, 13, 34, 35), datetime.datetime(2026, 5, 28, 13, 34, 35), 'salt', 13.97, 29.8, None, 14.33, 244.85, 17.39, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:34:56.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:34:56.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:34:56.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:35, diff=21.802251s, valid=True
2026-05-28T13:34:56.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:34:56.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:34:56.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:12, diff=-15.194894s, valid=True
2026-05-28T13:34:56.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:34:56.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:34:56.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:34:31, diff=25.811745s, valid=True
2026-05-28T13:34:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:34:56.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:34:56.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:34:56.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:34:56.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:34:56.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:34:56.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:12, diff=-15.185221s, valid=True
2026-05-28T13:34:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:34:56.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:34:56.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:34:56.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900738.815445s, valid=True
2026-05-28T13:34:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:34:56.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:34:56.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:34:56.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:34:56.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:34:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:34:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:34:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:34:56.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:34:57.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:34:57.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:34:57.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:34:57.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:34:57.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:34:57.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:34:57.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:34:57.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:34:57.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:34:57.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-28T13:34:57.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-28T13:34:58.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:34:58.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:35:28.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:35:28.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:35:28.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:35:28.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:35:28.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:35:28.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:35:28.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-28T13:35:28.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:35: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-28T13:35:28.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:35:28.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:35:28.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:35: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-28T13:35:31.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-28T13:35:31.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:35:31.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:35:31.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:35:31.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:35:31.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:35:31.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:35:31.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:35:31.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:35:31.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:35:31.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:35:31.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:35:31.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:35:31.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:35:31.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:35:31.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:35:31.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:35:31.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:35:31.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:35:32.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:35:32.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:35:32.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:35:32.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:35:32.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:35:32.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:35:05
2026-05-28T13:35:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69115, datetime.datetime(2026, 5, 28, 13, 35, 5), datetime.datetime(2026, 5, 28, 13, 35, 5), 'salt', 13.93, 29.6, None, 10.62, 236.1, 17.47, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:35:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:35:32.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:35:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:05, diff=27.109569s, valid=True
2026-05-28T13:35:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:35:32.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:35:32.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:12, diff=20.112446s, valid=True
2026-05-28T13:35:32.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:35:32.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:01, diff=31.119167s, valid=True
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:35:32.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:35:32.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:35:12, diff=20.12218s, valid=True
2026-05-28T13:35:32.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:35:32.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:35:32.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:35:32.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900774.122851s, valid=True
2026-05-28T13:35:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:35:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:35:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:35:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:35:32.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:35:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:35:32.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:35:32.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:35:32.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:35:32.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:35:32.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:35:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:35:32.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:35:32.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:35:32.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:35:33.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:35:33.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:35:33.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:35:33.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-28T13:35:33.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-28T13:35:33.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:35:33.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:36:03.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:36:03.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:36:03.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:36:04.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:36:04.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:36:04.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:36:04.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-28T13:36:04.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:36:04.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-28T13:36:04.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:36:04.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:36:04.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:36:04.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-28T13:36:06.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-28T13:36:06.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:36:06.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:36:06.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:36:06.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:36:06.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:36:06.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:36:06.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:36:06.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:36:06.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:36:06.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:36:06.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:36:06.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:36:06.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:36:06.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:36:06.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:36:06.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:36:07.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:36:07.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:36:07.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:36:07.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:36:07.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:36:07.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:36:07.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:36:07.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:36:06
2026-05-28T13:36:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69117, datetime.datetime(2026, 5, 28, 13, 36, 6), datetime.datetime(2026, 5, 28, 13, 36, 5), 'salt', 14.03, 29.83, None, 7.27, 243.89, 17.37, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:36:07.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:36:07.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:36:07.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:05, diff=2.126715s, valid=True
2026-05-28T13:36:07.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:36:07.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:36:07.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:12, diff=-4.870453s, valid=True
2026-05-28T13:36:07.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:36:07.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:02, diff=5.136128s, valid=True
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:36:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:36:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:12, diff=-4.860899s, valid=True
2026-05-28T13:36:07.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:36:07.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:36:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:36:07.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900809.139753s, valid=True
2026-05-28T13:36:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:36:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:36:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:36:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:36:07.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:36:07.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:36:07.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:36:07.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:36:07.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:36:07.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:36:07.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:36:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:36:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:36:07.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:36:07.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:36:08.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:36:08.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:36:08.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:36:08.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:36:08.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:36:08.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:36:08.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:36:38.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:36:38.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:36:38.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:36:38.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:36:38.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:36:38.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:36:38.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-28T13:36:38.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:36:38.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-28T13:36:39.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:36:39.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:36:39.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:36:39.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:36:41.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-28T13:36:41.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:36:41.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:36:41.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:36:41.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:36:41.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:36:41.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:36:41.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:36:41.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:36:41.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:36:41.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:36:41.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:36:41.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:36:41.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:36:41.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:36:41.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:36:41.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:36:41.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:36:41.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:36:41.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:36:41.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:36:41.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:36:41.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:36:41.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:36:41.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:36:36
2026-05-28T13:36:41.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69118, datetime.datetime(2026, 5, 28, 13, 36, 36), datetime.datetime(2026, 5, 28, 13, 36, 35), 'salt', 14.2, 30.33, None, 11.93, 216.36, 17.18, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:36:41.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:36:41.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:36:41.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:35, diff=6.786237s, valid=True
2026-05-28T13:36:41.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:36:41.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:36:41.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:12, diff=-30.210876s, valid=True
2026-05-28T13:36:41.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:36:41.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:36:41.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:36:32, diff=9.795854s, valid=True
2026-05-28T13:36:41.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:36:41.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:36:41.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:36:41.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:36:41.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:36:41.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:36:41.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:12, diff=-30.201111s, valid=True
2026-05-28T13:36:41.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:36:41.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:36:41.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:36:41.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900843.799539s, valid=True
2026-05-28T13:36:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:36:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:36:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:36:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:36:41.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:36:41.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:36:41.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:36:41.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:36:41.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:36:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:36:41.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:36:42.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:36:42.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:36:42.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:36:42.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:36:42.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:36:42.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:36:42.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:36: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-28T13:36: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-28T13:36:42.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:36:42.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:37:12.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:37:12.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:37:12.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:37:13.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:37:13.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:37:13.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:37:13.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-28T13:37:13.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:37:13.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-28T13:37:13.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:37:13.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:37:13.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:37:13.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-28T13:37:16.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:37:16.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:37:16.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:37:16.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:37:16.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:37:16.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:37:16.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:37:16.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:37:16.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:37:16.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:37:16.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:37:16.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:37:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:37:16.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:37:16.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:37:16.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:37:16.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:37:16.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:37:16.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:37:17.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:37:17.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:37:17.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:37:17.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:37:17.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:37:17.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:37:06
2026-05-28T13:37:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69119, datetime.datetime(2026, 5, 28, 13, 37, 6), datetime.datetime(2026, 5, 28, 13, 37, 6), 'salt', 14.1, 28.47, None, 10.2, 256.29, 18.01, 829.97, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:37:17.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:37:17.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:37:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:06, diff=11.074628s, valid=True
2026-05-28T13:37:17.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:37:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:37:17.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:12, diff=5.077439s, valid=True
2026-05-28T13:37:17.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:37:17.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:02, diff=15.084132s, valid=True
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:37:17.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:37:17.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:12, diff=5.087205s, valid=True
2026-05-28T13:37:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:37:17.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:37:17.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:37:17.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900879.087866s, valid=True
2026-05-28T13:37:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:37:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:37:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:37:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:37:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:37:17.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:37:17.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:37:17.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:37:17.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:37:17.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:37:17.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:37:17.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:37:17.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:37:17.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:37:17.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:37:18.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:37:18.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:37:18.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:37: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-28T13:37: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-28T13:37:18.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:37:18.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:37:48.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:37:48.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:37:48.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:37:48.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:37:48.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:37:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:37: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-28T13:37:49.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:37:49.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-28T13:37:49.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:37:49.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:37:49.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:37:49.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-28T13:37:51.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:37:51.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:37:51.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:37:51.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:37:51.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:37:51.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:37:51.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:37:51.655 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:37:51.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:37:51.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:37:51.655 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:37:51.655 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:37:51.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:37:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:37:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:37:51.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:37:51.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:37:51.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:37:51.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:37:51.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:37:51.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:37:51.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:37:51.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:37:51.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:37:51.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:37:36
2026-05-28T13:37:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69120, datetime.datetime(2026, 5, 28, 13, 37, 36), datetime.datetime(2026, 5, 28, 13, 37, 36), 'salt', 14.13, 29.7, None, 11.22, 233.24, 17.45, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:37:51.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:37:51.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:37:51.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:36, diff=15.977762s, valid=True
2026-05-28T13:37:51.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:37:51.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:37:51.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:12, diff=-20.019356s, valid=True
2026-05-28T13:37:51.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:37:51.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:37:34, diff=17.98739s, valid=True
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:37:51.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:37:51.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:12, diff=-20.009557s, valid=True
2026-05-28T13:37:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:37:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:37:51.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:37:51.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900913.991119s, valid=True
2026-05-28T13:37:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:37:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:37:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:37:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:37:51.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:37:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:37:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:37:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:37:52.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:37:52.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:37:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:37:52.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:37:52.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:37:52.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:37:52.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:37:52.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:37:53.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:37:53.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:37:53.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-28T13:37:53.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-28T13:37:53.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:37:53.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:38:23.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:38:23.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:38:23.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:38:23.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:38:23.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:38:23.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:38:23.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-28T13:38:23.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:38:23.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-28T13:38:23.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:38:23.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:38:23.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:38:23.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-28T13:38:26.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-28T13:38:26.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:38:26.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:38:26.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:38:26.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:38:26.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:38:26.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:38:26.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:38:26.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:38:26.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:38:26.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:38:26.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:38:27.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:38:27.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:38:27.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:38:27.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:38:27.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:38:27.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:38:27.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:38:27.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:38:27.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:38:27.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:38:27.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:38:27.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:38:27.299 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:38:06
2026-05-28T13:38:27.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69121, datetime.datetime(2026, 5, 28, 13, 38, 6), datetime.datetime(2026, 5, 28, 13, 38, 6), 'salt', 14.36, 31.29, None, 11.33, 255.63, 16.77, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:38:27.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:38:27.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:38:27.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:06, diff=21.305796s, valid=True
2026-05-28T13:38:27.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:38:27.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:38:27.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:12, diff=15.308674s, valid=True
2026-05-28T13:38:27.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:38:27.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:05, diff=22.31548s, valid=True
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:38:27.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:38:27.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:12, diff=15.318535s, valid=True
2026-05-28T13:38:27.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:38:27.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:38:27.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:38:27.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900949.319202s, valid=True
2026-05-28T13:38:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:38:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:38:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:38:27.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:38:27.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:38:27.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:38:27.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:38:27.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:38:27.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:38:27.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:38:27.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:38:27.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:38:27.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:38:27.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:38:27.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:38:28.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:38:28.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:38:28.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:38:28.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-28T13:38:28.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-28T13:38:28.352 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:38:28.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:38:58.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:38:58.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:38:58.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:38:58.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:38:58.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:38:59.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:38:59.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-28T13:38:59.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:38:59.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-28T13:38:59.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:38:59.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:38:59.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:38:59.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-28T13:39:01.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-28T13:39:01.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:39:01.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:39:01.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:39:01.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:39:01.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:39:01.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:39:01.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:39:01.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:39:01.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:39:01.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:39:01.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:39:01.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:39:01.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:39:01.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:39:02.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:39:02.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:39:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:39:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:39:02.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:39:02.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:39:02.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:39:02.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:39:02.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:39:02.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:38:37
2026-05-28T13:39:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69122, datetime.datetime(2026, 5, 28, 13, 38, 37), datetime.datetime(2026, 5, 28, 13, 38, 36), 'salt', 14.53, 32.18, None, 13.02, 257.72, 16.42, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:39:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:39:02.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:39:02.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:36, diff=26.160867s, valid=True
2026-05-28T13:39:02.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:39:02.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:39:02.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:12, diff=-9.835354s, valid=True
2026-05-28T13:39:02.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:39:02.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:39:02.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:38:37, diff=25.17187s, valid=True
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:39:02.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:39:02.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:12, diff=-9.824405s, valid=True
2026-05-28T13:39:02.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:39:02.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:39:02.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:39:02.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=900984.176662s, valid=True
2026-05-28T13:39:02.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:39:02.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:39:02.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:39:02.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:39:02.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:39:02.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:39:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:39:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:39:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:39:02.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:39:02.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:39:02.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:39:02.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:39:02.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:39:02.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:39:03.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:39:03.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:39:03.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:39:03.312 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:39:03.312 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:39:03.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:39:03.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:39:33.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:39:33.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:39:33.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:39:33.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:39:33.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:39:33.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:39:33.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:39:33.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:39:33.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-28T13:39:33.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:39:33.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:39:33.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:39:33.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-28T13:39:36.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-28T13:39:36.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:39:36.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:39:36.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:39:36.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:39:36.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:39:36.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:39:36.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:39:36.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:39:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:39:36.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:39:36.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:39:36.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:39:36.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:39:36.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:39:36.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:39:36.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:39:36.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:39:36.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:39:36.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:39:36.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:39:36.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:39:36.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:39:36.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:39:36.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:39:07
2026-05-28T13:39:36.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69123, datetime.datetime(2026, 5, 28, 13, 39, 7), datetime.datetime(2026, 5, 28, 13, 39, 7), 'salt', 14.63, 31.49, None, 8.75, 272.96, 16.73, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:39:36.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:39:36.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:39:36.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:07, diff=29.67219s, valid=True
2026-05-28T13:39:36.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:39:36.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:39:36.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:12, diff=24.675075s, valid=True
2026-05-28T13:39:36.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:39:36.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:39:36.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:03, diff=33.681896s, valid=True
2026-05-28T13:39:36.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:39:36.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:39:36.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:39:36.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:39:36.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:39:36.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:39:36.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:39:12, diff=24.684933s, valid=True
2026-05-28T13:39:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:39:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:39:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:39:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901018.685597s, valid=True
2026-05-28T13:39:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:39:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:39:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:39:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:39:36.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:39:36.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:39:36.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:39:36.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:39:36.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:39:36.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:39:36.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:39:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:39:36.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:39:37.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:39:37.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:39:37.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:39:37.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:39:37.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:39:37.657 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:39:37.657 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:39:37.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:39:37.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:40:07.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:40:07.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:40:07.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:40:07.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:40:07.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:40:08.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:40:08.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-28T13:40:08.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:40:08.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-28T13:40:08.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:40:08.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:40:08.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:40:08.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-28T13:40:10.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-28T13:40:10.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:40:10.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:40:10.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:40:10.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:40:10.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:40:10.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:40:10.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:40:10.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:40:10.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:40:10.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:40:10.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:40:10.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:40:10.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:40:10.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:40:10.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:40:10.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:40:10.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:40:10.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:40:10.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:40:10.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:40:10.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:40:10.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:40:10.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:40:10.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:40:07
2026-05-28T13:40:10.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69125, datetime.datetime(2026, 5, 28, 13, 40, 7), datetime.datetime(2026, 5, 28, 13, 40, 7), 'salt', 14.79, 29.53, None, 12.1, 243.23, 17.61, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:40:10.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:40:10.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:40:10.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:07, diff=3.901374s, valid=True
2026-05-28T13:40:10.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:40:10.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:40:10.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:12, diff=-1.095714s, valid=True
2026-05-28T13:40:10.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:40:10.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:40:10.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:03, diff=7.910952s, valid=True
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:40:10.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:40:10.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:12, diff=-1.085962s, valid=True
2026-05-28T13:40:10.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:40:10.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:40:10.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:40:10.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901052.914707s, valid=True
2026-05-28T13:40:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:40:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:40:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:40:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:40:10.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:40:10.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:40:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:40:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:40:11.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:40:11.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:40:11.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:40:11.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:40:11.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:40:11.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:40:11.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:40:11.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:40:11.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:40:11.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:40:11.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-28T13:40:11.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-28T13:40:12.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:40:12.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:40:42.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:40:42.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:40:42.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:40:42.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:40:42.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:40:42.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:40:42.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-28T13:40:42.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:40:42.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-28T13:40:42.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:40:42.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:40:42.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:40:42.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-28T13:40:45.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-28T13:40:45.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:40:45.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:40:45.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:40:45.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:40:45.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:40:45.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:40:45.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:40:45.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:40:45.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:40:45.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:40:45.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:40:45.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:40:45.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:40:45.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:40:45.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:40:45.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:40:45.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:40:45.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:40:45.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:40:45.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:40:45.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:40:45.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:40:45.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:40:45.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:40:38
2026-05-28T13:40:45.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69126, datetime.datetime(2026, 5, 28, 13, 40, 38), datetime.datetime(2026, 5, 28, 13, 40, 37), 'salt', 14.79, 29.56, None, 9.71, 241.0, 17.59, 830.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:40:45.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:40:45.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:40:45.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:37, diff=8.89092s, valid=True
2026-05-28T13:40:45.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:40:45.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:40:45.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:12, diff=-26.106195s, valid=True
2026-05-28T13:40:45.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:40:45.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:40:34, diff=11.900441s, valid=True
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:40:45.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:40:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:12, diff=-26.096499s, valid=True
2026-05-28T13:40:45.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:40:45.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:40:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:40:45.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901087.904168s, valid=True
2026-05-28T13:40:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:40:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:40:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:40:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:40:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:40:45.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:40:45.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:40:45.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:40:45.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:40:46.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:40:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:40:46.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:40:46.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:40:46.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:40:46.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:40:46.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:40:46.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:40:46.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:40:46.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-28T13:40:46.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-28T13:40:47.102 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:40:47.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:41:17.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:41:17.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:41:17.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:41:17.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:41:17.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:41:17.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:41:17.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-28T13:41:17.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:41:17.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-28T13:41:17.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:41:17.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:41:17.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:41:17.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-28T13:41:20.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:41:20.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:41:20.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:41:20.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:41:20.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:41:20.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:41:20.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:41:20.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:41:20.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:41:20.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:41:20.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:41:20.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:41:20.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:41:20.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:41:20.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:41:20.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:41:20.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:41:20.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:41:20.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:41:20.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:41:20.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:41:20.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:41:20.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:41:20.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:41:20.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:41:08
2026-05-28T13:41:20.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69127, datetime.datetime(2026, 5, 28, 13, 41, 8), datetime.datetime(2026, 5, 28, 13, 41, 7), 'salt', 14.53, 29.53, None, 7.45, 251.08, 17.58, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:41:20.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:41:20.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:41:20.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:07, diff=13.544602s, valid=True
2026-05-28T13:41:20.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:41:20.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:41:20.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:12, diff=8.547471s, valid=True
2026-05-28T13:41:20.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:41:20.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:04, diff=16.554157s, valid=True
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:41:20.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:41:20.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:12, diff=8.557211s, valid=True
2026-05-28T13:41:20.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:41:20.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:41:20.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:41:20.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901122.557867s, valid=True
2026-05-28T13:41:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:41:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:41:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:41:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:41:20.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:41:20.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:41:20.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:41:20.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:41:20.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:41:20.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:41:20.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:41:20.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:41:20.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:41:20.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:41:21.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:41:21.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:41:21.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:41:21.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:41:21.518 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:41:21.518 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:41:21.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:41:21.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:41:51.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:41:51.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:41:51.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:41:52.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:41:52.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:41:52.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:41:52.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:41:52.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:41:52.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-28T13:41:52.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:41:52.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:41:52.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:41:52.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-28T13:41:54.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-28T13:41:54.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:41:54.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:41:54.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:41:54.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:41:54.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:41:54.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:41:54.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:41:54.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:41:54.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:41:54.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:41:54.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:41:54.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:41:54.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:41:54.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:41:55.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:41:55.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:41:55.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:41:55.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:41:55.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:41:55.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:41:55.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:41:55.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:41:55.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:41:55.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:41:38
2026-05-28T13:41:55.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69128, datetime.datetime(2026, 5, 28, 13, 41, 38), datetime.datetime(2026, 5, 28, 13, 41, 38), 'salt', 14.53, 28.14, None, 7.2, 266.79, 18.22, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:41:55.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:41:55.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:41:55.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:38, diff=17.184559s, valid=True
2026-05-28T13:41:55.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:41:55.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:41:55.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:12, diff=-16.812547s, valid=True
2026-05-28T13:41:55.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:41:55.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:41:34, diff=21.194231s, valid=True
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:41:55.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:41:55.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:12, diff=-16.80275s, valid=True
2026-05-28T13:41:55.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:41:55.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:41:55.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:41:55.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901157.197912s, valid=True
2026-05-28T13:41:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:41:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:41:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:41:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:41:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:41:55.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:41:55.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:41:55.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:41:55.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:41:55.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:41:55.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:41:55.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:41:55.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:41:55.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:41:55.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:41:56.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:41:56.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:41:56.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:41:56.215 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:41: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-28T13:41:56.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:41:56.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:42:26.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:42:26.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:42:26.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:42:26.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:42:26.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:42:27.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:42:27.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:42:27.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:42:27.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-28T13:42:27.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:42:27.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:42:27.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:42:27.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:42:29.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-28T13:42:29.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:42:29.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:42:29.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:42:29.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:42:29.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:42:29.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:42:29.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:42:29.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:42:29.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:42:29.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:42:29.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:42:29.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:42:29.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:42:29.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:42:29.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:42:29.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:42:30.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:42:30.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:42:30.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:42:30.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:42:30.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:42:30.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:42:30.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:42:30.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:42:08
2026-05-28T13:42:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69129, datetime.datetime(2026, 5, 28, 13, 42, 8), datetime.datetime(2026, 5, 28, 13, 42, 8), 'salt', 14.36, 29.76, None, 8.58, 292.61, 17.45, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:42:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:42:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:42:30.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:08, diff=22.156823s, valid=True
2026-05-28T13:42:30.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:42:30.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:42:30.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:12, diff=18.160018s, valid=True
2026-05-28T13:42:30.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:42:30.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:06, diff=24.167456s, valid=True
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:42:30.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:42:30.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:12, diff=18.170835s, valid=True
2026-05-28T13:42:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:42:30.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:42:30.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:42:30.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901192.171558s, valid=True
2026-05-28T13:42:30.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:42:30.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:42:30.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:42:30.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:42:30.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:42:30.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:42:30.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:42:30.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:42:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:42:30.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:42:30.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:42:30.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:42:30.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:42:30.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:42:30.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:42:31.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:42:31.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:42:31.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:42:31.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-28T13:42:31.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-28T13:42:31.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:42:31.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:43:01.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:43:01.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:43:01.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:43:01.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:43:01.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:43:01.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:43:01.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-28T13:43:01.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:43:01.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-28T13:43:01.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:43:01.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:43:01.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:43:01.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-28T13:43:04.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-28T13:43:04.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:43:04.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:43:04.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:43:04.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:43:04.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:43:04.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:43:04.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:43:04.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:43:04.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:43:04.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:43:04.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:43:04.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:43:04.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:43:04.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:43:04.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:43:04.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:43:04.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:43:04.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:43:04.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:43:04.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:43:04.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:43:04.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:43:04.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:43:04.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:42:38
2026-05-28T13:43:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69130, datetime.datetime(2026, 5, 28, 13, 42, 38), datetime.datetime(2026, 5, 28, 13, 42, 38), 'salt', 14.33, 29.17, None, 7.77, 281.58, 17.72, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:43:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:43:04.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:43:04.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:38, diff=26.83657s, valid=True
2026-05-28T13:43:04.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:43:04.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:43:04.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:43:12, diff=-7.160566s, valid=True
2026-05-28T13:43:04.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:43:04.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:42:37, diff=27.846146s, valid=True
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:43:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:43:04.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:43:12, diff=-7.1508s, valid=True
2026-05-28T13:43:04.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:43:04.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:43:04.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:43:04.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901226.849906s, valid=True
2026-05-28T13:43:04.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:43:04.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:43:04.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:43:04.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:43:04.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:43:04.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:43:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:43:04.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:43:04.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:43:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:43:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:43:05.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:43:05.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:43:05.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:43:05.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:43:05.793 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:43:05.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:43:05.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:43:05.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-28T13:43:05.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-28T13:43:05.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:43:05.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:43:35.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:43:35.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:43:35.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:43:36.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:43:36.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:43:36.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:43:36.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-28T13:43:36.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:43:36.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-28T13:43:36.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:43:36.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:43:36.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:43:36.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-28T13:43:38.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-28T13:43:38.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:43:38.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:43:38.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:43:38.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:43:38.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:43:38.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:43:38.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:43:38.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:43:38.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:43:38.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:43:38.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:43:38.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:43:39.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:43:39.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:43:39.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:43:39.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:43:39.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:43:39.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:43:39.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:43:39.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:43:39.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:43:39.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:43:39.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:43:39.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:43:39
2026-05-28T13:43:39.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69132, datetime.datetime(2026, 5, 28, 13, 43, 39), datetime.datetime(2026, 5, 28, 13, 43, 38), 'salt', 14.23, 28.67, None, 1.41, 228.34, 17.93, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:43:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:43:39.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:43:39.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:43:38, diff=1.253018s, valid=True
2026-05-28T13:43:39.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:43:39.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:43:39.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:12, diff=-32.744105s, valid=True
2026-05-28T13:43:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:43:39.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:43:39.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:43:35, diff=4.262681s, valid=True
2026-05-28T13:43:39.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:43:39.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:43:39.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:43:39.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:43:39.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:43:39.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:43:39.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:12, diff=-32.734336s, valid=True
2026-05-28T13:43:39.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:43:39.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:43:39.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:43:39.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901261.266365s, valid=True
2026-05-28T13:43:39.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:43:39.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:43:39.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:43:39.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:43:39.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:43:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:43:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:43:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:43:39.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:43:39.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:43:39.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:43:39.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:43:39.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:43:39.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:43:39.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:43:40.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:43:40.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:43:40.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:43:40.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-28T13:43:40.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-28T13:43:40.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:43:40.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:44:10.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:44:10.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:44: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-28T13:44:10.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:44:10.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:44:10.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:44:10.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:44:10.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:44:10.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-28T13:44:10.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:44:10.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:44:10.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:44:10.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:44:13.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:44:13.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:44:13.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:44:13.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:44:13.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:44:13.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:44:13.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:44:13.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:44:13.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:44:13.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:44:13.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:44:13.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:44:13.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:44:13.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:44:13.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:44:13.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:44:13.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:44:13.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:44:13.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:44:14.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:44:14.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:44:14.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:44:14.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:44:14.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:44:14.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:44:09
2026-05-28T13:44:14.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69133, datetime.datetime(2026, 5, 28, 13, 44, 9), datetime.datetime(2026, 5, 28, 13, 44, 9), 'salt', 14.4, 29.17, None, 4.03, 242.4, 17.73, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:44:14.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:44:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:44:14.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:09, diff=5.06927s, valid=True
2026-05-28T13:44:14.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:44:14.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:44:14.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:12, diff=2.072075s, valid=True
2026-05-28T13:44:14.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:44:14.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:05, diff=9.078571s, valid=True
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:44:14.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:44:14.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:44:14.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:12, diff=2.081607s, valid=True
2026-05-28T13:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:44:14.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:44:14.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901296.082274s, valid=True
2026-05-28T13:44:14.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:44:14.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:44:14.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:44:14.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:44:14.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:44:14.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:44:14.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:44:14.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:44:14.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:44:14.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:44:14.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:44:14.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:44:14.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:44:14.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:44:14.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:44:15.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:44:15.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:44:15.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:44:15.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-28T13:44:15.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-28T13:44:15.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:44:15.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:44:45.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:44:45.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:44:45.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:44:45.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:44:45.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:44:45.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:44:45.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-28T13:44:45.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:44:45.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-28T13:44:45.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:44:45.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:44:45.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:44:45.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-28T13:44:48.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-28T13:44:48.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:44:48.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:44:48.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:44:48.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:44:48.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:44:48.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:44:48.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:44:48.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:44:48.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:44:48.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:44:48.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:44:48.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:44:48.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:44:48.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:44:48.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:44:48.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:44:48.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:44:48.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:44:48.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:44:48.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:44:48.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:44:48.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:44:48.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:44:48.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:44:40
2026-05-28T13:44:48.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69134, datetime.datetime(2026, 5, 28, 13, 44, 40), datetime.datetime(2026, 5, 28, 13, 44, 39), 'salt', 14.5, 29.5, None, 7.41, 238.35, 17.59, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:44:48.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:44:48.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:44:48.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:39, diff=9.597554s, valid=True
2026-05-28T13:44:48.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:44:48.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:44:48.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:12, diff=-23.399577s, valid=True
2026-05-28T13:44:48.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:44:48.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:44:36, diff=12.607099s, valid=True
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:44:48.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:44:48.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:12, diff=-23.389843s, valid=True
2026-05-28T13:44:48.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:44:48.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:44:48.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:44:48.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901330.610828s, valid=True
2026-05-28T13:44:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:44:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:44:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:44:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:44:48.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:44:48.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:44:48.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:44:48.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:44:48.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:44:48.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:44:48.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:44:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:44:49.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:44:49.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:44:49.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:44:49.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:44:49.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:44:49.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:44:49.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-28T13:44:49.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-28T13:44:49.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:44:49.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:45:20.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:45:20.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:45:20.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:45:20.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:45:20.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:45:20.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:45:20.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-28T13:45:20.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:45:20.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:45:20.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:45:20.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:45:20.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:45:20.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-28T13:45:23.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-28T13:45:23.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:45:23.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:45:23.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:45:23.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:45:23.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:45:23.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:45:23.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:45:23.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:45:23.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:45:23.340 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:45:23.340 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:45:23.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:45:23.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:45:23.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:45:23.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:45:23.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:45:23.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:45:23.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:45:23.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:45:23.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:45:23.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:45:23.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:45:23.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:45:23.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:45:10
2026-05-28T13:45:23.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69135, datetime.datetime(2026, 5, 28, 13, 45, 10), datetime.datetime(2026, 5, 28, 13, 45, 9), 'salt', 14.43, 29.07, None, 7.66, 233.77, 17.78, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:45:23.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:45:23.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:45:23.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:09, diff=14.667558s, valid=True
2026-05-28T13:45:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:45:23.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:45:23.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:12, diff=11.670411s, valid=True
2026-05-28T13:45:23.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:45:23.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:06, diff=17.677101s, valid=True
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:45:23.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:45:23.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:12, diff=11.680181s, valid=True
2026-05-28T13:45:23.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:45:23.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:45:23.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:45:23.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901365.680851s, valid=True
2026-05-28T13:45:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:45:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:45:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:45:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:45:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:45:23.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:45:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:45:23.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:45:23.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:45:23.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:45:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:45:23.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:45:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:45:24.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:45:24.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:45:24.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:45:24.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:45:24.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:45:24.718 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:45:24.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:45:26.509 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:45:26.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:45:56.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:45:56.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:45:56.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:45:57.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:45:57.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:45:57.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:45:57.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-28T13:45:57.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:45:57.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-28T13:45:57.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:45:57.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:45:57.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:45:57.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-28T13:45:59.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-28T13:45:59.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:45:59.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:45:59.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:45:59.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:45:59.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:45:59.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:45:59.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:45:59.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:45:59.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:45:59.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:45:59.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:45:59.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:46:00.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:46:00.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:46:00.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:46:00.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:46:00.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:46:00.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:46:00.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:46:00.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:46:00.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:46:00.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:46:00.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:46:00.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:45:40
2026-05-28T13:46:00.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69136, datetime.datetime(2026, 5, 28, 13, 45, 40), datetime.datetime(2026, 5, 28, 13, 45, 40), 'salt', 14.26, 28.24, None, 6.5, 224.18, 18.14, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:46:00.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:46:00.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:46:00.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:40, diff=20.253329s, valid=True
2026-05-28T13:46:00.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:46:00.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:46:00.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:12, diff=-11.743836s, valid=True
2026-05-28T13:46:00.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:46:00.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:46:00.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:45:36, diff=24.262787s, valid=True
2026-05-28T13:46:00.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:46:00.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:46:00.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:46:00.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:46:00.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:46:00.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:46:00.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:12, diff=-11.734239s, valid=True
2026-05-28T13:46:00.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:46:00.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:46:00.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:46:00.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901402.266421s, valid=True
2026-05-28T13:46:00.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:46:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:46:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:46:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:46:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:46:00.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:46:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:46:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:46:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:46:00.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:46:00.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:46:00.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:46:00.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:46:00.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:46:00.795 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:46:01.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:46:01.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:46:01.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:46:01.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-28T13:46:01.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-28T13:46:01.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:46:01.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:46:31.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:46:31.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:46:31.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:46:31.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:46:31.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:46:31.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:46:31.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-28T13:46:31.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:46:31.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-28T13:46:31.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:46:31.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:46:31.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:46:31.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-28T13:46:34.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-28T13:46:34.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:46:34.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:46:34.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:46:34.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:46:34.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:46:34.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:46:34.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:46:34.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:46:34.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:46:34.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:46:34.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:46:34.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:46:34.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:46:34.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:46:35.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:46:35.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:46:35.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:46:35.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:46:35.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:46:35.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:46:35.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:46:35.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:46:35.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:46:35.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:46:10
2026-05-28T13:46:35.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69137, datetime.datetime(2026, 5, 28, 13, 46, 10), datetime.datetime(2026, 5, 28, 13, 46, 10), 'salt', 14.23, 30.06, None, 5.23, 227.68, 17.3, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:46:35.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:46:35.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:46:35.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:10, diff=25.150396s, valid=True
2026-05-28T13:46:35.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:46:35.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:46:35.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:12, diff=23.153282s, valid=True
2026-05-28T13:46:35.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:46:35.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:46:35.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:07, diff=28.159975s, valid=True
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:46:35.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:46:35.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:12, diff=23.162958s, valid=True
2026-05-28T13:46:35.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:46:35.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:46:35.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:46:35.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901437.163606s, valid=True
2026-05-28T13:46:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:46:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:46:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:46:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:46:35.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:46:35.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:46:35.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:46:35.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:46:35.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:46:35.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:46:35.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:46:35.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:46:35.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:46:35.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:46:35.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:46:36.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:46:36.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:46:36.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:46:36.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-28T13:46:36.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-28T13:46:36.406 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:46:36.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:47:06.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:47:06.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:47:06.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:47:06.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:47:06.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:47:07.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:47:07.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-28T13:47:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:47: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-28T13:47:07.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:47:07.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:47:07.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:47:07.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-28T13:47:09.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-28T13:47:09.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:47:09.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:47:09.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:47:09.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:47:09.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:47:09.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:47:09.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:47:09.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:47:09.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:47:09.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:47:09.532 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:47:09.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:47:09.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:47:09.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:47:09.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:47:09.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:47:09.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:47:09.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:47:09.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:47:09.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:47:09.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:47:09.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:47:09.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:47:09.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:46:40
2026-05-28T13:47:09.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69138, datetime.datetime(2026, 5, 28, 13, 46, 40), datetime.datetime(2026, 5, 28, 13, 46, 40), 'salt', 14.4, 30.89, None, 4.31, 251.95, 16.96, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:47:09.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:47:09.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:47:09.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:40, diff=29.850614s, valid=True
2026-05-28T13:47:09.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:47:09.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:47:09.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:47:12, diff=-2.146201s, valid=True
2026-05-28T13:47:09.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:47:09.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:47:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:46:39, diff=30.860639s, valid=True
2026-05-28T13:47:09.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:47:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:47:09.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:47:09.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:47:09.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:47:09.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:47:09.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:47:12, diff=-2.136256s, valid=True
2026-05-28T13:47:09.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:47:09.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:47:09.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:47:09.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901471.864413s, valid=True
2026-05-28T13:47:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:47:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:47:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:47:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:47:09.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:47:09.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:47:09.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:47:09.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:47:09.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:47:10.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:47:10.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:47:10.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:47:10.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:47:10.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:47:10.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:47:10.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:47:10.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:47:10.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:47:10.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-28T13:47:10.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-28T13:47:11.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:47:11.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:47:41.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:47:41.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:47:41.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:47:41.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:47:41.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:47:41.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:47:41.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-28T13:47:41.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:47:41.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-28T13:47:41.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:47:41.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:47:41.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:47:41.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-28T13:47:44.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-28T13:47:44.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:47:44.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:47:44.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:47:44.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:47:44.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:47:44.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:47:44.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:47:44.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:47:44.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:47:44.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:47:44.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:47:44.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:47:44.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:47:44.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:47:44.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:47:44.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:47:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:47:44.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:47:44.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:47:44.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:47:44.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:47:44.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:47:44.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:47:44.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:47:41
2026-05-28T13:47:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69140, datetime.datetime(2026, 5, 28, 13, 47, 41), datetime.datetime(2026, 5, 28, 13, 47, 40), 'salt', 14.4, 30.89, None, 4.31, 251.95, 16.96, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:47:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:47:44.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:47:44.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:47:40, diff=4.850178s, valid=True
2026-05-28T13:47:44.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:47:44.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:47:44.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:12, diff=-27.146974s, valid=True
2026-05-28T13:47:44.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:47:44.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:47:38, diff=6.859595s, valid=True
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:47:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:47:44.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:47:44.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:12, diff=-27.137433s, valid=True
2026-05-28T13:47:44.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:47:44.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:47:44.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:47:44.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901506.863241s, valid=True
2026-05-28T13:47:44.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:47:44.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:47:44.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:47:44.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:47:44.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:47:44.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:47:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:47:44.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:47:44.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:47:45.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:47:45.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:47:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:47:45.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:47:45.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:47:45.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:47:45.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:47:45.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:47:45.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:47:45.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-28T13:47:45.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-28T13:47:46.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:47:46.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:48:16.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:48:16.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:48:16.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:48:16.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:48:16.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:48:16.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:48:16.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-28T13:48:16.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:48:16.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-28T13:48:16.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:48:16.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:48:16.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:48:16.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-28T13:48:19.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-28T13:48:19.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:48:19.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:48:19.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:48:19.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:48:19.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:48:19.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:48:19.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:48:19.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:48:19.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:48:19.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:48:19.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:48:19.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:48:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:48:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:48:19.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:48:19.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:48:19.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:48:19.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:48:19.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:48:19.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:48:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:48:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:48:19.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:48:19.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:48:11
2026-05-28T13:48:19.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69141, datetime.datetime(2026, 5, 28, 13, 48, 11), datetime.datetime(2026, 5, 28, 13, 48, 11), 'salt', 14.36, 30.03, None, 7.2, 246.97, 17.33, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:48:19.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:48:19.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:48:19.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:11, diff=8.622085s, valid=True
2026-05-28T13:48:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:48:19.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:48:19.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:12, diff=7.624902s, valid=True
2026-05-28T13:48:19.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:48:19.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:48:19.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:08, diff=11.631632s, valid=True
2026-05-28T13:48:19.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:48:19.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:48:19.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:48:19.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:48:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:48:19.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:48:19.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:12, diff=7.634665s, valid=True
2026-05-28T13:48:19.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:48:19.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:48:19.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:48:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901541.635339s, valid=True
2026-05-28T13:48:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:48:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:48:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:48:19.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:48:19.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:48:19.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:48:19.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:48:19.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:48:19.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:48:19.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:48:19.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:48:19.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:48:19.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:48:19.968 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:48:20.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:48:20.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:48:20.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:48:20.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:48:20.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-28T13:48:20.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-28T13:48:20.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:48:20.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:48:50.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:48:50.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:48:50.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:48:50.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:48:50.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:48:51.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:48:51.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-28T13:48:51.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:48:51.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-28T13:48:51.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:48:51.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:48:51.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:48:51.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-28T13:48:53.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-28T13:48:53.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:48:53.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:48:53.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:48:53.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:48:53.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:48:53.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:48:53.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:48:53.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:48:53.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:48:53.742 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:48:53.743 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:48:53.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:48:53.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:48:53.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:48:53.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:48:53.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:48:53.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:48:53.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:48:53.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:48:53.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:48:53.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:48:53.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:48:53.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:48:54.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:48:41
2026-05-28T13:48:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69142, datetime.datetime(2026, 5, 28, 13, 48, 41), datetime.datetime(2026, 5, 28, 13, 48, 41), 'salt', 14.46, 30.13, None, 6.25, 234.62, 17.3, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:48:54.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:48:54.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:48:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:41, diff=13.056307s, valid=True
2026-05-28T13:48:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:48:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:48:54.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:12, diff=-17.94082s, valid=True
2026-05-28T13:48:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:48:54.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:48:54.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:48:38, diff=16.072854s, valid=True
2026-05-28T13:48:54.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:48:54.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:48:54.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:48:54.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:48:54.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:48:54.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:48:54.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:12, diff=-17.924117s, valid=True
2026-05-28T13:48:54.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:48:54.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:48:54.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:48:54.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901576.076532s, valid=True
2026-05-28T13:48:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:48:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:48:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:48:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:48:54.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:48:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:48:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:48:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:48:54.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:48:54.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:48:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:48:54.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:48:54.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:48:54.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:48:54.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:48:54.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:48:55.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:48:55.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:48:55.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-28T13:48:55.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-28T13:48:55.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:48:55.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:49:25.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:49:25.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:49:25.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:49:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:49:25.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:49:25.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:49:25.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:49:25.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:49:25.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:49:26.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:49:26.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:49:26.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:49:26.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-28T13:49:28.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-28T13:49:28.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:49:28.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:49:28.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:49:28.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:49:28.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:49:28.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:49:28.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:49:28.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:49:28.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:49:28.466 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:49:28.466 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:49:28.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:49:28.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:49:28.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:49:28.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:49:28.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:49:28.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:49:28.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:49:28.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:49:28.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:49:28.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:49:28.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:49:28.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:49:28.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:49:11
2026-05-28T13:49:28.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69143, datetime.datetime(2026, 5, 28, 13, 49, 11), datetime.datetime(2026, 5, 28, 13, 49, 11), 'salt', 14.39, 27.61, None, 5.08, 211.12, 18.45, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:49:28.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:49:28.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:49:28.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:11, diff=17.787813s, valid=True
2026-05-28T13:49:28.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:49:28.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:49:28.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:12, diff=16.790628s, valid=True
2026-05-28T13:49:28.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:49:28.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:08, diff=20.797214s, valid=True
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:49:28.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:49:28.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:12, diff=16.800258s, valid=True
2026-05-28T13:49:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:49:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:49:28.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:49:28.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901610.800926s, valid=True
2026-05-28T13:49:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:49:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:49:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:49:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:49:28.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:49:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:49:28.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:49:28.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:49:28.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:49:28.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:49:29.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:49:29.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:49:29.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:49:29.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:49:29.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:49:29.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:49:29.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:49:29.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:49:29.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-28T13:49:29.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-28T13:49:29.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:49:29.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:49:59.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:49:59.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:49:59.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:50:00.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:50:00.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:50:00.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:50:00.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-28T13:50:00.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:50:00.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-28T13:50:00.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:50:00.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:50:00.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:50:00.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-28T13:50:03.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-28T13:50:03.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:50:03.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:50:03.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:50:03.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:50:03.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:50:03.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:50:03.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:50:03.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:50:03.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:50:03.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:50:03.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:50:03.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:50:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:50:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:50:03.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:50:03.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:50:03.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:50:03.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:50:03.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:50:03.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:50:03.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:50:03.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:50:03.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:50:03.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:49:41
2026-05-28T13:50:03.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69144, datetime.datetime(2026, 5, 28, 13, 49, 41), datetime.datetime(2026, 5, 28, 13, 49, 41), 'salt', 14.3, 27.94, None, 2.3, 278.86, 18.29, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:50:03.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:50:03.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:50:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:41, diff=22.413218s, valid=True
2026-05-28T13:50:03.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:50:03.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:50:03.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:12, diff=-8.583966s, valid=True
2026-05-28T13:50:03.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:50:03.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:49:39, diff=24.422527s, valid=True
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:50:03.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:50:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:50:03.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:12, diff=-8.574427s, valid=True
2026-05-28T13:50:03.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:50:03.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:50:03.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:50:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901645.426241s, valid=True
2026-05-28T13:50:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:50:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:50:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:50:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:50:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:50:03.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:50:03.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:50:03.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:50:03.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:50:03.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:50:03.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:50:03.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:50:03.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:50:03.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:50:03.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:50:04.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:50:04.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:50:04.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:50:04.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-28T13:50:04.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-28T13:50:04.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:50:04.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:50:34.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:50:34.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:50:34.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:50:34.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:50:34.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:50:34.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:50:34.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-28T13:50:34.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:50:34.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-28T13:50:34.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:50:34.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:50:34.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:50:34.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:50:37.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:50:37.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:50:37.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:50:37.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:50:37.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:50:37.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:50:37.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:50:37.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:50:37.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:50:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:50:37.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:50:37.267 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:50:37.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:50:37.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:50:37.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:50:37.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:50:37.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:50:37.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:50:37.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:50:37.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:50:37.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:50:37.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:50:37.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:50:37.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:50:37.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:50:12
2026-05-28T13:50:37.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69145, datetime.datetime(2026, 5, 28, 13, 50, 12), datetime.datetime(2026, 5, 28, 13, 50, 11), 'salt', 14.43, 30.56, None, 5.97, 225.24, 17.11, 830.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:50:37.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:50:37.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:50:37.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:11, diff=26.599475s, valid=True
2026-05-28T13:50:37.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:50:37.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:50:37.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:12, diff=25.602296s, valid=True
2026-05-28T13:50:37.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:50:37.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:50:37.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:09, diff=28.608929s, valid=True
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:50:37.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:50:37.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:12, diff=25.611989s, valid=True
2026-05-28T13:50:37.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:50:37.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:50:37.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:50:37.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901679.612671s, valid=True
2026-05-28T13:50:37.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:50:37.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:50:37.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:50:37.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:50:37.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:50:37.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:50:37.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:50:37.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:50:37.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:50:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:50:37.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:50:37.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:50:37.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:50:38.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:50:38.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:50:38.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:50:38.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:50:38.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:50:38.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-28T13:50:38.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-28T13:50:38.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:50:38.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:51:08.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:51:08.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:51:08.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:51:09.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:51:09.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:51:09.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:51:09.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-28T13:51:09.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:51:09.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:51:09.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:51:09.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:51:09.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:51:09.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-28T13:51:11.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T13:51:11.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:51:11.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:51:11.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:51:11.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:51:11.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:51:11.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:51:11.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:51:11.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:51:11.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:51:11.789 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:51:11.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:51:11.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:51:11.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:51:11.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:51:11.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:51:11.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:51:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:51:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:51:12.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:51:12.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:51:12.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:51:12.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:51:12.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:51:12.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:50:42
2026-05-28T13:51:12.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69146, datetime.datetime(2026, 5, 28, 13, 50, 42), datetime.datetime(2026, 5, 28, 13, 50, 42), 'salt', 14.33, 28.7, None, 4.55, 236.24, 17.93, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:51:12.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:51:12.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:51:12.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:42, diff=30.124435s, valid=True
2026-05-28T13:51:12.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:51:12.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:51:12.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:51:12, diff=0.127429s, valid=True
2026-05-28T13:51:12.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:51:12.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:50:40, diff=32.134217s, valid=True
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:51:12.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:51:12.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:51:12, diff=0.137329s, valid=True
2026-05-28T13:51:12.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:51:12.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:51:12.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:51:12.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901714.138008s, valid=True
2026-05-28T13:51:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:51:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:51:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:51:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:51:12.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:51:12.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:51:12.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:51:12.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:51:12.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:51:12.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:51:12.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:51:12.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:51:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:51:12.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:51:12.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:51:13.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:51:13.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:51:13.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:51:13.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-28T13:51:13.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-28T13:51:13.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:51:13.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:51:43.315 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:51:43.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:51:43.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:51:43.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:51:43.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:51:44.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:51:44.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-28T13:51:44.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:51:44.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-28T13:51:44.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:51:44.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:51:44.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:51:44.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-28T13:51:46.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-28T13:51:46.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:51:46.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:51:46.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:51:46.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:51:46.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:51:46.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:51:46.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:51:46.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:51:46.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:51:46.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:51:46.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:51:46.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:51:46.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:51:46.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:51:46.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:51:46.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:51:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:51:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:51:46.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:51:46.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:51:46.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:51:46.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:51:46.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:51:46.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:51:42
2026-05-28T13:51:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69148, datetime.datetime(2026, 5, 28, 13, 51, 42), datetime.datetime(2026, 5, 28, 13, 51, 42), 'salt', 14.46, 29.43, None, 3.21, 259.78, 17.61, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:51:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:51:46.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:51:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:51:42, diff=4.778298s, valid=True
2026-05-28T13:51:46.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:51:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:51:46.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:12, diff=-25.21878s, valid=True
2026-05-28T13:51:46.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:51:46.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:51:46.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:51:42, diff=4.787979s, valid=True
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:51:46.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:51:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:12, diff=-25.208977s, valid=True
2026-05-28T13:51:46.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:51:46.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:51:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:51:46.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901748.791689s, valid=True
2026-05-28T13:51:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:51:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:51:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:51:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:51:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:51:46.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:51:46.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:51:46.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:51:46.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:51:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:51:47.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:51:47.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:51:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:51:47.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:51:47.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:51:47.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:51:47.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:51:47.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:51:47.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-28T13:51:47.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-28T13:51:48.053 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:51:48.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:52:18.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:52:18.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:52:18.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:52:18.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:52:18.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:52:18.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:52:18.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-28T13:52:18.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:52:18.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:52:18.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:52:18.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:52:18.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:52:18.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-28T13:52:21.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-28T13:52:21.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:52:21.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:52:21.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:52:21.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:52:21.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:52:21.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:52:21.326 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:52:21.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:52:21.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:52:21.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:52:21.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:52:21.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:52:21.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:52:21.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:52:21.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:52:21.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:52:21.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:52:21.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:52:21.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:52:21.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:52:21.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:52:21.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:52:21.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:52:21.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:52:13
2026-05-28T13:52:21.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69149, datetime.datetime(2026, 5, 28, 13, 52, 13), datetime.datetime(2026, 5, 28, 13, 52, 12), 'salt', 14.4, 29.4, None, 3.0, 278.63, 17.62, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:52:21.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:52:21.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:52:21.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:12, diff=9.641878s, valid=True
2026-05-28T13:52:21.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:52:21.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:52:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:12, diff=9.644769s, valid=True
2026-05-28T13:52:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:52:21.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:10, diff=11.651417s, valid=True
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:52:21.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:52:21.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:12, diff=9.654473s, valid=True
2026-05-28T13:52:21.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:52:21.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:52:21.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:52:21.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901783.655127s, valid=True
2026-05-28T13:52:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:52:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:52:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:52:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:52:21.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:52:21.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:52:21.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:52:21.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:52:21.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:52:21.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:52:21.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:52:21.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:52:21.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:52:21.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:52:22.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:52:22.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:52:22.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:52:22.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:52:22.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-28T13:52:22.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-28T13:52:22.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:52:22.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:52:52.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:52:52.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:52:52.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:52:53.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:52:53.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:52:53.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:52:53.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-28T13:52:53.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:52:53.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-28T13:52:53.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:52:53.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:52:53.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:52:53.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-28T13:52:55.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-28T13:52:55.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:52:55.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:52:55.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:52:55.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:52:55.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:52:55.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:52:55.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:52:55.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:52:55.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:52:55.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:52:55.793 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:52:55.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:52:55.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:52:55.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:52:55.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:52:55.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:52:56.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:52:56.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:52:56.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:52:56.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:52:56.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:52:56.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:52:56.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:52:56.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:52:43
2026-05-28T13:52:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69150, datetime.datetime(2026, 5, 28, 13, 52, 43), datetime.datetime(2026, 5, 28, 13, 52, 42), 'salt', 14.43, 30.72, None, 6.04, 342.85, 17.03, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:52:56.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:52:56.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:52:56.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:42, diff=14.108033s, valid=True
2026-05-28T13:52:56.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:52:56.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:52:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:12, diff=-15.889073s, valid=True
2026-05-28T13:52:56.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:52:56.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:52:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:52:41, diff=15.117667s, valid=True
2026-05-28T13:52:56.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:52:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:52:56.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:52:56.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:52:56.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:52:56.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:52:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:12, diff=-15.879315s, valid=True
2026-05-28T13:52:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:52:56.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:52:56.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:52:56.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901818.121343s, valid=True
2026-05-28T13:52:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:52:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:52:56.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:52:56.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:52:56.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:52:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:52:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:52:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:52:56.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:52:56.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:52:56.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:52:56.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:52:56.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:52:56.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:52:56.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:52:57.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:52:57.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:52:57.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:52:57.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-28T13:52:57.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-28T13:52:57.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:52:57.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:53:27.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:53:27.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:53:27.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:53:27.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:53:27.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:53:27.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:53:27.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-28T13:53:27.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:53:27.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-28T13:53:27.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:53:27.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:53:27.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:53:27.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-28T13:53:30.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-28T13:53:30.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:53:30.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:53:30.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:53:30.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:53:30.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:53:30.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:53:30.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:53:30.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:53:30.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:53:30.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:53:30.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:53:30.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:53:30.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:53:30.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:53:30.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:53:30.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:53:30.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:53:30.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:53:30.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:53:30.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:53:30.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:53:30.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:53:30.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:53:30.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:53:13
2026-05-28T13:53:30.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69151, datetime.datetime(2026, 5, 28, 13, 53, 13), datetime.datetime(2026, 5, 28, 13, 53, 13), 'salt', 14.49, 30.46, None, 3.6, 345.38, 17.15, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:53:30.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:53:30.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:53:30.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:13, diff=17.741212s, valid=True
2026-05-28T13:53:30.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:53:30.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:53:30.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:12, diff=18.744132s, valid=True
2026-05-28T13:53:30.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:53:30.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:53:30.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:11, diff=19.750912s, valid=True
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:53:30.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:53:30.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:12, diff=18.75393s, valid=True
2026-05-28T13:53:30.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:53:30.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:53:30.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:53:30.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901852.754577s, valid=True
2026-05-28T13:53:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:53:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:53:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:53:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:53:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:53:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:53:30.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:53:30.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:53:30.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:53:30.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:53:30.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:53:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:53:31.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:53:31.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:53:31.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:53:31.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:53:31.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:53:31.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:53:31.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-28T13:53:31.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-28T13:53:31.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:53:31.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:54:01.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:54:01.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:54:01.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:54:02.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:54:02.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:54:02.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:54:02.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-28T13:54:02.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:54:02.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:54:02.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:54:02.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:54:02.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:54:02.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-28T13:54:05.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-28T13:54:05.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:54:05.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:54:05.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:54:05.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:54:05.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:54:05.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:54:05.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:54:05.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:54:05.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:54:05.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:54:05.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:54:05.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:54:05.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:54:05.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:54:05.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:54:05.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:54:05.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:54:05.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:54:05.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:54:05.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:54:05.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:54:05.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:54:05.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:54:05.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:53:43
2026-05-28T13:54:05.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69152, datetime.datetime(2026, 5, 28, 13, 53, 43), datetime.datetime(2026, 5, 28, 13, 53, 43), 'salt', 14.63, 30.92, None, 4.59, 326.48, 16.97, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:54:05.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:54:05.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:54:05.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:43, diff=22.425479s, valid=True
2026-05-28T13:54:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:54:05.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:54:05.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:12, diff=-6.571672s, valid=True
2026-05-28T13:54:05.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:54:05.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:53:41, diff=24.435011s, valid=True
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:54:05.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:54:05.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:12, diff=-6.561978s, valid=True
2026-05-28T13:54:05.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:54:05.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:54:05.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:54:05.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901887.438678s, valid=True
2026-05-28T13:54:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:54:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:54:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:54:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:54:05.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:54:05.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:54:05.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:54:05.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:54:05.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:54:05.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:54:05.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:54:05.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:54:05.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:54:05.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:54:05.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:54:06.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:54:06.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:54:06.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:54:06.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-28T13:54:06.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-28T13:54:06.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:54:06.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:54:36.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:54:36.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:54:36.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:54:36.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:54:36.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:54:37.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:54:37.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:54:37.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:54:37.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-28T13:54:37.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:54:37.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:54:37.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:54:37.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T13:54:39.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-28T13:54:39.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:54:39.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:54:39.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:54:39.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:54:39.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:54:39.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:54:39.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:54:39.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:54:39.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:54:39.625 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:54:39.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:54:39.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:54:39.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:54:39.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:54:39.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:54:39.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:54:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:54:39.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:54:39.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:54:39.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:54:39.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:54:39.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:54:39.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:54:39.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:54:13
2026-05-28T13:54:39.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69153, datetime.datetime(2026, 5, 28, 13, 54, 13), datetime.datetime(2026, 5, 28, 13, 54, 13), 'salt', 14.76, 30.69, None, 6.39, 294.71, 17.09, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:54:39.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:54:39.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:54:39.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:13, diff=26.944487s, valid=True
2026-05-28T13:54:39.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:54:39.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:54:39.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:12, diff=27.947549s, valid=True
2026-05-28T13:54:39.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:54:39.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:11, diff=28.954306s, valid=True
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:54:39.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:54:39.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:54:12, diff=27.95784s, valid=True
2026-05-28T13:54:39.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:54:39.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:54:39.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:54:39.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901921.95853s, valid=True
2026-05-28T13:54:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:54:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:54:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:54:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:54:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:54:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:54:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:54:40.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:54:40.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:54:40.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:54:40.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:54:40.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:54:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:54:40.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:54:40.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:54:40.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:54:41.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:54:41.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:54:41.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-28T13:54:41.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-28T13:54:41.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:54:41.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:55:11.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:55:11.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:55:11.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:55:11.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:55:11.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:55:12.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:55:12.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:55:12.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:55:12.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-28T13:55:12.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:55:12.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:55:12.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:55:12.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-28T13:55:14.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-28T13:55:14.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:55:14.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:55:14.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:55:14.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:55:14.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:55:14.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:55:14.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:55:14.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:55:14.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:55:14.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:55:14.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:55:14.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:55:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:55:14.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:55:14.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:55:14.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:55:14.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:55:14.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:55:14.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:55:14.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:55:14.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:55:14.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:55:14.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:55:14.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:55:14
2026-05-28T13:55:14.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69155, datetime.datetime(2026, 5, 28, 13, 55, 14), datetime.datetime(2026, 5, 28, 13, 55, 14), 'salt', 14.83, 31.39, None, 9.32, 279.84, 16.8, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:55:14.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:55:14.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:55:14.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:14, diff=0.891307s, valid=True
2026-05-28T13:55:14.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:55:14.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:55:14.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:12, diff=2.894106s, valid=True
2026-05-28T13:55:14.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:55:14.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:55:14.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:12, diff=2.900669s, valid=True
2026-05-28T13:55:14.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:55:14.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:55:14.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:55:14.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:55:14.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:55:14.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:55:14.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:12, diff=2.903678s, valid=True
2026-05-28T13:55:14.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:55:14.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:55:14.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:55:14.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901956.904321s, valid=True
2026-05-28T13:55:14.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:55:14.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:55:14.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:55:14.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:55:14.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:55:14.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:55:14.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:55:14.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:55:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:55:15.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:55:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:55:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:55:15.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:55:15.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:55:15.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:55:15.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:55:15.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:55:15.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:55:15.892 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:55:15.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:55:16.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:55:16.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:55:46.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:55:46.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:55:46.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:55:46.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:55:46.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:55:46.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:55:46.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-28T13:55:46.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:55:46.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-28T13:55:46.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:55:46.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:55:46.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:55:46.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-28T13:55:48.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-28T13:55:48.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:55:48.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:55:48.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:55:48.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:55:48.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:55:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:55:48.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:55:48.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:55:48.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:55:48.912 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:55:48.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:55:48.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:55:48.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:55:48.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:55:49.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:55:49.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:55:49.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:55:49.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:55:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:55:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:55:49.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:55:49.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:55:49.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:55:49.223 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:55:44
2026-05-28T13:55:49.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69156, datetime.datetime(2026, 5, 28, 13, 55, 44), datetime.datetime(2026, 5, 28, 13, 55, 44), 'salt', 14.79, 30.79, None, 9.18, 290.11, 17.05, 829.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:55:49.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:55:49.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:55:49.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:44, diff=5.229573s, valid=True
2026-05-28T13:55:49.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:55:49.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:55:49.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:12, diff=-22.767534s, valid=True
2026-05-28T13:55:49.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:55:49.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:55:43, diff=6.239161s, valid=True
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:55:49.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:55:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:12, diff=-22.75776s, valid=True
2026-05-28T13:55:49.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:55:49.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:55:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:55:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=901991.242917s, valid=True
2026-05-28T13:55:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:55:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:55:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:55:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:55:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:55:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:55:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:55:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:55:49.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:55:49.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:55:49.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:55:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:55:49.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:55:49.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:55:49.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:55:50.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:55:50.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:55:50.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:55:50.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-28T13:55:50.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-28T13:55:50.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:55:50.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:56:20.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:56:20.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:56:20.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:56:20.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:56:20.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:56:20.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:56:20.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-28T13:56:20.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:56:20.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-28T13:56:20.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:56:20.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:56:20.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:56:20.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-28T13:56:23.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-28T13:56:23.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:56:23.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:56:23.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:56:23.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:56:23.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:56:23.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:56:23.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:56:23.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:56:23.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:56:23.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:56:23.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:56:23.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:56:24.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:56:24.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:56:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:56:24.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:56:24.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:56:24.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:56:24.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:56:24.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:56:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:56:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:56:24.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:56:24.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:56:14
2026-05-28T13:56:24.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69157, datetime.datetime(2026, 5, 28, 13, 56, 14), datetime.datetime(2026, 5, 28, 13, 56, 14), 'salt', 15.06, 30.69, None, 13.83, 276.0, 17.13, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:56:24.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:56:24.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:56:24.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:14, diff=10.309288s, valid=True
2026-05-28T13:56:24.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:56:24.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:56:24.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:12, diff=12.31223s, valid=True
2026-05-28T13:56:24.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:56:24.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:12, diff=12.319042s, valid=True
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:56:24.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:56:24.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:12, diff=12.322136s, valid=True
2026-05-28T13:56:24.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:56:24.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:56:24.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:56:24.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902026.322814s, valid=True
2026-05-28T13:56:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:56:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:56:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:56:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:56:24.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:56:24.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:56:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:56:24.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:56:24.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:56:24.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:56:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:56:24.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:56:24.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:56:24.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:56:24.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:56:25.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:56:25.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:56:25.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:56:25.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-28T13:56:25.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-28T13:56:25.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:56:25.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:56:55.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:56:55.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:56:55.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:56:55.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:56:55.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:56:55.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:56:55.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:56:56.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:56:56.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-28T13:56:56.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:56:56.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:56:56.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:56:56.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-28T13:56:58.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-28T13:56:58.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:56:58.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:56:58.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:56:58.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:56:58.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:56:58.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:56:58.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:56:58.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:56:58.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:56:58.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:56:58.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:56:58.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:56:58.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:56:58.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:56:58.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:56:58.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:56:58.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:56:58.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:56:58.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:56:58.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:56:58.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:56:58.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:56:58.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:56:58.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:56:45
2026-05-28T13:56:58.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69158, datetime.datetime(2026, 5, 28, 13, 56, 45), datetime.datetime(2026, 5, 28, 13, 56, 44), 'salt', 15.02, 29.4, None, 15.07, 282.87, 17.7, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:56:58.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:56:58.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:56:58.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:44, diff=14.827796s, valid=True
2026-05-28T13:56:58.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:56:58.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:56:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:12, diff=-13.169398s, valid=True
2026-05-28T13:56:58.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:56:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:56:43, diff=15.837195s, valid=True
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:56:58.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:56:58.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:12, diff=-13.159776s, valid=True
2026-05-28T13:56:58.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:56:58.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:56:58.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:56:58.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902060.840886s, valid=True
2026-05-28T13:56:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:56:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:56:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:56:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:56:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:56:58.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:56:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:56:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:56:58.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:56:58.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:56:59.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:56:59.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:56:59.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:56:59.232 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:56:59.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:56:59.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:56:59.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:56:59.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:56:59.908 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:56:59.908 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:57:00.100 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:57:00.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:57:30.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:57:30.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:57:30.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:57:30.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:57:30.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:57:30.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:57:30.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T13:57:30.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:57:30.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-28T13:57:30.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:57:30.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:57:30.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:57: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-28T13:57:33.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-28T13:57:33.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:57:33.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:57:33.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:57:33.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:57:33.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:57:33.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:57:33.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:57:33.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:57:33.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:57:33.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:57:33.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:57:33.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:57:33.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:57:33.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:57:33.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:57:33.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:57:33.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:57:33.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:57:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:57:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:57:33.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:57:33.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:57:33.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:57:33.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:57:15
2026-05-28T13:57:33.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69159, datetime.datetime(2026, 5, 28, 13, 57, 15), datetime.datetime(2026, 5, 28, 13, 57, 14), 'salt', 14.59, 29.2, None, 12.18, 269.41, 17.73, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:57:33.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:57:33.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:57:33.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:14, diff=19.400817s, valid=True
2026-05-28T13:57:33.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:57:33.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:57:33.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:12, diff=21.403687s, valid=True
2026-05-28T13:57:33.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:57:33.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:13, diff=20.410283s, valid=True
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:57:33.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:57:33.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:12, diff=21.41329s, valid=True
2026-05-28T13:57:33.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:57:33.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:57:33.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:57:33.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902095.413955s, valid=True
2026-05-28T13:57:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:57:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:57:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:57:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:57:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:57:33.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:57:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:57:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:57:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:57:33.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:57:33.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:57:33.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:57:33.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:57:33.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:57:33.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:57:34.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:57:34.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:57:34.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:57:34.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-28T13:57:34.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-28T13:57:34.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:57:34.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:58:04.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:58:04.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:58:04.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:58:04.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:58:04.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:58:05.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:58:05.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-28T13:58:05.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:58:05.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-28T13:58:05.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:58:05.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:58:05.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:58:05.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-28T13:58:07.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-28T13:58:07.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:58:07.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:58:07.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:58:07.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:58:07.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:58:07.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:58:07.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:58:07.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:58:07.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:58:07.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:58:07.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:58:07.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:58:07.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:58:07.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:58:07.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:58:07.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:58:07.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:58:07.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:58:07.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:58:07.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:58:07.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:58:07.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:58:07.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:58:07.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:57:45
2026-05-28T13:58:07.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69160, datetime.datetime(2026, 5, 28, 13, 57, 45), datetime.datetime(2026, 5, 28, 13, 57, 45), 'salt', 14.53, 29.1, None, 10.8, 271.73, 17.78, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:58:07.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:58:07.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:58:07.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:45, diff=22.830709s, valid=True
2026-05-28T13:58:07.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:58:07.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:58:07.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:12, diff=-4.166385s, valid=True
2026-05-28T13:58:07.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:58:07.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:57:43, diff=24.840205s, valid=True
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:58:07.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:58:07.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:12, diff=-4.156763s, valid=True
2026-05-28T13:58:07.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:58:07.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:58:07.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:58:07.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902129.843894s, valid=True
2026-05-28T13:58:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:58:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:58:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:58:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:58:07.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:58:07.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:58:07.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:58:07.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:58:07.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:58:08.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:58:08.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:58:08.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:58:08.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:58:08.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:58:08.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:58:08.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:58:08.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:58:08.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:58:08.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-28T13:58:08.892 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:58:09.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:58:09.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:58:39.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:58:39.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:58:39.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:58:39.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:58:39.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:58:39.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:58:39.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-28T13:58:39.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:58:39.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:58:39.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:58:39.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:58:39.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:58: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-28T13:58:41.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-28T13:58:41.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:58:41.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:58:41.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:58:41.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:58:41.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:58:41.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:58:41.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:58:41.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:58:41.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:58:41.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:58:41.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:58:41.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:58:41.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T13:58:41.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:58:42.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T13:58:42.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:58:42.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:58:42.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:58:42.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:58:42.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:58:42.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:58:42.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:58:42.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:58:42.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:58:15
2026-05-28T13:58:42.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69161, datetime.datetime(2026, 5, 28, 13, 58, 15), datetime.datetime(2026, 5, 28, 13, 58, 15), 'salt', 14.49, 29.6, None, 6.99, 255.78, 17.54, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:58:42.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:58:42.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T13:58:42.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:15, diff=27.19406s, valid=True
2026-05-28T13:58:42.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:58:42.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:58:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:12, diff=30.196904s, valid=True
2026-05-28T13:58:42.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:58:42.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:13, diff=29.203534s, valid=True
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:58:42.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:58:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:58:12, diff=30.206538s, valid=True
2026-05-28T13:58:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:58:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:58:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:58:42.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902164.207195s, valid=True
2026-05-28T13:58:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:58:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:58:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:58:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:58:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:58:42.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:58:42.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:58:42.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:58:42.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:58:42.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:58:42.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:58:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:58:42.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:58:42.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:58:42.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:58:43.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:58:43.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:58:43.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:58:43.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-28T13:58:43.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-28T13:58:43.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:58:43.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:59:13.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:59:13.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:59:13.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:59:13.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:59:13.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:59:14.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:59:14.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-28T13:59:14.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:59:14.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-28T13:59:14.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:59:14.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:59:14.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:59:14.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-28T13:59:16.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-28T13:59:16.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:59:16.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:59:16.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:59:16.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:59:16.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:59:16.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:59:16.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:59:16.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:59:16.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:59:16.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:59:16.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:59:16.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:59:16.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:59:16.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:59:16.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:59:16.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:59:16.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:59:16.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:59:16.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T13:59:16.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:59:16.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:59:16.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:59:16.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:59:17.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:59:16
2026-05-28T13:59:17.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69163, datetime.datetime(2026, 5, 28, 13, 59, 16), datetime.datetime(2026, 5, 28, 13, 59, 15), 'salt', 14.39, 28.8, None, 2.37, 313.81, 17.89, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:59:17.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:59:17.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:59:17.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:15, diff=2.048536s, valid=True
2026-05-28T13:59:17.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:59:17.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:59:17.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:12, diff=5.051356s, valid=True
2026-05-28T13:59:17.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:59:17.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:59:17.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:14, diff=3.057967s, valid=True
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:59:17.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T13:59:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:12, diff=5.060995s, valid=True
2026-05-28T13:59:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:59:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:59:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:59:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902199.061672s, valid=True
2026-05-28T13:59:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:59:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:59:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:59:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:59:17.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:59:17.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:59:17.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:59:17.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:59:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:59:17.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:59:17.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:59:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:59:17.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:59:17.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:59:17.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:59:17.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:59:18.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:59:18.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:59:18.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-28T13:59:18.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-28T13:59:18.296 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:59:18.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T13:59:48.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T13:59:48.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T13:59:48.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T13:59:48.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T13:59:48.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T13:59:48.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T13:59:48.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-28T13:59:48.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T13:59:48.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T13:59:48.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T13:59:48.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T13:59:48.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T13:59:48.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-28T13:59:51.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-28T13:59:51.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T13:59:51.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T13:59:51.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T13:59:51.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T13:59:51.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T13:59:51.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T13:59:51.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T13:59:51.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T13:59:51.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T13:59:51.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T13:59:51.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T13:59:51.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T13:59:51.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T13:59:51.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T13:59:51.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T13:59:51.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:59:51.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:59:51.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T13:59:51.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T13:59:51.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T13:59:51.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T13:59:51.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T13:59:51.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T13:59:51.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 13:59:46
2026-05-28T13:59:51.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69164, datetime.datetime(2026, 5, 28, 13, 59, 46), datetime.datetime(2026, 5, 28, 13, 59, 46), 'salt', 14.49, 30.66, None, 8.47, 238.34, 17.06, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T13:59:51.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T13:59:51.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T13:59:51.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:46, diff=5.533785s, valid=True
2026-05-28T13:59:51.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T13:59:51.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:59:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:12, diff=-20.463346s, valid=True
2026-05-28T13:59:51.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T13:59:51.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 13:59:44, diff=7.543171s, valid=True
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T13:59:51.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T13:59:51.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:12, diff=-20.453818s, valid=True
2026-05-28T13:59:51.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T13:59:51.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T13:59:51.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T13:59:51.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902233.546849s, valid=True
2026-05-28T13:59:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T13:59:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T13:59:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T13:59:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T13:59:51.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T13:59:51.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T13:59:51.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T13:59:51.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T13:59:51.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T13:59:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T13:59:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T13:59:51.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T13:59:51.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T13:59:51.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T13:59:52.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:59:52.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T13:59:52.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T13:59:52.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T13:59:52.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T13:59:52.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T13:59:52.862 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T13:59:52.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:00:22.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:00:22.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:00:22.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:00:23.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:00:23.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:00:23.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:00:23.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-28T14:00:23.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:00:23.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-28T14:00:23.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:00:23.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:00:23.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:00:23.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-28T14:00:26.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-28T14:00:26.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:00:26.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:00:26.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:00:26.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:00:26.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:00:26.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:00:26.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:00:26.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:00:26.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:00:26.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:00:26.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:00:26.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:00:26.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:00:26.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:00:26.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:00:26.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:00:26.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:00:26.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:00:26.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:00:26.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:00:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:00:26.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:00:26.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:00:26.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:00:16
2026-05-28T14:00:26.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69165, datetime.datetime(2026, 5, 28, 14, 0, 16), datetime.datetime(2026, 5, 28, 14, 0, 16), 'salt', 14.59, 31.12, None, 7.45, 239.51, 16.87, 829.9, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:00:26.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:00:26.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:00:26.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:16, diff=10.892868s, valid=True
2026-05-28T14:00:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:00:26.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:00:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:12, diff=14.895664s, valid=True
2026-05-28T14:00:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:00:26.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:16, diff=10.902142s, valid=True
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:00:26.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:00:26.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:12, diff=14.905126s, valid=True
2026-05-28T14:00:26.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:00:26.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:00:26.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:00:26.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902268.905773s, valid=True
2026-05-28T14:00:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:00:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:00:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:00:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:00:26.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:00:26.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:00:26.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:00:26.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:00:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:00:27.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:00:27.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:00:27.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:00:27.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:00:27.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:00:27.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:00:27.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:00:27.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:00:27.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:00:27.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-28T14:00:27.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-28T14:00:28.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:00:28.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:00:58.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:00:58.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:00:58.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:00:58.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:00:58.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:00:58.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:00:58.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-28T14:00:58.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:00:58.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-28T14:00:58.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:00:58.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:00:58.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:00:58.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-28T14:01:01.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-28T14:01:01.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:01:01.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:01:01.763 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:01:01.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:01:01.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:01:01.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:01:01.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:01:01.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:01:01.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:01:01.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:01:01.784 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:01:01.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:01:01.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:01:01.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:01:01.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:01:01.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:01:02.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:01:02.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:01:02.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:01:02.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:01:02.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:01:02.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:01:02.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:01:02.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:00:46
2026-05-28T14:01:02.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69166, datetime.datetime(2026, 5, 28, 14, 0, 46), datetime.datetime(2026, 5, 28, 14, 0, 46), 'salt', 14.86, 32.54, None, 7.87, 242.61, 16.31, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:01:02.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:01:02.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:01:02.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:46, diff=16.114544s, valid=True
2026-05-28T14:01:02.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:01:02.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:01:02.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:12, diff=-9.881709s, valid=True
2026-05-28T14:01:02.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:01:02.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:00:45, diff=17.126449s, valid=True
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:01:02.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:01:02.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:12, diff=-9.870073s, valid=True
2026-05-28T14:01:02.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:01:02.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:01:02.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:01:02.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902304.130643s, valid=True
2026-05-28T14:01:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:01:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:01:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:01:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:01:02.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:01:02.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:01:02.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:01:02.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:01:02.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:01:02.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:01:02.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:01:02.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:01:02.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:01:02.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:01:02.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:01:03.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:01:03.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:01:03.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:01:03.252 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:01:03.252 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:01:03.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:01:03.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:01:33.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:01:33.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:01:33.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:01:33.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:01:33.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:01:33.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:01:33.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-28T14:01:33.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:01:33.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-28T14:01:33.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:01:33.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:01:33.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:01:33.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-28T14:01:36.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-28T14:01:36.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:01:36.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:01:36.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:01:36.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:01:36.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:01:36.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:01:36.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:01:36.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:01:36.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:01:36.573 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:01:36.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:01:36.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:01:36.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:01:36.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:01:36.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:01:36.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:01:36.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:01:36.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:01:36.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:01:36.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:01:36.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:01:36.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:01:36.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:01:36.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:01:17
2026-05-28T14:01:36.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69167, datetime.datetime(2026, 5, 28, 14, 1, 17), datetime.datetime(2026, 5, 28, 14, 1, 16), 'salt', 14.96, 32.98, None, 11.26, 211.89, 16.14, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:01:36.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:01:36.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:01:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:16, diff=20.913187s, valid=True
2026-05-28T14:01:36.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:01:36.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:01:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:12, diff=24.91615s, valid=True
2026-05-28T14:01:36.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:01:36.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:01:36.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:15, diff=21.922879s, valid=True
2026-05-28T14:01:36.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:01:36.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:01:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:01:36.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:01:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:01:36.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:01:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:12, diff=24.925941s, valid=True
2026-05-28T14:01:36.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:01:36.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:01:36.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:01:36.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902338.926629s, valid=True
2026-05-28T14:01:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:01:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:01:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:01:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:01:36.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:01:36.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:01:36.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:01:36.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:01:37.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:01:37.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:01:37.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:01:37.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:01:37.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:01:37.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:01:37.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:01:37.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:01:37.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:01:37.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:01:37.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-28T14:01:37.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-28T14:01:38.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:01:38.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:02:08.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:02:08.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:02:08.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:02:08.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:02:08.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:02:08.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:02:08.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-28T14:02:08.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:02:08.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-28T14:02:08.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:02:08.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:02:08.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:02:08.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-28T14:02:11.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-28T14:02:11.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:02:11.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:02:11.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:02:11.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:02:11.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:02:11.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:02:11.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:02:11.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:02:11.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:02:11.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:02:11.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:02:11.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:02:12.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:02:12.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:02:12.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:02:12.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:02:12.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:02:12.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:02:12.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:02:12.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:02:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:02:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:02:12.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:02:12.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:01:47
2026-05-28T14:02:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69168, datetime.datetime(2026, 5, 28, 14, 1, 47), datetime.datetime(2026, 5, 28, 14, 1, 47), 'salt', 15.02, 30.26, None, 7.62, 227.41, 17.31, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:02:12.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:02:12.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:02:12.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:47, diff=25.250948s, valid=True
2026-05-28T14:02:12.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:02:12.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:02:12.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:12, diff=0.253804s, valid=True
2026-05-28T14:02:12.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:02:12.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:01:45, diff=27.260586s, valid=True
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:02:12.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:02:12.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:02:12.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:12, diff=0.263637s, valid=True
2026-05-28T14:02:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:02:12.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:02:12.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:02:12.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902374.264305s, valid=True
2026-05-28T14:02:12.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:02:12.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:02:12.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:02:12.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:02:12.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:02:12.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:02:12.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:02:12.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:02:12.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:02:12.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:02:12.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:02:12.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:02:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:02:12.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:02:12.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:02:13.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:02:13.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:02:13.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:02:13.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-28T14:02:13.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-28T14:02:13.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:02:13.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:02:43.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:02:43.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:02:43.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:02:43.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:02:43.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:02:44.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:02:44.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-28T14:02:44.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:02:44.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-28T14:02:44.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:02:44.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:02:44.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:02:44.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-28T14:02:47.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-28T14:02:47.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:02:47.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:02:47.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:02:47.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:02:47.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:02:47.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:02:47.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:02:47.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:02:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:02:47.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:02:47.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:02:47.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:02:47.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:02:47.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:02:47.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:02:47.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:02:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:02:47.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:02:47.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:02:47.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:02:47.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:02:47.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:02:47.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:02:47.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:02:17
2026-05-28T14:02:47.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69169, datetime.datetime(2026, 5, 28, 14, 2, 17), datetime.datetime(2026, 5, 28, 14, 2, 17), 'salt', 15.09, 31.82, None, 8.93, 225.23, 16.64, 829.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:02:47.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:02:47.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:02:47.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:17, diff=30.37538s, valid=True
2026-05-28T14:02:47.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:02:47.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:02:47.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:12, diff=35.378309s, valid=True
2026-05-28T14:02:47.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:02:47.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:15, diff=32.38503s, valid=True
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:02:47.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:02:47.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:02:12, diff=35.388114s, valid=True
2026-05-28T14:02:47.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:02:47.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:02:47.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:02:47.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902409.388786s, valid=True
2026-05-28T14:02:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:02:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:02:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:02:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:02:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:02:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:02:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:02:47.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:02:47.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:02:47.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:02:47.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:02:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:02:47.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:02:47.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:02:47.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:02:48.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:02:48.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:02:48.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:02:48.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-28T14:02:48.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-28T14:02:48.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:02:48.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:03:18.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:03:18.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:03:18.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:03:18.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:03:18.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:03:19.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:03:19.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:03:19.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:03:19.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-28T14:03:19.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:03:19.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:03:19.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:03:19.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-28T14:03:22.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-28T14:03:22.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:03:22.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:03:22.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:03:22.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:03:22.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:03:22.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:03:22.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:03:22.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:03:22.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:03:22.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:03:22.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:03:22.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:03:22.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:03:22.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:03:22.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:03:22.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:03:22.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:03:22.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:03:22.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:03:22.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:03:22.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:03:22.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:03:22.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:03:22.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:03:18
2026-05-28T14:03:22.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69171, datetime.datetime(2026, 5, 28, 14, 3, 18), datetime.datetime(2026, 5, 28, 14, 3, 17), 'salt', 15.19, 31.35, None, 12.56, 258.9, 16.85, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:03:22.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:03:22.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:03:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:17, diff=5.531912s, valid=True
2026-05-28T14:03:22.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:03:22.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:03:22.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:12, diff=10.534751s, valid=True
2026-05-28T14:03:22.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:03:22.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:16, diff=6.541317s, valid=True
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:03:22.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:03:22.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:12, diff=10.544343s, valid=True
2026-05-28T14:03:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:03:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:03:22.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:03:22.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902444.545011s, valid=True
2026-05-28T14:03:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:03:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:03:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:03:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:03:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:03:22.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:03:22.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:03:22.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:03:22.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:03:22.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:03:22.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:03:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:03:22.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:03:22.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:03:23.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:03:23.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:03:23.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:03:23.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:03:23.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-28T14:03:23.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-28T14:03:23.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:03:23.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:03:53.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:03:53.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:03:53.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:03:54.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:03:54.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:03:54.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:03:54.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-28T14:03:54.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:03:54.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-28T14:03:54.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:03:54.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:03:54.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:03:54.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-28T14:03:57.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-28T14:03:57.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:03:57.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:03:57.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:03:57.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:03:57.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:03:57.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:03:57.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:03:57.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:03:57.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:03:57.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:03:57.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:03:57.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:03:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:03:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:03:57.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:03:57.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:03:57.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:03:57.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:03:57.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:03:57.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:03:57.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:03:57.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:03:57.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:03:57.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:03:48
2026-05-28T14:03:57.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69172, datetime.datetime(2026, 5, 28, 14, 3, 48), datetime.datetime(2026, 5, 28, 14, 3, 47), 'salt', 15.45, 27.77, None, 11.89, 302.34, 18.52, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:03:57.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:03:57.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:03:57.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:47, diff=10.569746s, valid=True
2026-05-28T14:03:57.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:03:57.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:03:57.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:12, diff=-14.427394s, valid=True
2026-05-28T14:03:57.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:03:57.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:03:46, diff=11.579336s, valid=True
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:03:57.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:03:57.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:12, diff=-14.417627s, valid=True
2026-05-28T14:03:57.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:03:57.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:03:57.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:03:57.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902479.58306s, valid=True
2026-05-28T14:03:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:03:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:03:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:03:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:03:57.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:03:57.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:03:57.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:03:57.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:03:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:03:57.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:03:57.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:03:57.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:03:57.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:03:57.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:03:58.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:03:58.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:03:58.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:03:58.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:03:58.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-28T14:03:58.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-28T14:03:58.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:03:58.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:04:28.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:04:28.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:04:28.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:04:29.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:04:29.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:04:29.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:04:29.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-28T14:04:29.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:04:29.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-28T14:04:29.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:04:29.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:04:29.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:04:29.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-28T14:04:32.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-28T14:04:32.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:04:32.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:04:32.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:04:32.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:04:32.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:04:32.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:04:32.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:04:32.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:04:32.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:04:32.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:04:32.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:04:32.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:04:32.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:04:32.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:04:32.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:04:32.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:04:32.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:04:32.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:04:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:04:32.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:04:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:04:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:04:32.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:04:32.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:04:18
2026-05-28T14:04:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69173, datetime.datetime(2026, 5, 28, 14, 4, 18), datetime.datetime(2026, 5, 28, 14, 4, 18), 'salt', 15.25, 27.37, None, 8.61, 283.89, 18.69, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:04:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:04:32.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:04:32.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:18, diff=14.636934s, valid=True
2026-05-28T14:04:32.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:04:32.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:04:32.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:12, diff=20.639743s, valid=True
2026-05-28T14:04:32.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:04:32.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:16, diff=16.646559s, valid=True
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:04:32.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:04:32.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:04:32.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:12, diff=20.649527s, valid=True
2026-05-28T14:04:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:04:32.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:04:32.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:04:32.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902514.65019s, valid=True
2026-05-28T14:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:04:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:04:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:04:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:04:32.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:04:32.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:04:32.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:04:32.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:04:32.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:04:32.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:04:33.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:04:33.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:04:33.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:04:33.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:04: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-28T14:04: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-28T14:04:33.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:04:33.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:05:03.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:05:03.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:05:03.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:05:04.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:05:04.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:05:04.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:05:04.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-28T14:05:04.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:05:04.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-28T14:05:04.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:05:04.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:05:04.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:05:04.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-28T14:05:06.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-28T14:05:06.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:05:06.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:05:06.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:05:06.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:05:06.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:05:06.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:05:06.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:05:06.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:05:06.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:05:06.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:05:06.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:05:06.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:05:06.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:05:06.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:05:06.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:05:06.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:05:06.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:05:06.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:05:06.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:05:06.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:05:06.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:05:06.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:05:06.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:05:07.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:04:48
2026-05-28T14:05:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69174, datetime.datetime(2026, 5, 28, 14, 4, 48), datetime.datetime(2026, 5, 28, 14, 4, 48), 'salt', 15.06, 27.11, None, 12.88, 268.28, 18.8, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:05:07.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:05:07.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:05:07.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:48, diff=19.062188s, valid=True
2026-05-28T14:05:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:05:07.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:05:07.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:12, diff=-4.934941s, valid=True
2026-05-28T14:05:07.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:05:07.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:05:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:04:48, diff=19.071693s, valid=True
2026-05-28T14:05:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:05:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:05:07.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:05:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:05:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:05:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:05:07.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:12, diff=-4.925309s, valid=True
2026-05-28T14:05:07.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:05:07.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:05:07.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:05:07.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902549.075336s, valid=True
2026-05-28T14:05:07.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:05:07.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:05:07.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:05:07.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:05:07.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:05:07.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:05:07.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:05:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:05:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:05:07.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:05:07.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:05:07.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:05:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:05:07.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:05:07.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:05:08.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:05:08.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:05:08.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:05:08.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-28T14:05:08.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-28T14:05:08.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:05:08.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:05:38.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:05:38.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:05:38.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:05:38.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:05:38.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:05:38.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:05:38.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-28T14:05:39.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:05:39.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-28T14:05:39.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:05:39.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:05:39.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:05:39.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:05: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-28T14:05:41.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:05:41.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:05:41.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:05:41.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:05:41.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:05:41.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:05:41.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:05:41.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:05:41.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:05:41.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:05:41.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:05:41.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:05:41.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:05:41.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:05:41.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:05:41.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:05:41.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:05:41.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:05:41.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:05:41.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:05:41.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:05:41.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:05:41.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:05:41.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:05:18
2026-05-28T14:05:41.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69175, datetime.datetime(2026, 5, 28, 14, 5, 18), datetime.datetime(2026, 5, 28, 14, 5, 18), 'salt', 15.02, 26.41, None, 11.19, 254.73, 19.13, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:05:41.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:05:41.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:05:41.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:18, diff=23.929489s, valid=True
2026-05-28T14:05:41.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:05:41.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:05:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:12, diff=29.932369s, valid=True
2026-05-28T14:05:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:05:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:16, diff=25.93911s, valid=True
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:05:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:05:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:12, diff=29.94216s, valid=True
2026-05-28T14:05:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:05:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:05:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:05:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902583.942823s, valid=True
2026-05-28T14:05:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:05:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:05:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:05:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:05:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:05:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:05:42.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:05:42.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:05:42.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:05:42.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:05:42.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:05:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:05:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:05:42.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:05:42.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:05:42.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:05:42.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:05:42.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:05:42.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-28T14:05:42.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-28T14:05:43.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:05:43.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:06:13.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:06:13.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:06:13.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:06:13.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:06:13.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:06:13.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:06:13.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-28T14:06:13.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:06:13.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-28T14:06:13.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:06:13.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:06:13.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:06:13.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-28T14:06:16.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-28T14:06:16.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:06:16.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:06:16.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:06:16.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:06:16.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:06:16.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:06:16.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:06:16.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:06:16.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:06:16.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:06:16.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:06:16.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:06:16.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:06:16.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:06:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:06:16.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:06:16.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:06:16.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:06:16.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:06:16.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:06:16.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:06:16.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:06:16.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:06:16.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:05:49
2026-05-28T14:06:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69176, datetime.datetime(2026, 5, 28, 14, 5, 49), datetime.datetime(2026, 5, 28, 14, 5, 48), 'salt', 14.79, 28.14, None, 12.74, 244.06, 18.26, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:06:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:06:16.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:06:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:48, diff=28.368177s, valid=True
2026-05-28T14:06:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:06:16.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:06:16.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:06:12, diff=4.371048s, valid=True
2026-05-28T14:06:16.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:06:16.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:06:16.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:05:47, diff=29.37765s, valid=True
2026-05-28T14:06:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:06:16.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:06:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:06:16.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:06:16.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:06:16.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:06:16.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:06:12, diff=4.380651s, valid=True
2026-05-28T14:06:16.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:06:16.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:06:16.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:06:16.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902618.381323s, valid=True
2026-05-28T14:06:16.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:06:16.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:06:16.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:06:16.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:06:16.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:06:16.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:06:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:06:16.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:06:16.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:06:16.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:06:16.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:06:16.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:06:16.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:06:16.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:06:17.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:06:17.388 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:06:17.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:06:17.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:06:17.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:06:17.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-28T14:06:17.579 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:06:17.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:06:47.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:06:47.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:06:47.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:06:47.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:06:47.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:06:48.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:06:48.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-28T14:06:48.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:06:48.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-28T14:06:48.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:06:48.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:06:48.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:06:48.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-28T14:06:51.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-28T14:06:51.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:06:51.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:06:51.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:06:51.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:06:51.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:06:51.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:06:51.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:06:51.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:06:51.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:06:51.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:06:51.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:06:51.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:06:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:06:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:06:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:06:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:06:51.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:06:51.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:06:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:06:51.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:06:51.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:06:51.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:06:51.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:06:51.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:06:49
2026-05-28T14:06:51.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69178, datetime.datetime(2026, 5, 28, 14, 6, 49), datetime.datetime(2026, 5, 28, 14, 6, 49), 'salt', 14.69, 27.64, None, 9.64, 257.8, 18.48, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:06:51.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:06:51.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:06:51.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:06:49, diff=2.928429s, valid=True
2026-05-28T14:06:51.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:06:51.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:06:51.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:12, diff=-20.068643s, valid=True
2026-05-28T14:06:51.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:06:51.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:06:51.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:06:47, diff=4.938608s, valid=True
2026-05-28T14:06:51.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:06:51.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:06:51.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:06:51.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:06:51.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:06:51.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:06:51.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:12, diff=-20.057895s, valid=True
2026-05-28T14:06:51.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:06:51.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:06:51.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:06:51.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902653.942872s, valid=True
2026-05-28T14:06:51.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:06:51.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:06:51.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:06:51.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:06:51.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:06:52.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:06:52.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:06:52.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:06:52.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:06:52.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:06:52.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:06:52.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:06:52.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:06:52.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:06:52.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:06:52.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:06:52.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:06:52.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:06:52.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-28T14:06:52.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-28T14:06:53.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:06:53.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:07:23.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:07:23.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:07:23.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:07:23.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:07:23.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:07:23.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:07:23.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-28T14:07:23.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:07:23.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-28T14:07:23.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:07:23.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:07:23.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:07:23.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-28T14:07:26.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-28T14:07:26.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:07:26.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:07:26.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:07:26.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:07:26.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:07:26.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:07:26.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:07:26.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:07:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:07:26.234 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:07:26.234 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:07:26.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:07:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:07:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:07:26.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:07:26.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:07:26.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:07:26.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:07:26.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:07:26.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:07:26.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:07:26.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:07:26.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:07:26.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:07:19
2026-05-28T14:07:26.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69179, datetime.datetime(2026, 5, 28, 14, 7, 19), datetime.datetime(2026, 5, 28, 14, 7, 19), 'salt', 14.72, 28.53, None, 13.59, 202.39, 18.06, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:07:26.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:07:26.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:07:26.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:19, diff=7.552046s, valid=True
2026-05-28T14:07:26.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:07:26.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:07:26.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:12, diff=14.554878s, valid=True
2026-05-28T14:07:26.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:07:26.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:18, diff=8.561568s, valid=True
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:07:26.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:07:26.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:07:26.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:12, diff=14.564617s, valid=True
2026-05-28T14:07:26.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:07:26.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:07:26.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:07:26.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902688.56529s, valid=True
2026-05-28T14:07:26.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:07:26.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:07:26.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:07:26.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:07:26.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:07:26.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:07:26.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:07:26.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:07:26.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:07:26.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:07:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:07:26.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:07:26.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:07:26.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:07:27.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:07:27.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:07:27.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:07:27.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:07:27.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-28T14:07:27.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-28T14:07:27.883 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:07:27.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:07:57.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:07:57.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:07:57.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:07:58.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:07:58.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:07:58.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:07:58.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-28T14:07:58.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:07:58.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-28T14:07:58.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:07:58.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:07:58.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:07:58.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-28T14:08:01.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-28T14:08:01.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:08:01.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:08:01.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:08:01.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:08:01.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:08:01.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:08:01.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:08:01.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:08:01.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:08:01.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:08:01.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:08:01.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:08:01.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:08:01.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:08:01.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:08:01.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:08:01.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:08:01.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:08:01.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:08:01.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:08:01.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:08:01.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:08:01.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:08:01.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:07:50
2026-05-28T14:08:01.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69180, datetime.datetime(2026, 5, 28, 14, 7, 50), datetime.datetime(2026, 5, 28, 14, 7, 49), 'salt', 14.99, 29.0, None, 15.07, 260.45, 17.88, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:08:01.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:08:01.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:08:01.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:49, diff=12.3977s, valid=True
2026-05-28T14:08:01.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:08:01.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:08:01.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:12, diff=-10.599485s, valid=True
2026-05-28T14:08:01.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:08:01.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:07:48, diff=13.407135s, valid=True
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:08:01.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:08:01.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:12, diff=-10.58987s, valid=True
2026-05-28T14:08:01.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:08:01.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:08:01.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:08:01.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902723.410797s, valid=True
2026-05-28T14:08:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:08:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:08:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:08:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:08:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:08:01.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:08:01.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:08:01.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:08:01.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:08:01.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:08:01.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:08:01.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:08:01.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:08:01.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:08:01.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:08:02.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:08:02.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:08:02.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:08:02.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-28T14:08:02.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-28T14:08:02.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:08:02.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:08:32.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:08:32.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:08: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-28T14:08:33.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:08:33.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:08:33.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:08:33.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:08:33.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:08:33.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-28T14:08:33.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:08:33.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:08:33.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:08:33.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-28T14:08:36.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-28T14:08:36.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:08:36.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:08:36.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:08:36.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:08:36.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:08:36.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:08:36.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:08:36.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:08:36.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:08:36.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:08:36.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:08:36.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:08:36.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:08:36.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:08:36.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:08:36.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:08:36.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:08:36.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:08:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:08:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:08:36.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:08:36.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:08:36.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:08:36.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:08:21
2026-05-28T14:08:36.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69181, datetime.datetime(2026, 5, 28, 14, 8, 21), datetime.datetime(2026, 5, 28, 14, 8, 20), 'salt', 15.09, 30.26, None, 14.54, 237.0, 17.32, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:08:36.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:08:36.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:08:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:20, diff=16.550559s, valid=True
2026-05-28T14:08:36.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:08:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:08:36.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:12, diff=24.553401s, valid=True
2026-05-28T14:08:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:08:36.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:18, diff=18.560091s, valid=True
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:08:36.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:08:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:12, diff=24.563147s, valid=True
2026-05-28T14:08:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:08:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:08:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:08:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902758.563819s, valid=True
2026-05-28T14:08:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:08:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:08:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:08:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:08:36.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:08:36.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:08:36.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:08:36.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:08:36.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:08:36.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:08:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:08:36.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:08:36.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:08:36.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:08:37.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:08:37.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:08:37.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:08:37.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:08:37.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:08:37.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:08:37.967 [WARNING] [MainThread] [clean.py] [copy_files()] Error uploading images and files to the web server: rsync: [sender] read errors mapping "/home/io/development/weatherplots/weatherplots/images/atlas/ref_zp.dat": No data available (61)
WARNING: atlas/ref_zp.dat failed verification -- update discarded (will try again).
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1338) [sender=3.2.7]

2026-05-28T14:08:37.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:09:07.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:09:07.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:09:07.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:09:08.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:09:08.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:09:08.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:09:08.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-28T14:09:08.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:09:08.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-28T14:09:08.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:09:08.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:09:08.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:09:08.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-28T14:09:11.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-28T14:09:11.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:09:11.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:09:11.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:09:11.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:09:11.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:09:11.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:09:11.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:09:11.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:09:11.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:09:11.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:09:11.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:09:11.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:09:12.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:09:12.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:09:12.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:09:12.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:09:12.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:09:12.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:09:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:09:12.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:09:12.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:09:12.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:09:12.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:09:12.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:08:51
2026-05-28T14:09:12.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69182, datetime.datetime(2026, 5, 28, 14, 8, 51), datetime.datetime(2026, 5, 28, 14, 8, 50), 'salt', 15.05, 28.37, None, 14.47, 240.77, 18.18, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:09:12.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:09:12.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:09:12.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:50, diff=22.258364s, valid=True
2026-05-28T14:09:12.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:09:12.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:09:12.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:12, diff=0.261165s, valid=True
2026-05-28T14:09:12.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:09:12.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:09:12.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:08:49, diff=23.267844s, valid=True
2026-05-28T14:09:12.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:09:12.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:09:12.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:09:12.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:09:12.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:09:12.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:09:12.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:12, diff=0.270862s, valid=True
2026-05-28T14:09:12.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:09:12.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:09:12.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:09:12.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902794.271514s, valid=True
2026-05-28T14:09:12.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:09:12.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:09:12.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:09:12.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:09:12.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:09:12.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:09:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:09:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:09:12.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:09:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:09:12.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:09:12.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:09:12.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:09:12.597 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:09:12.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:09:13.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:09:13.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:09:13.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:09:13.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-28T14:09:13.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-28T14:09:13.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:09:13.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:09:43.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:09:43.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:09:43.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:09:43.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:09:43.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:09:44.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:09:44.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-28T14:09:44.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:09:44.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-28T14:09:44.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:09:44.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:09:44.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:09:44.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-28T14:09:47.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-28T14:09:47.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:09:47.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:09:47.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:09:47.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:09:47.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:09:47.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:09:47.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:09:47.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:09:47.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:09:47.201 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:09:47.201 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:09:47.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:09:47.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:09:47.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:09:47.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:09:47.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:09:47.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:09:47.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:09:47.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:09:47.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:09:47.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:09:47.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:09:47.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:09:47.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:09:21
2026-05-28T14:09:47.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69183, datetime.datetime(2026, 5, 28, 14, 9, 21), datetime.datetime(2026, 5, 28, 14, 9, 21), 'salt', 15.02, 29.06, None, 10.13, 245.53, 17.85, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:09:47.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:09:47.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:09:47.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:21, diff=26.520769s, valid=True
2026-05-28T14:09:47.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:09:47.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:09:47.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:12, diff=35.523574s, valid=True
2026-05-28T14:09:47.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:09:47.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:20, diff=27.53021s, valid=True
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:09:47.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:09:47.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:09:12, diff=35.533232s, valid=True
2026-05-28T14:09:47.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:09:47.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:09:47.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:09:47.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902829.533884s, valid=True
2026-05-28T14:09:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:09:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:09:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:09:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:09:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:09:47.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:09:47.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:09:47.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:09:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:09:47.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:09:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:09:47.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:09:47.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:09:47.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:09:48.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:09:48.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:09:48.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:09:48.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:09:48.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-28T14:09:48.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-28T14:09:48.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:09:48.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:10:18.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:10:18.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:10:18.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:10:18.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:10:18.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:10:19.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:10:19.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-28T14:10:19.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:10:19.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-28T14:10:19.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:10:19.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:10:19.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:10:19.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-28T14:10:21.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-28T14:10:21.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:10:21.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:10:21.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:10:21.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:10:21.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:10:21.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:10:21.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:10:21.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:10:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:10:21.810 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:10:21.810 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:10:21.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:10:21.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:10:21.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:10:21.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:10:21.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:10:22.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:10:22.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:10:22.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:10:22.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:10:22.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:10:22.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:10:22.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:10:22.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:10:21
2026-05-28T14:10:22.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69185, datetime.datetime(2026, 5, 28, 14, 10, 21), datetime.datetime(2026, 5, 28, 14, 10, 21), 'salt', 15.35, 29.0, None, 13.66, 255.82, 17.93, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:10:22.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:10:22.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:10:22.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:21, diff=1.139211s, valid=True
2026-05-28T14:10:22.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:10:22.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:10:22.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:12, diff=10.142467s, valid=True
2026-05-28T14:10:22.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:10:22.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:19, diff=3.149048s, valid=True
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:10:22.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:10:22.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:12, diff=10.152092s, valid=True
2026-05-28T14:10:22.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:10:22.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:10:22.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:10:22.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902864.152793s, valid=True
2026-05-28T14:10:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:10:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:10:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:10:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:10:22.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:10:22.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:10:22.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:10:22.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:10:22.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:10:22.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:10:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:10:22.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:10:22.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:10:22.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:10:22.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:10:23.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:10:23.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:10:23.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:10:23.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-28T14:10:23.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-28T14:10:23.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:10:23.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:10:53.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:10:53.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:10:53.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:10:53.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:10:53.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:10:54.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:10:54.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-28T14:10:54.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:10:54.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-28T14:10:54.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:10:54.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:10:54.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:10:54.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-28T14:10:56.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-28T14:10:56.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:10:56.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:10:56.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:10:56.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:10:56.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:10:56.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:10:56.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:10:56.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:10:56.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:10:56.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:10:56.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:10:56.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:10:56.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:10:56.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:10:56.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:10:56.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:10:56.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:10:56.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:10:56.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:10:56.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:10:56.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:10:56.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:10:56.841 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:10:56.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:10:52
2026-05-28T14:10:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69186, datetime.datetime(2026, 5, 28, 14, 10, 52), datetime.datetime(2026, 5, 28, 14, 10, 51), 'salt', 15.09, 27.27, None, 13.09, 242.06, 18.72, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:10:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:10:56.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:10:56.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:51, diff=5.903433s, valid=True
2026-05-28T14:10:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:10:56.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:10:56.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:12, diff=-15.093752s, valid=True
2026-05-28T14:10:56.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:10:56.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:10:56.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:10:50, diff=6.912949s, valid=True
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:10:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:10:56.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:12, diff=-15.084032s, valid=True
2026-05-28T14:10:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:10:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:10:56.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:10:56.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902898.916641s, valid=True
2026-05-28T14:10:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:10:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:10:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:10:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:10:56.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:10:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:10:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:10:56.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:10:56.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:10:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:10:57.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:10:57.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:10:57.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:10:57.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:10:57.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:10:57.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:10:57.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:10:57.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:10:57.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-28T14:10:57.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-28T14:10:58.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:10:58.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:11:28.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:11:28.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:11:28.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:11:28.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:11:28.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:11:28.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:11:28.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-28T14:11:28.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:11:28.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-28T14:11:28.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:11:28.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:11:28.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:11:28.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:11:31.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-28T14:11:31.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:11:31.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:11:31.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:11:31.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:11:31.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:11:31.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:11:31.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:11:31.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:11:31.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:11:31.253 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:11:31.253 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:11:31.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:11:31.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:11:31.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:11:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:11:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:11:31.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:11:31.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:11:31.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:11:31.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:11:31.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:11:31.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:11:31.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:11:31.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:11:22
2026-05-28T14:11:31.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69187, datetime.datetime(2026, 5, 28, 14, 11, 22), datetime.datetime(2026, 5, 28, 14, 11, 22), 'salt', 15.02, 28.73, None, 14.72, 258.75, 18.01, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:11:31.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:11:31.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:11:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:22, diff=9.569388s, valid=True
2026-05-28T14:11:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:11:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:11:31.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:12, diff=19.572249s, valid=True
2026-05-28T14:11:31.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:11:31.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:11:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:20, diff=11.578943s, valid=True
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:11:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:11:31.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:12, diff=19.581978s, valid=True
2026-05-28T14:11:31.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:11:31.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:11:31.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:11:31.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902933.582638s, valid=True
2026-05-28T14:11:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:11:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:11:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:11:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:11:31.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:11:31.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:11:31.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:11:31.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:11:31.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:11:31.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:11:31.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:11:31.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:11:31.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:11:31.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:11:32.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:11:32.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:11:32.656 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:11:32.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:11:32.657 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:11:32.657 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:11:32.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:11:32.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:12:02.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:12:02.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:12: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-28T14:12:03.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:12:03.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:12:03.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:12:03.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-28T14:12:03.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:12: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-28T14:12:03.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:12:03.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:12:03.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:12:03.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-28T14:12:05.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-28T14:12:05.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:12:05.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:12:05.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:12:05.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:12:05.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:12:05.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:12:05.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:12:05.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:12:05.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:12:05.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:12:05.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:12:05.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:12:06.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:12:06.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:12:06.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:12:06.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:12:06.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:12:06.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:12:06.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:12:06.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:12:06.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:12:06.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:12:06.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:12:06.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:11:52
2026-05-28T14:12:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69188, datetime.datetime(2026, 5, 28, 14, 11, 52), datetime.datetime(2026, 5, 28, 14, 11, 52), 'salt', 15.02, 28.43, None, 13.76, 243.18, 18.15, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:12:06.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:12:06.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:12:06.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:52, diff=14.244571s, valid=True
2026-05-28T14:12:06.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:12:06.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:12:06.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:12, diff=-5.752598s, valid=True
2026-05-28T14:12:06.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:12:06.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:11:50, diff=16.25402s, valid=True
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:12:06.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:12:06.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:12, diff=-5.743003s, valid=True
2026-05-28T14:12:06.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:12:06.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:12:06.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:12:06.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=902968.25765s, valid=True
2026-05-28T14:12:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:12:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:12:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:12:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:12:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:12:06.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:12:06.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:12:06.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:12:06.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:12:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:12:06.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:12:06.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:12:06.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:12:06.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:12:06.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:12:07.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:12:07.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:12:07.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:12: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-28T14:12: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-28T14:12:07.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:12:07.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:12:37.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:12:37.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:12:37.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:12:38.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:12:38.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:12:38.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:12:38.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-28T14:12:38.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:12:38.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-28T14:12:38.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:12:38.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:12:38.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:12:38.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-28T14:12:40.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-28T14:12:40.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:12:40.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:12:40.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:12:40.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:12:40.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:12:40.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:12:40.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:12:40.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:12:40.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:12:40.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:12:40.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:12:40.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:12:40.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:12:40.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:12:40.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:12:40.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:12:41.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:12:41.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:12:41.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:12:41.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:12:41.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:12:41.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:12:41.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:12:41.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:12:22
2026-05-28T14:12:41.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69189, datetime.datetime(2026, 5, 28, 14, 12, 22), datetime.datetime(2026, 5, 28, 14, 12, 22), 'salt', 14.89, 28.1, None, 14.01, 249.89, 18.29, 829.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:12:41.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:12:41.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:12:41.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:22, diff=19.115188s, valid=True
2026-05-28T14:12:41.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:12:41.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:12:41.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:12, diff=29.118065s, valid=True
2026-05-28T14:12:41.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:12:41.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:12:41.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:21, diff=20.124715s, valid=True
2026-05-28T14:12:41.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:12:41.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:12:41.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:12:41.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:12:41.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:12:41.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:12:41.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:12, diff=29.127757s, valid=True
2026-05-28T14:12:41.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:12:41.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:12:41.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:12:41.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903003.128413s, valid=True
2026-05-28T14:12:41.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:12:41.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:12:41.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:12:41.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:12:41.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:12:41.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:12:41.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:12:41.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:12:41.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:12:41.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:12:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:12:41.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:12:41.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:12:41.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:12:41.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:12:42.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:12:42.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:12:42.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:12:42.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-28T14:12:42.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-28T14:12:42.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:12:42.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:13:12.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:13:12.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:13:12.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:13:12.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:13:12.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:13:13.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:13:13.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-28T14:13:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:13:13.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-28T14:13:13.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:13:13.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:13:13.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:13:13.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-28T14:13:15.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-28T14:13:15.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:13:15.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:13:15.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:13:15.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:13:15.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:13:15.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:13:15.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:13:15.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:13:15.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:13:15.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:13:15.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:13:15.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:13:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:13:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:13:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:13:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:13:15.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:13:15.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:13:15.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:13:15.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:13:15.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:13:15.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:13:15.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:13:15.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:12:53
2026-05-28T14:13:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69190, datetime.datetime(2026, 5, 28, 14, 12, 53), datetime.datetime(2026, 5, 28, 14, 12, 52), 'salt', 14.92, 28.83, None, 17.96, 236.55, 17.95, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:13:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:13:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:13:15.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:52, diff=23.995615s, valid=True
2026-05-28T14:13:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:13:15.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:13:15.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:12, diff=3.998456s, valid=True
2026-05-28T14:13:15.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:13:15.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:12:51, diff=25.005013s, valid=True
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:13:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:13:16.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:12, diff=4.008047s, valid=True
2026-05-28T14:13:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:13:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:13:16.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:13:16.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903038.008717s, valid=True
2026-05-28T14:13:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:13:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:13:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:13:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:13:16.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:13:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:13:16.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:13:16.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:13:16.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:13:16.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:13:16.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:13:16.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:13:16.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:13:16.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:13:16.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:13:16.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:13:16.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:13:16.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:13:16.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-28T14:13:16.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-28T14:13:17.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:13:17.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:13:47.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:13:47.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:13:47.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:13:47.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:13:47.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:13:47.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:13:47.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-28T14:13:47.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:13:47.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-28T14:13:47.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:13:47.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:13:47.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:13:47.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-28T14:13:51.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-28T14:13:51.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:13:51.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:13:51.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:13:51.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:13:51.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:13:51.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:13:51.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:13:51.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:13:51.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:13:51.075 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:13:51.075 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:13:51.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:13:51.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:13:51.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:13:51.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:13:51.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:13:51.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:13:51.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:13:51.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:13:51.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:13:51.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:13:51.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:13:51.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:13:51.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:13:23
2026-05-28T14:13:51.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69191, datetime.datetime(2026, 5, 28, 14, 13, 23), datetime.datetime(2026, 5, 28, 14, 13, 22), 'salt', 14.76, 27.21, None, 15.28, 230.52, 18.71, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:13:51.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:13:51.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:13:51.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:22, diff=29.451847s, valid=True
2026-05-28T14:13:51.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:13:51.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:13:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:12, diff=39.454761s, valid=True
2026-05-28T14:13:51.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:13:51.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:21, diff=30.461376s, valid=True
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:13:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:13:51.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:13:12, diff=39.464468s, valid=True
2026-05-28T14:13:51.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:13:51.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:13:51.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:13:51.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903073.465145s, valid=True
2026-05-28T14:13:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:13:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:13:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:13:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:13:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:13:51.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:13:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:13:51.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:13:51.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:13:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:13:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:13:51.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:13:51.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:13:51.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:13:52.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:13:52.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:13:52.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:13:52.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:13:52.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-28T14:13:52.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-28T14:13:52.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:13:52.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:14:22.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:14:22.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:14:22.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:14:23.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:14:23.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:14:23.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:14:23.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-28T14:14:23.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:14: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-28T14:14:23.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:14:23.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:14:23.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:14:23.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-28T14:14:25.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-28T14:14:25.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:14:25.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:14:25.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:14:25.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:14:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:14:25.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:14:25.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:14:25.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:14:25.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:14:25.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:14:25.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:14:25.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:14:25.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:14:25.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:14:25.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:14:25.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:14:26.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:14:26.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:14:26.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:14:26.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:14:26.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:14:26.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:14:26.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:14:26.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:14:23
2026-05-28T14:14:26.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69193, datetime.datetime(2026, 5, 28, 14, 14, 23), datetime.datetime(2026, 5, 28, 14, 14, 23), 'salt', 14.59, 28.57, None, 12.74, 222.93, 18.03, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:14:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:14:26.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:14:26.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:23, diff=3.109772s, valid=True
2026-05-28T14:14:26.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:14:26.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:14:26.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:12, diff=14.112666s, valid=True
2026-05-28T14:14:26.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:14:26.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:22, diff=4.119284s, valid=True
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:14:26.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:14:26.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:12, diff=14.122343s, valid=True
2026-05-28T14:14:26.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:14:26.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:14:26.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:14:26.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903108.123005s, valid=True
2026-05-28T14:14:26.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:14:26.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:14:26.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:14:26.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:14:26.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:14:26.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:14:26.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:14:26.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:14:26.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:14:26.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:14:26.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:14:26.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:14:26.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:14:26.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:14:26.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:14:27.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:14:27.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:14:27.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:14:27.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-28T14:14:27.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-28T14:14:27.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:14:27.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:14:57.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:14:57.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:14:57.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:14:57.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:14:57.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:14:57.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:14:57.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-28T14:14:57.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:14:57.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-28T14:14:57.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:14:57.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:14:57.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:14:57.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-28T14:15:00.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:15:00.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:15:00.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:15:00.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:15:00.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:15:00.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:15:00.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:15:00.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:15:00.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:15:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:15:00.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:15:00.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:15:00.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:15:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:15:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:15:00.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:15:00.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:15:00.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:15:00.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:15:00.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:15:00.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:15:00.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:15:00.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:15:00.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:15:00.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:14:54
2026-05-28T14:15:00.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69194, datetime.datetime(2026, 5, 28, 14, 14, 54), datetime.datetime(2026, 5, 28, 14, 14, 53), 'salt', 14.89, 29.93, None, 12.03, 217.37, 17.45, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:15:00.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:15:00.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:15:00.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:53, diff=7.835104s, valid=True
2026-05-28T14:15:00.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:15:00.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:15:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:12, diff=-11.162001s, valid=True
2026-05-28T14:15:00.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:15:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:15:00.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:14:52, diff=8.844707s, valid=True
2026-05-28T14:15:00.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:15:00.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:15:00.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:15:00.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:15:00.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:15:00.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:15:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:12, diff=-11.15216s, valid=True
2026-05-28T14:15:00.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:15:00.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:15:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:15:00.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903142.848486s, valid=True
2026-05-28T14:15:00.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:15:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:15:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:15:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:15:00.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:15:00.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:15:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:15:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:15:00.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:15:00.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:15:01.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:15:01.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:15:01.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:15:01.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:15:01.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:15:01.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:15:01.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:15:01.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:15:01.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-28T14:15:01.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-28T14:15:02.126 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:15:02.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:15:32.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:15:32.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:15:32.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:15:32.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:15:32.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:15:33.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:15:33.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-28T14:15:33.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:15:33.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-28T14:15:33.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:15:33.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:15:33.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:15:33.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-28T14:15:35.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-28T14:15:35.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:15:35.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:15:35.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:15:35.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:15:35.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:15:35.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:15:35.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:15:35.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:15:35.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:15:35.551 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:15:35.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:15:35.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:15:35.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:15:35.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:15:35.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:15:35.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:15:35.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:15:35.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:15:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:15:35.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:15:35.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:15:35.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:15:35.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:15:35.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:15:24
2026-05-28T14:15:35.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69195, datetime.datetime(2026, 5, 28, 14, 15, 24), datetime.datetime(2026, 5, 28, 14, 15, 23), 'salt', 14.82, 28.07, None, 9.85, 203.19, 18.29, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:15:35.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:15:35.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:15:35.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:23, diff=12.892913s, valid=True
2026-05-28T14:15:35.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:15:35.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:15:35.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:12, diff=23.895801s, valid=True
2026-05-28T14:15:35.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:15:35.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:22, diff=13.902496s, valid=True
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:15:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:15:35.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:12, diff=23.905578s, valid=True
2026-05-28T14:15:35.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:15:35.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:15:35.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:15:35.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903177.906236s, valid=True
2026-05-28T14:15:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:15:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:15:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:15:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:15:35.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:15:35.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:15:35.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:15:35.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:15:35.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:15:36.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:15:36.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:15:36.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:15:36.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:15:36.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:15:36.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:15:36.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:15:36.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:15:36.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:15:36.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-28T14:15:36.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-28T14:15:37.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:15:37.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:16:07.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:16:07.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:16:07.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:16:07.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:16:07.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:16:07.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:16:07.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-28T14:16:07.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:16:07.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-28T14:16:07.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:16:07.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:16:07.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:16:07.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-28T14:16:10.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-28T14:16:10.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:16:10.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:16:10.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:16:10.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:16:10.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:16:10.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:16:10.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:16:10.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:16:10.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:16:10.165 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:16:10.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:16:10.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:16:10.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:16:10.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:16:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:16:10.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:16:10.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:16:10.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:16:10.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:16:10.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:16:10.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:16:10.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:16:10.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:16:10.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:15:54
2026-05-28T14:16:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69196, datetime.datetime(2026, 5, 28, 14, 15, 54), datetime.datetime(2026, 5, 28, 14, 15, 54), 'salt', 14.86, 28.6, None, 9.95, 224.5, 18.05, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:16:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:16:10.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:16:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:54, diff=16.492126s, valid=True
2026-05-28T14:16:10.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:16:10.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:16:10.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:12, diff=-1.505032s, valid=True
2026-05-28T14:16:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:16:10.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:15:52, diff=18.501537s, valid=True
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:16:10.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:16:10.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:12, diff=-1.495461s, valid=True
2026-05-28T14:16:10.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:16:10.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:16:10.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:16:10.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903212.505188s, valid=True
2026-05-28T14:16:10.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:16:10.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:16:10.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:16:10.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:16:10.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:16:10.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:16:10.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:16:10.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:16:10.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:16:10.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:16:10.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:16:10.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:16:10.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:16:10.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:16:11.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:16:11.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:16:11.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:16:11.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:16:11.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-28T14:16:11.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-28T14:16:11.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:16:11.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:16:41.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:16:41.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:16:41.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:16:42.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:16:42.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:16:42.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:16:42.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-28T14:16:42.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:16:42.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-28T14:16:42.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:16:42.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:16:42.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:16:42.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-28T14:16:44.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-28T14:16:44.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:16:44.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:16:44.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:16:44.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:16:44.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:16:44.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:16:44.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:16:44.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:16:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:16:44.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:16:44.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:16:44.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:16:44.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:16:44.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:16:45.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:16:45.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:16:45.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:16:45.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:16:45.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:16:45.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:16:45.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:16:45.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:16:45.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:16:45.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:16:24
2026-05-28T14:16:45.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69197, datetime.datetime(2026, 5, 28, 14, 16, 24), datetime.datetime(2026, 5, 28, 14, 16, 24), 'salt', 14.89, 29.46, None, 12.95, 247.73, 17.66, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:16:45.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:16:45.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:16:45.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:24, diff=21.222154s, valid=True
2026-05-28T14:16:45.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:16:45.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:16:45.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:12, diff=33.224968s, valid=True
2026-05-28T14:16:45.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:16:45.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:23, diff=22.231487s, valid=True
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:16:45.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:16:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:12, diff=33.234513s, valid=True
2026-05-28T14:16:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:16:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:16:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:16:45.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903247.23517s, valid=True
2026-05-28T14:16:45.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:16:45.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:16:45.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:16:45.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:16:45.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:16:45.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:16:45.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:16:45.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:16:45.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:16:45.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:16:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:16:45.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:16:45.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:16:45.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:16:45.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:16:46.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:16:46.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:16:46.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:16:46.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-28T14:16:46.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-28T14:16:46.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:16:46.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:17:16.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:17:16.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:17:16.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:17:16.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:17:16.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:17:17.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:17:17.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-28T14:17:17.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:17:17.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:17:17.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:17:17.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:17:17.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:17:17.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:17:19.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-28T14:17:19.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:17:19.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:17:19.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:17:19.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:17:19.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:17:19.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:17:19.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:17:19.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:17:19.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:17:19.685 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:17:19.685 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:17:19.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:17:19.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:17:19.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:17:19.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:17:19.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:17:19.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:17:19.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:17:19.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:17:19.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:17:19.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:17:19.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:17:19.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:17:20.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:16:55
2026-05-28T14:17:20.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69198, datetime.datetime(2026, 5, 28, 14, 16, 55), datetime.datetime(2026, 5, 28, 14, 16, 55), 'salt', 14.89, 30.39, None, 9.71, 263.09, 17.24, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:17:20.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:17:20.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:17:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:55, diff=25.008135s, valid=True
2026-05-28T14:17:20.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:17:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:17:20.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:12, diff=8.01124s, valid=True
2026-05-28T14:17:20.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:17:20.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:16:53, diff=27.01813s, valid=True
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:17:20.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:17:20.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:12, diff=8.021332s, valid=True
2026-05-28T14:17:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:17:20.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:17:20.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:17:20.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903282.022034s, valid=True
2026-05-28T14:17:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:17:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:17:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:17:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:17:20.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:17:20.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:17:20.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:17:20.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:17:20.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:17:20.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:17:20.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:17:20.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:17:20.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:17:20.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:17:20.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:17:20.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:17:21.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:17:21.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:17:21.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-28T14:17:21.012 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:17:21.280 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:17:21.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:17:51.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:17:51.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:17: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-28T14:17:51.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:17:51.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:17:51.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:17:51.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-28T14:17:51.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:17:51.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-28T14:17:51.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:17:51.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:17:51.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:17:51.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-28T14:17:54.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-28T14:17:54.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:17:54.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:17:54.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:17:54.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:17:54.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:17:54.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:17:54.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:17:54.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:17:54.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:17:54.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:17:54.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:17:54.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:17:54.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:17:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:17:54.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:17:54.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:17:54.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:17:54.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:17:54.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:17:54.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:17:54.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:17:54.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:17:54.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:17:54.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:17:26
2026-05-28T14:17:54.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69199, datetime.datetime(2026, 5, 28, 14, 17, 26), datetime.datetime(2026, 5, 28, 14, 17, 25), 'salt', 14.86, 30.49, None, 8.36, 258.56, 17.19, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:17:54.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:17:54.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:17:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:25, diff=29.540693s, valid=True
2026-05-28T14:17:54.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:17:54.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:17:54.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:12, diff=42.543572s, valid=True
2026-05-28T14:17:54.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:17:54.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:17:54.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:23, diff=31.550757s, valid=True
2026-05-28T14:17:54.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:17:54.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:17:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:17:54.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:17:54.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:17:54.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:17:54.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:17:12, diff=42.554635s, valid=True
2026-05-28T14:17:54.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:17:54.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:17:54.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:17:54.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903316.555483s, valid=True
2026-05-28T14:17:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:17:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:17:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:17:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:17:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:17:54.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:17:54.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:17:54.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:17:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:17:54.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:17:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:17:54.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:17:54.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:17:54.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:17:55.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:17:55.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:17:55.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:17:55.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:17:55.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:17:55.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:17:55.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:17:55.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:18:25.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:18:25.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:18:25.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:18:26.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:18:26.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:18:26.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:18:26.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-28T14:18:26.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:18:26.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-28T14:18:26.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:18:26.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:18:26.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:18:26.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-28T14:18:28.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-28T14:18:28.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:18:28.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:18:28.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:18:28.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:18:28.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:18:28.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:18:28.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:18:28.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:18:28.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:18:28.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:18:28.927 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:18:28.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:18:29.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:18:29.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:18:29.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:18:29.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:18:29.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:18:29.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:18:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:18:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:18:29.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:18:29.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:18:29.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:18:29.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:18:26
2026-05-28T14:18:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69201, datetime.datetime(2026, 5, 28, 14, 18, 26), datetime.datetime(2026, 5, 28, 14, 18, 26), 'salt', 14.99, 28.63, None, 13.16, 241.05, 18.05, 829.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:18:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:18:29.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:18:29.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:26, diff=3.246287s, valid=True
2026-05-28T14:18:29.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:18:29.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:18:29.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:12, diff=17.249126s, valid=True
2026-05-28T14:18:29.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:18:29.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:18:29.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:23, diff=6.255815s, valid=True
2026-05-28T14:18:29.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:18:29.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:18:29.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:18:29.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:18:29.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:18:29.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:18:29.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:12, diff=17.258862s, valid=True
2026-05-28T14:18:29.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:18:29.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:18:29.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:18:29.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903351.259516s, valid=True
2026-05-28T14:18:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:18:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:18:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:18:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:18:29.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:18:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:18:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:18:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:18:29.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:18:29.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:18:29.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:18:29.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:18:29.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:18:29.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:18:29.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:18:30.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:18:30.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:18:30.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:18:30.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-28T14:18:30.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-28T14:18:30.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:18:30.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:19:00.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:19:00.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:19:00.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:19:00.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:19:00.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:19:01.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:19:01.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-28T14:19:01.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:19:01.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:19:01.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:19:01.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:19:01.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:19:01.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-28T14:19:03.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:19:03.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:19:03.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:19:03.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:19:03.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:19:03.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:19:03.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:19:03.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:19:03.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:19:03.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:19:03.617 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:19:03.617 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:19:03.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:19:03.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:19:03.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:19:03.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:19:03.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:19:03.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:19:03.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:19:03.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:19:03.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:19:03.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:19:03.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:19:03.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:19:03.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:18:56
2026-05-28T14:19:03.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69202, datetime.datetime(2026, 5, 28, 14, 18, 56), datetime.datetime(2026, 5, 28, 14, 18, 56), 'salt', 14.86, 29.69, None, 14.43, 217.81, 17.55, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:19:03.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:19:03.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:19:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:56, diff=7.940516s, valid=True
2026-05-28T14:19:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:19:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:19:03.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:12, diff=-8.056693s, valid=True
2026-05-28T14:19:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:19:03.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:19:03.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:18:54, diff=9.949886s, valid=True
2026-05-28T14:19:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:19:03.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:19:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:19:03.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:19:03.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:19:03.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:19:03.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:12, diff=-8.047123s, valid=True
2026-05-28T14:19:03.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:19:03.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:19:03.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:19:03.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903385.953527s, valid=True
2026-05-28T14:19:03.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:19:03.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:19:03.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:19:03.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:19:03.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:19:04.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:19:04.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:19:04.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:19:04.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:19:04.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:19:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:19:04.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:19:04.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:19:04.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:19:04.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:19:04.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:19:05.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:19:05.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:19:05.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-28T14:19:05.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-28T14:19:05.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:19:05.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:19:35.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:19:35.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:19:35.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:19:35.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:19:35.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:19:35.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:19:35.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-28T14:19:35.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:19:35.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-28T14:19:35.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:19:35.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:19:35.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:19:35.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:19:38.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-28T14:19:38.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:19:38.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:19:38.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:19:38.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:19:38.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:19:38.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:19:38.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:19:38.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:19:38.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:19:38.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:19:38.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:19:38.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:19:38.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:19:38.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:19:38.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:19:38.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:19:38.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:19:38.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:19:38.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:19:38.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:19:38.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:19:38.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:19:38.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:19:38.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:19:26
2026-05-28T14:19:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69203, datetime.datetime(2026, 5, 28, 14, 19, 26), datetime.datetime(2026, 5, 28, 14, 19, 26), 'salt', 14.66, 28.4, None, 11.15, 217.79, 18.12, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:19:38.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:19:38.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:19:38.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:26, diff=12.67581s, valid=True
2026-05-28T14:19:38.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:19:38.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:19:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:12, diff=26.678718s, valid=True
2026-05-28T14:19:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:19:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:24, diff=14.685503s, valid=True
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:19:38.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:19:38.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:12, diff=26.688606s, valid=True
2026-05-28T14:19:38.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:19:38.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:19:38.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:19:38.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903420.68928s, valid=True
2026-05-28T14:19:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:19:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:19:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:19:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:19:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:19:38.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:19:38.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:19:38.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:19:38.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:19:38.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:19:38.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:19:38.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:19:38.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:19:39.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:19:39.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:19:39.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:19:39.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:19:39.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:19:39.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-28T14:19:39.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-28T14:19:39.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:19:39.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:20:09.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:20:09.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:20:09.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:20:10.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:20:10.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:20:10.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:20:10.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-28T14:20:10.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:20:10.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-28T14:20:10.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:20:10.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:20:10.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:20:10.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-28T14:20:12.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-28T14:20:12.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:20:12.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:20:12.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:20:12.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:20:12.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:20:13.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:20:13.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:20:13.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:20:13.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:20:13.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:20:13.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:20:13.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:20:13.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:20:13.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:20:13.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:20:13.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:20:13.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:20:13.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:20:13.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:20:13.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:20:13.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:20:13.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:20:13.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:20:13.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:19:57
2026-05-28T14:20:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69204, datetime.datetime(2026, 5, 28, 14, 19, 57), datetime.datetime(2026, 5, 28, 14, 19, 56), 'salt', 14.52, 29.16, None, 10.09, 232.54, 17.74, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:20:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:20:13.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:20:13.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:56, diff=17.336709s, valid=True
2026-05-28T14:20:13.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:20:13.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:20:13.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:12, diff=1.339599s, valid=True
2026-05-28T14:20:13.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:20:13.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:19:54, diff=19.346336s, valid=True
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:20:13.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:20:13.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:12, diff=1.349425s, valid=True
2026-05-28T14:20:13.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:20:13.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:20:13.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:20:13.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903455.3501s, valid=True
2026-05-28T14:20:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:20:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:20:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:20:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:20:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:20:13.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:20:13.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:20:13.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:20:13.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:20:13.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:20:13.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:20:13.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:20:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:20:13.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:20:13.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:20:14.317 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:20:14.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:20:14.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:20:14.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-28T14:20:14.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-28T14:20:14.487 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:20:14.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:20:44.517 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:20:44.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:20:44.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:20:44.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:20:44.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:20:45.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:20:45.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-28T14:20:45.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:20:45.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-28T14:20:45.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:20:45.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:20:45.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:20:45.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:20:47.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-28T14:20:47.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:20:47.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:20:47.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:20:47.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:20:47.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:20:47.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:20:47.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:20:47.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:20:47.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:20:47.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:20:47.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:20:47.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:20:48.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:20:48.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:20:48.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:20:48.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:20:48.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:20:48.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:20:48.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:20:48.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:20:48.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:20:48.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:20:48.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:20:48.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:20:27
2026-05-28T14:20:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69205, datetime.datetime(2026, 5, 28, 14, 20, 27), datetime.datetime(2026, 5, 28, 14, 20, 27), 'salt', 14.52, 28.83, None, 8.22, 208.83, 17.89, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:20:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:20:48.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:20:48.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:27, diff=21.259006s, valid=True
2026-05-28T14:20:48.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:20:48.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:20:48.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:12, diff=36.261885s, valid=True
2026-05-28T14:20:48.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:20:48.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:20:48.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:25, diff=23.268627s, valid=True
2026-05-28T14:20:48.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:20:48.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:20:48.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:20:48.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:20:48.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:20:48.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:20:48.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:12, diff=36.271654s, valid=True
2026-05-28T14:20:48.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:20:48.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:20:48.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:20:48.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903490.272299s, valid=True
2026-05-28T14:20:48.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:20:48.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:20:48.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:20:48.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:20:48.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:20:48.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:20:48.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:20:48.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:20:48.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:20:48.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:20:48.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:20:48.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:20:48.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:20:48.592 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:20:48.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:20:49.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:20:49.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:20:49.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:20:49.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-28T14:20:49.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-28T14:20:49.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:20:49.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:21:19.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:21:19.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:21:19.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:21:19.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:21:19.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:21:20.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:21:20.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:21:20.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:21:20.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-28T14:21:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:21:20.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:21:20.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:21:20.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:21:23.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-28T14:21:23.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:21:23.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:21:23.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:21:23.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:21:23.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:21:23.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:21:23.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:21:23.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:21:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:21:23.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:21:23.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:21:23.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:21:23.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:21:23.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:21:23.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:21:23.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:21:23.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:21:23.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:21:23.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:21:23.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:21:23.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:21:23.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:21:23.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:21:23.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:20:57
2026-05-28T14:21:23.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69206, datetime.datetime(2026, 5, 28, 14, 20, 57), datetime.datetime(2026, 5, 28, 14, 20, 57), 'salt', 14.66, 29.0, None, 8.68, 216.94, 17.84, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:21:23.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:21:23.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:21:23.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:57, diff=26.658464s, valid=True
2026-05-28T14:21:23.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:21:23.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:21:23.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:21:12, diff=11.661344s, valid=True
2026-05-28T14:21:23.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:21:23.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:20:55, diff=28.668166s, valid=True
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:21:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:21:23.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:21:12, diff=11.671268s, valid=True
2026-05-28T14:21:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:21:23.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:21:23.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:21:23.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903525.671995s, valid=True
2026-05-28T14:21:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:21:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:21:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:21:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:21:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:21:23.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:21:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:21:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:21:23.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:21:23.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:21:23.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:21:23.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:21:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:21:24.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:21:24.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:21:24.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:21:24.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:21:24.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:21:24.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:21:24.729 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:21:24.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:21:24.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:21:54.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:21:54.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:21:54.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:21:55.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:21:55.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:21:55.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:21:55.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-28T14:21:55.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:21:55.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-28T14:21:55.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:21:55.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:21:55.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:21:55.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-28T14:21:57.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-28T14:21:57.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:21:57.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:21:57.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:21:57.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:21:57.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:21:57.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:21:57.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:21:57.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:21:57.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:21:57.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:21:57.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:21:57.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:21:57.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:21:57.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:21:58.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:21:58.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:21:58.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:21:58.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:21:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:21:58.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:21:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:21:58.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:21:58.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:21:58.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:21:58
2026-05-28T14:21:58.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69208, datetime.datetime(2026, 5, 28, 14, 21, 58), datetime.datetime(2026, 5, 28, 14, 21, 57), 'salt', 14.72, 28.9, None, 13.45, 218.91, 17.89, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:21:58.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:21:58.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:21:58.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:21:57, diff=1.212524s, valid=True
2026-05-28T14:21:58.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:21:58.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:21:58.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:12, diff=-13.784324s, valid=True
2026-05-28T14:21:58.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:21:58.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:21:58.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:21:56, diff=2.222695s, valid=True
2026-05-28T14:21:58.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:21:58.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:21:58.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:21:58.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:21:58.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:21:58.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:21:58.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:12, diff=-13.77424s, valid=True
2026-05-28T14:21:58.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:21:58.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:21:58.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:21:58.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903560.22642s, valid=True
2026-05-28T14:21:58.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:21:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:21:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:21:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:21:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:21:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:21:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:21:58.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:21:58.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:21:58.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:21:58.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:21:58.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:21:58.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:21:58.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:21:58.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:21:59.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:21:59.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:21:59.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:21:59.258 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:21:59.258 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:21:59.447 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:21:59.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:22:29.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:22:29.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:22:29.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:22:29.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:22:29.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:22:29.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:22:29.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-28T14:22:29.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:22:29.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-28T14:22:29.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:22:29.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:22:29.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:22:29.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-28T14:22:32.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:22:32.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:22:32.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:22:32.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:22:32.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:22:32.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:22:32.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:22:32.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:22:32.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:22:32.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:22:32.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:22:32.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:22:32.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:22:32.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:22:32.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:22:32.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:22:32.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:22:32.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:22:32.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:22:32.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:22:32.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:22:32.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:22:32.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:22:32.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:22:32.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:22:28
2026-05-28T14:22:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69209, datetime.datetime(2026, 5, 28, 14, 22, 28), datetime.datetime(2026, 5, 28, 14, 22, 28), 'salt', 14.66, 30.99, None, 11.36, 229.63, 16.95, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:22:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:22:32.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:22:32.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:28, diff=4.748605s, valid=True
2026-05-28T14:22:32.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:22:32.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:22:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:12, diff=20.751417s, valid=True
2026-05-28T14:22:32.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:22:32.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:27, diff=5.758087s, valid=True
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:22:32.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:22:32.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:12, diff=20.761108s, valid=True
2026-05-28T14:22:32.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:22:32.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:22:32.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:22:32.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903594.761774s, valid=True
2026-05-28T14:22:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:22:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:22:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:22:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:22:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:22:32.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:22:32.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:22:32.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:22:32.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:22:32.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:22:32.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:22:32.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:22:33.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:22:33.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:22:33.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:22:33.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:22:33.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:22:33.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:22:33.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-28T14:22:33.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-28T14:22:33.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:22:33.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:23:04.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:23:04.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:23:04.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:23:04.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:23:04.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:23:04.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:23:04.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-28T14:23:04.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:23:04.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-28T14:23:04.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:23:04.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:23:04.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:23:04.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-28T14:23:07.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-28T14:23:07.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:23:07.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:23:07.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:23:07.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:23:07.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:23:07.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:23:07.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:23:07.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:23:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:23:07.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:23:07.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:23:07.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:23:07.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:23:07.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:23:07.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:23:07.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:23:07.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:23:07.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:23:07.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:23:07.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:23:07.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:23:07.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:23:07.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:23:07.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:22:59
2026-05-28T14:23:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69210, datetime.datetime(2026, 5, 28, 14, 22, 59), datetime.datetime(2026, 5, 28, 14, 22, 58), 'salt', 14.76, 29.53, None, 8.22, 222.74, 17.61, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:23:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:23:07.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:23:07.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:58, diff=9.416527s, valid=True
2026-05-28T14:23:07.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:23:07.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:23:07.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:12, diff=-4.580631s, valid=True
2026-05-28T14:23:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:23:07.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:22:56, diff=11.426006s, valid=True
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:23:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:23:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:12, diff=-4.571008s, valid=True
2026-05-28T14:23:07.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:23:07.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:23:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:23:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903629.42966s, valid=True
2026-05-28T14:23:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:23:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:23:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:23:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:23:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:23:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:23:07.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:23:07.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:23:07.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:23:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:23:07.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:23:07.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:23:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:23:07.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:23:08.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:23:08.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:23:08.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:23:08.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:23:08.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-28T14:23:08.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-28T14:23:09.038 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:23:09.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:23:39.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:23:39.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:23:39.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:23:39.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:23:39.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:23:39.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:23:39.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-28T14:23:39.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:23:39.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:23:39.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:23:39.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:23:39.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:23:39.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-28T14:23:42.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-28T14:23:42.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:23:42.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:23:42.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:23:42.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:23:42.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:23:42.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:23:42.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:23:42.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:23:42.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:23:42.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:23:42.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:23:42.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:23:42.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:23:42.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:23:42.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:23:42.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:23:42.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:23:42.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:23:42.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:23:42.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:23:42.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:23:42.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:23:42.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:23:42.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:23:29
2026-05-28T14:23:42.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69211, datetime.datetime(2026, 5, 28, 14, 23, 29), datetime.datetime(2026, 5, 28, 14, 23, 28), 'salt', 14.62, 29.2, None, 7.02, 258.4, 17.74, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:23:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:23:42.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:23:42.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:28, diff=14.543141s, valid=True
2026-05-28T14:23:42.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:23:42.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:23:42.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:12, diff=30.546585s, valid=True
2026-05-28T14:23:42.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:23:42.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:26, diff=16.55332s, valid=True
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:23:42.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:23:42.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:12, diff=30.556949s, valid=True
2026-05-28T14:23:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:23:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:23:42.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:23:42.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903664.557637s, valid=True
2026-05-28T14:23:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:23:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:23:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:23:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:23:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:23:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:23:42.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:23:42.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:23:42.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:23:42.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:23:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:23:42.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:23:42.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:23:42.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:23:43.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:23:43.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:23:43.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:23:43.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:23:43.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-28T14:23:43.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-28T14:23:43.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:23:43.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:24:13.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:24:13.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:24:13.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:24:14.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:24:14.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:24:14.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:24:14.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-28T14:24:14.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:24:14.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-28T14:24:14.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:24:14.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:24:14.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:24:14.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-28T14:24:16.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-28T14:24:16.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:24:16.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:24:16.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:24:16.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:24:16.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:24:16.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:24:16.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:24:16.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:24:16.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:24:16.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:24:16.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:24:16.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:24:16.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:24:16.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:24:16.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:24:16.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:24:16.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:24:16.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:24:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:24:16.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:24:16.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:24:16.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:24:16.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:24:17.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:23:59
2026-05-28T14:24:17.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69212, datetime.datetime(2026, 5, 28, 14, 23, 59), datetime.datetime(2026, 5, 28, 14, 23, 59), 'salt', 14.66, 29.96, None, 4.8, 255.09, 17.4, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:24:17.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:24:17.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:24:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:59, diff=18.061196s, valid=True
2026-05-28T14:24:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:24:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:24:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:12, diff=5.064043s, valid=True
2026-05-28T14:24:17.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:24:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:24:17.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:23:56, diff=21.070775s, valid=True
2026-05-28T14:24:17.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:24:17.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:24:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:24:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:24:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:24:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:24:17.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:12, diff=5.073773s, valid=True
2026-05-28T14:24:17.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:24:17.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:24:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:24:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903699.074448s, valid=True
2026-05-28T14:24:17.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:24:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:24:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:24:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:24:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:24:17.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:24:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:24:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:24:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:24:17.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:24:17.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:24:17.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:24:17.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:24:17.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:24:17.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:24:18.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:24:18.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:24:18.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:24:18.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-28T14:24:18.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-28T14:24:18.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:24:18.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:24:48.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:24:48.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:24:48.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:24:48.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:24:48.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:24:48.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:24:48.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-28T14:24:48.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:24:48.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-28T14:24:48.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:24:48.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:24:48.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:24:48.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:24:51.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-28T14:24:51.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:24:51.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:24:51.379 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:24:51.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:24:51.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:24:51.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:24:51.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:24:51.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:24:51.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:24:51.404 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:24:51.404 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:24:51.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:24:51.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:24:51.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:24:51.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:24:51.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:24:51.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:24:51.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:24:51.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:24:51.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:24:51.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:24:51.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:24:51.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:24:51.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:24:29
2026-05-28T14:24:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69213, datetime.datetime(2026, 5, 28, 14, 24, 29), datetime.datetime(2026, 5, 28, 14, 24, 29), 'salt', 14.72, 28.86, None, 3.07, 322.96, 17.91, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:24:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:24:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:24:51.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:29, diff=22.730637s, valid=True
2026-05-28T14:24:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:24:51.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:24:51.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:12, diff=39.733514s, valid=True
2026-05-28T14:24:51.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:24:51.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:27, diff=24.740248s, valid=True
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:24:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:24:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:12, diff=39.743321s, valid=True
2026-05-28T14:24:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:24:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:24:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:24:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903733.743973s, valid=True
2026-05-28T14:24:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:24:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:24:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:24:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:24:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:24:51.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:24:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:24:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:24:51.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:24:51.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:24:51.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:24:51.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:24:52.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:24:52.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:24:52.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:24:52.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:24:52.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:24:52.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:24:52.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-28T14:24:52.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-28T14:24:53.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:24:53.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:25:23.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:25:23.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:25:23.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:25:23.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:25:24.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:25:24.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:25:24.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:25:24.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:25:24.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-28T14:25:24.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:25:24.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:25:24.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:25:24.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-28T14:25:27.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-28T14:25:27.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:25:27.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:25:27.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:25:27.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:25:27.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:25:27.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:25:27.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:25:27.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:25:27.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:25:27.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:25:27.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:25:27.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:25:27.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:25:27.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:25:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:25:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:25:27.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:25:27.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:25:27.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T14:25:27.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:25:27.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:25:27.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:25:27.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:25:27.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:24:59
2026-05-28T14:25:27.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69214, datetime.datetime(2026, 5, 28, 14, 24, 59), datetime.datetime(2026, 5, 28, 14, 24, 59), 'salt', 14.76, 29.49, None, 5.58, 304.7, 17.63, 829.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:25:27.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:25:27.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:25:27.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:59, diff=28.806464s, valid=True
2026-05-28T14:25:27.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:25:27.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:25:27.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:25:12, diff=15.809351s, valid=True
2026-05-28T14:25:27.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:25:27.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:24:57, diff=30.816118s, valid=True
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:25:27.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T14:25:27.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:25:12, diff=15.819094s, valid=True
2026-05-28T14:25:27.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:25:27.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:25:27.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:25:27.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903769.819751s, valid=True
2026-05-28T14:25:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:25:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:25:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:25:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:25:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:25:27.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:25:27.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:25:27.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:25:27.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:25:27.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:25:28.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:25:28.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:25:28.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:25:28.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:25:28.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:25:28.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:25:28.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:25:28.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:25:28.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-28T14:25:28.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-28T14:25:29.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:25:29.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:25:59.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:25:59.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:25:59.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:25:59.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:25:59.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:25:59.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:25:59.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-28T14:25:59.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:25: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-28T14:25:59.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:25:59.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:25:59.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:25:59.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-28T14:26:01.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-28T14:26:01.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:26:01.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:26:01.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:26:01.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:26:01.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:26:01.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:26:01.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:26:01.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:26:01.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:26:01.999 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:26:01.999 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:26:02.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:26:02.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:26:02.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:26:02.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:26:02.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:26:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:26:02.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:26:02.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:26:02.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:26:02.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:26:02.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:26:02.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:26:02.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:26:00
2026-05-28T14:26:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69216, datetime.datetime(2026, 5, 28, 14, 26), datetime.datetime(2026, 5, 28, 14, 25, 59), 'salt', 15.15, 30.55, None, 9.53, 223.34, 17.19, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:26:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:26:02.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:26:02.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:25:59, diff=3.31399s, valid=True
2026-05-28T14:26:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:26:02.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:26:02.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:12, diff=-9.683077s, valid=True
2026-05-28T14:26:02.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:26:02.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:25:57, diff=5.323583s, valid=True
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:26:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:26:02.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:26:02.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:12, diff=-9.67333s, valid=True
2026-05-28T14:26:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:26:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:26:02.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:26:02.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903804.327321s, valid=True
2026-05-28T14:26:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:26:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:26:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:26:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:26:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:26:02.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:26:02.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:26:02.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:26:02.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:26:02.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:26:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:26:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:26:02.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:26:02.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:26:02.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:26:03.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:26:03.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:26:03.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:26:03.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-28T14:26:03.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-28T14:26:03.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:26:03.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:26:33.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:26:33.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:26:33.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:26:33.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:26:33.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:26:34.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:26:34.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:26:34.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:26:34.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-28T14:26:34.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:26:34.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:26:34.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:26:34.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-28T14:26:36.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-28T14:26:36.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:26:36.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:26:36.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:26:36.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:26:36.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:26:36.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:26:36.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:26:36.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:26:36.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:26:36.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:26:36.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:26:36.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:26:36.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:26:36.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:26:36.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:26:36.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:26:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:26:36.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:26:36.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:26:36.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:26:36.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:26:36.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:26:36.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:26:36.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:26:30
2026-05-28T14:26:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69217, datetime.datetime(2026, 5, 28, 14, 26, 30), datetime.datetime(2026, 5, 28, 14, 26, 30), 'salt', 15.28, 29.43, None, 11.08, 259.62, 17.72, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:26:36.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:26:36.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:26:36.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:30, diff=6.855805s, valid=True
2026-05-28T14:26:36.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:26:36.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:26:36.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:12, diff=24.858608s, valid=True
2026-05-28T14:26:36.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:26:36.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:28, diff=8.865224s, valid=True
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:26:36.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:26:36.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:12, diff=24.868237s, valid=True
2026-05-28T14:26:36.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:26:36.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:26:36.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:26:36.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903838.868904s, valid=True
2026-05-28T14:26:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:26:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:26:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:26:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:26:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:26:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:26:36.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:26:36.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:26:37.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:26:37.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:26:37.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:26:37.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:26:37.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:26:37.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:26:37.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:26:37.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:26:37.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:26:37.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:26:37.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-28T14:26:37.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-28T14:26:38.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:26:38.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:27:08.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:27:08.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:27:08.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:27:08.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:27:08.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:27:08.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:27:08.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-28T14:27:08.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:27:08.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-28T14:27:08.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:27:08.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:27:08.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:27:08.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-28T14:27:11.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-28T14:27:11.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:27:11.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:27:11.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:27:11.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:27:11.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:27:11.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:27:11.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:27:11.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:27:11.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:27:11.378 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:27:11.378 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:27:11.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:27:11.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:27:11.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:27:11.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:27:11.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:27:11.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:27:11.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:27:11.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:27:11.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:27:11.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:27:11.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:27:11.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:27:11.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:27:00
2026-05-28T14:27:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69218, datetime.datetime(2026, 5, 28, 14, 27), datetime.datetime(2026, 5, 28, 14, 27), 'salt', 15.42, 28.93, None, 12.95, 255.75, 17.97, 829.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:27:11.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:27:11.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:27:11.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:00, diff=11.694922s, valid=True
2026-05-28T14:27:11.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:27:11.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:27:11.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:12, diff=-0.302165s, valid=True
2026-05-28T14:27:11.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:27:11.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:26:59, diff=12.704598s, valid=True
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:27:11.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:27:11.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:27:11.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:12, diff=-0.292354s, valid=True
2026-05-28T14:27:11.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:27:11.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:27:11.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:27:11.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903873.7083s, valid=True
2026-05-28T14:27:11.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:27:11.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:27:11.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:27:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:27:11.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:27:11.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:27:11.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:27:11.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:27:11.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:27:11.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:27:11.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:27:11.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:27:11.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:27:12.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:27:12.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:27:12.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:27:12.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:27:12.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:27:12.694 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:27:12.694 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:27:12.850 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:27:12.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:27:42.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:27:42.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:27:42.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:27:43.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:27:43.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:27:43.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:27:43.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-28T14:27:43.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:27: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-28T14:27:43.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:27:43.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:27:43.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:27:43.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-28T14:27:45.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-28T14:27:45.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:27:45.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:27:45.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:27:45.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:27:45.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:27:45.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:27:45.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:27:45.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:27:45.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:27:45.744 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:27:45.744 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:27:45.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:27:45.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:27:45.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:27:45.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:27:45.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:27:45.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:27:45.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:27:45.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:27:45.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:27:45.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:27:45.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:27:45.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:27:46.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:27:31
2026-05-28T14:27:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69219, datetime.datetime(2026, 5, 28, 14, 27, 31), datetime.datetime(2026, 5, 28, 14, 27, 30), 'salt', 15.72, 26.88, None, 15.74, 229.82, 19.01, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:27:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:27:46.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:27:46.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:30, diff=16.057978s, valid=True
2026-05-28T14:27:46.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:27:46.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:27:46.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:12, diff=34.060815s, valid=True
2026-05-28T14:27:46.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:27:46.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:28, diff=18.06745s, valid=True
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:27:46.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:27:46.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:12, diff=34.07045s, valid=True
2026-05-28T14:27:46.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:27:46.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:27:46.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:27:46.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903908.071109s, valid=True
2026-05-28T14:27:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:27:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:27:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:27:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:27:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:27:46.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:27:46.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:27:46.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:27:46.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:27:46.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:27:46.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:27:46.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:27:46.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:27:46.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:27:46.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:27:46.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:27:47.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:27:47.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:27:47.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-28T14:27:47.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-28T14:27:47.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:27:47.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:28:17.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:28:17.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:28:17.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:28:17.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:28:17.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:28:17.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:28:17.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-28T14:28:17.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:28:17.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-28T14:28:17.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:28:17.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:28:17.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:28:17.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-28T14:28:20.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:28:20.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:28:20.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:28:20.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:28:20.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:28:20.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:28:20.393 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:28:20.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:28:20.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:28:20.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:28:20.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:28:20.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:28:20.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:28:20.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:28:20.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:28:20.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:28:20.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:28:20.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:28:20.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:28:20.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:28:20.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:28:20.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:28:20.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:28:20.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:28:20.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:28:01
2026-05-28T14:28:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69220, datetime.datetime(2026, 5, 28, 14, 28, 1), datetime.datetime(2026, 5, 28, 14, 28), 'salt', 15.62, 25.12, None, 12.46, 236.05, 19.89, 829.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:28:20.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:28:20.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:28:20.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:00, diff=20.718016s, valid=True
2026-05-28T14:28:20.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:28:20.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:28:20.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:12, diff=8.720873s, valid=True
2026-05-28T14:28:20.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:28:20.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:27:58, diff=22.727442s, valid=True
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:28:20.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:28:20.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:12, diff=8.730476s, valid=True
2026-05-28T14:28:20.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:28:20.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:28:20.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:28:20.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903942.731136s, valid=True
2026-05-28T14:28:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:28:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:28:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:28:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:28:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:28:20.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:28:20.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:28:20.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:28:20.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:28:20.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:28:20.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:28:20.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:28:21.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:28:21.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:28:21.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:28:21.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:28:21.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:28:21.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:28:21.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-28T14:28:21.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-28T14:28:22.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:28:22.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:28:52.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:28:52.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:28:52.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:28:52.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:28:52.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:28:52.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:28:52.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-28T14:28:52.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:28:52.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-28T14:28:52.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:28:52.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:28:52.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:28:52.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-28T14:28:54.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-28T14:28:54.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:28:54.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:28:54.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:28:54.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:28:54.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:28:54.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:28:54.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:28:54.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:28:54.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:28:54.984 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:28:54.985 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:28:54.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:28:55.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:28:55.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:28:55.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:28:55.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:28:55.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:28:55.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:28:55.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:28:55.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:28:55.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:28:55.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:28:55.244 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:28:55.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:28:31
2026-05-28T14:28:55.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69221, datetime.datetime(2026, 5, 28, 14, 28, 31), datetime.datetime(2026, 5, 28, 14, 28, 31), 'salt', 15.25, 23.13, None, 12.21, 217.29, 20.92, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:28:55.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:28:55.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:28:55.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:31, diff=24.309762s, valid=True
2026-05-28T14:28:55.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:28:55.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:28:55.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:12, diff=43.312613s, valid=True
2026-05-28T14:28:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:28:55.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:29, diff=26.319176s, valid=True
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:28:55.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:28:55.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:12, diff=43.322188s, valid=True
2026-05-28T14:28:55.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:28:55.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:28:55.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:28:55.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=903977.32285s, valid=True
2026-05-28T14:28:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:28:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:28:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:28:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:28:55.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:28:55.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:28:55.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:28:55.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:28:55.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:28:55.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:28:55.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:28:55.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:28:55.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:28:55.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:28:55.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:28:56.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:28:56.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:28:56.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:28:56.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-28T14:28:56.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-28T14:28:56.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:28:56.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:29:26.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:29:26.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:29:26.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:29:26.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:29:26.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:29:27.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:29:27.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-28T14:29:27.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:29:27.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-28T14:29:27.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:29:27.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:29:27.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:29:27.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:29:29.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-28T14:29:29.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:29:29.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:29:29.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:29:29.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:29:29.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:29:29.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:29:29.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:29:29.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:29:29.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:29:29.708 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:29:29.708 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:29:29.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:29:29.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:29:29.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:29:29.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:29:29.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:29:29.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:29:29.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:29:29.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:29:29.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:29:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:29:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:29:29.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:29:30.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:29:01
2026-05-28T14:29:30.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69222, datetime.datetime(2026, 5, 28, 14, 29, 1), datetime.datetime(2026, 5, 28, 14, 29, 1), 'salt', 15.05, 24.66, None, 11.12, 215.98, 20.05, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:29:30.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:29:30.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:29:30.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:29:01, diff=29.047695s, valid=True
2026-05-28T14:29:30.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:29:30.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:29:30.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:29:12, diff=18.05081s, valid=True
2026-05-28T14:29:30.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:29:30.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:29:30.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:28:59, diff=31.058997s, valid=True
2026-05-28T14:29:30.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:29:30.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:29:30.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:29:30.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:29:30.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:29:30.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:29:30.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:29:12, diff=18.063757s, valid=True
2026-05-28T14:29:30.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:29:30.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:29:30.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:29:30.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904012.064432s, valid=True
2026-05-28T14:29:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:29:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:29:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:29:30.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:29:30.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:29:30.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:29:30.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:29:30.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:29:30.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:29:30.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:29:30.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:29:30.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:29:30.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:29:30.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:29:30.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:29:31.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:29:31.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:29:31.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:29:31.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-28T14:29:31.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-28T14:29:31.209 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:29:31.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:30:01.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:30:01.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:30:01.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:30:01.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:30:01.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:30:01.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:30:01.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-28T14:30:01.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:30:01.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-28T14:30:01.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:30:01.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:30:01.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:30:01.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-28T14:30:04.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-28T14:30:04.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:30:04.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:30:04.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:30:04.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:30:04.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:30:04.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:30:04.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:30:04.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:30:04.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:30:04.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:30:04.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:30:04.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:30:04.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:30:04.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:30:04.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:30:04.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:30:04.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:30:04.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:30:04.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:30:04.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:30:04.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:30:04.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:30:04.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:30:04.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:30:02
2026-05-28T14:30:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69224, datetime.datetime(2026, 5, 28, 14, 30, 2), datetime.datetime(2026, 5, 28, 14, 30, 1), 'salt', 14.92, 25.52, None, 7.17, 210.45, 19.58, 829.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:30:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:30:04.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:30:04.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:01, diff=3.584299s, valid=True
2026-05-28T14:30:04.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:30:04.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:30:04.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=-7.412918s, valid=True
2026-05-28T14:30:04.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:30:04.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:29:59, diff=5.593384s, valid=True
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:30:04.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:30:04.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=-7.403756s, valid=True
2026-05-28T14:30:04.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:30:04.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:30:04.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:30:04.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904046.596876s, valid=True
2026-05-28T14:30:04.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:30:04.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:30:04.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:30:04.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:30:04.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:30:04.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:30:04.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:30:04.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:30:04.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:30:04.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:30:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:30:04.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:30:04.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:30:04.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:30:05.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:30:05.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:30:05.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:30:05.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:30:05.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:30:05.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:30:05.826 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:30:05.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:30:35.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:30:35.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:30:35.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:30:36.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:30:36.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:30:36.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:30:36.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-28T14:30:36.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:30:36.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-28T14:30:36.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:30:36.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:30:36.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:30:36.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-28T14:30:39.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-28T14:30:39.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:30:39.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:30:39.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:30:39.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:30:39.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:30:39.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:30:39.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:30:39.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:30:39.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:30:39.310 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:30:39.311 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:30:39.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:30:39.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:30:39.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:30:39.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:30:39.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:30:39.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:30:39.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:30:39.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:30:39.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:30:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:30:39.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:30:39.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:30:39.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:30:32
2026-05-28T14:30:39.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69225, datetime.datetime(2026, 5, 28, 14, 30, 32), datetime.datetime(2026, 5, 28, 14, 30, 31), 'salt', 14.95, 25.48, None, 8.68, 241.75, 19.6, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:30:39.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:30:39.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:30:39.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:31, diff=8.639018s, valid=True
2026-05-28T14:30:39.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:30:39.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:30:39.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=27.641856s, valid=True
2026-05-28T14:30:39.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:30:39.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:30, diff=9.648464s, valid=True
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:30:39.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:30:39.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=27.651512s, valid=True
2026-05-28T14:30:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:30:39.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:30:39.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:30:39.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904081.652166s, valid=True
2026-05-28T14:30:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:30:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:30:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:30:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:30:39.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:30:39.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:30:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:30:39.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:30:39.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:30:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:30:39.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:30:39.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:30:39.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:30:40.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:30:40.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:30:40.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:30:40.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:30:40.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:30:40.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-28T14:30:40.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:30:42.256 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:30:42.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:31:12.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:31:12.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:31:12.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:31:12.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:31:12.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:31:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:31: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-28T14:31:13.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:31:13.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-28T14:31:13.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:31:13.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:31:13.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:31:13.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-28T14:31:16.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-28T14:31:16.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:31:16.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:31:16.598 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:31:16.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:31:16.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:31:16.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:31:16.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:31:16.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:31:16.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:31:16.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:31:16.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:31:16.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:31:16.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:31:16.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:31:16.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:31:16.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:31:16.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:31:16.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:31:16.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T14:31:16.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:31:16.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:31:16.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:31:16.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:31:16.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:31:02
2026-05-28T14:31:16.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69226, datetime.datetime(2026, 5, 28, 14, 31, 2), datetime.datetime(2026, 5, 28, 14, 31, 1), 'salt', 14.95, 25.88, None, 9.95, 212.35, 19.39, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:31:16.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:31:16.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:31:16.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:31:01, diff=15.935003s, valid=True
2026-05-28T14:31:16.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:31:16.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:31:16.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=64.937924s, valid=True
2026-05-28T14:31:16.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:31:16.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:31:16.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:31:00, diff=16.944643s, valid=True
2026-05-28T14:31:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:31:16.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:31:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:31:16.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:31:16.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:31:16.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T14:31:16.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=64.947715s, valid=True
2026-05-28T14:31:16.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:31:16.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:31:16.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:31:16.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904118.94837s, valid=True
2026-05-28T14:31:16.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:31:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:31:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:31:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:31:16.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:31:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:31:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:31:17.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:31:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:31:17.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:31:17.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:31:17.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:31:17.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:31:17.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:31:17.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:31:17.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:31:17.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:31:17.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:31:17.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-28T14:31:17.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-28T14:31:18.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:31:18.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:31:48.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:31:48.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:31:48.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:31:48.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:31:48.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:31:49.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:31:49.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-28T14:31:49.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:31:49.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-28T14:31:49.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:31:49.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:31:49.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:31:49.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-28T14:31:51.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-28T14:31:51.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:31:51.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:31:51.674 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:31:51.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:31:51.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:31:51.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:31:51.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:31:51.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:31:51.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:31:51.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:31:51.695 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:31:51.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:31:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:31:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:31:51.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:31:51.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:31:51.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:31:51.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:31:51.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:31:51.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:31:51.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:31:51.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:31:51.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:31:52.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:31:32
2026-05-28T14:31:52.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69227, datetime.datetime(2026, 5, 28, 14, 31, 32), datetime.datetime(2026, 5, 28, 14, 31, 32), 'salt', 15.12, 27.6, None, 8.79, 214.95, 18.56, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:31:52.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:31:52.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:31:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:31:32, diff=20.036614s, valid=True
2026-05-28T14:31:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:31:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:31:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=100.03947s, valid=True
2026-05-28T14:31:52.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:31:52.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:31:32, diff=20.046022s, valid=True
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:31:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:31:52.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=100.049047s, valid=True
2026-05-28T14:31:52.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:31:52.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:31:52.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:31:52.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904154.049701s, valid=True
2026-05-28T14:31:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:31:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:31:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:31:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:31:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:31:52.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:31:52.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:31:52.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:31:52.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:31:52.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:31:52.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:31:52.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:31:52.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:31:52.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:31:52.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:31:53.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:31:53.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:31:53.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:31:53.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-28T14:31:53.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-28T14:31:53.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:31:53.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:32:23.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:32:23.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:32:23.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:32:23.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:32:23.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:32:23.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:32:23.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:32:23.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:32:23.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-28T14:32:23.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:32:23.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:32:23.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:32:23.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-28T14:32:26.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-28T14:32:26.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:32:26.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:32:26.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:32:26.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:32:26.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:32:26.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:32:26.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:32:26.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:32:26.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:32:26.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:32:26.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:32:26.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:32:26.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:32:26.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:32:26.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:32:26.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:32:26.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:32:26.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:32:26.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T14:32:26.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:32:26.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:32:26.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:32:26.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:32:26.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:32:02
2026-05-28T14:32:26.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69228, datetime.datetime(2026, 5, 28, 14, 32, 2), datetime.datetime(2026, 5, 28, 14, 32, 2), 'salt', 15.09, 26.78, None, 7.66, 231.2, 18.97, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:32:26.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:32:26.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:32:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:32:02, diff=24.657399s, valid=True
2026-05-28T14:32:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:32:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:32:26.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=134.660353s, valid=True
2026-05-28T14:32:26.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:32:26.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:32:00, diff=26.667109s, valid=True
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:32:26.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T14:32:26.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=134.670312s, valid=True
2026-05-28T14:32:26.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:32:26.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:32:26.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:32:26.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904188.671033s, valid=True
2026-05-28T14:32:26.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:32:26.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:32:26.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:32:26.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:32:26.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:32:26.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:32:26.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:32:26.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:32:26.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:32:26.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:32:26.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:32:26.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:32:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:32:27.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:32:27.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:32:27.559 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:32:27.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:32:27.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:32:27.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-28T14:32:27.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-28T14:32:27.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:32:27.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:32:57.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:32:57.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:32:57.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:32:58.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:32:58.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:32:58.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:32:58.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:32:58.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:32:58.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-28T14:32:58.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:32:58.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:32:58.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:32:58.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-28T14:33:01.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-28T14:33:01.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:33:01.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:33:01.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:33:01.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:33:01.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:33:01.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:33:01.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:33:01.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:33:01.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:33:01.936 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:33:01.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:33:01.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:33:02.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:33:02.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:33:02.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:33:02.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:33:02.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:33:02.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:33:02.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:33:02.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:33:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:33:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:33:02.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:33:02.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:32:33
2026-05-28T14:33:02.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69229, datetime.datetime(2026, 5, 28, 14, 32, 33), datetime.datetime(2026, 5, 28, 14, 32, 32), 'salt', 14.82, 27.11, None, 5.68, 189.47, 18.76, 829.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:33:02.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:33:02.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:33:02.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:32:32, diff=30.252338s, valid=True
2026-05-28T14:33:02.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:33:02.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:33:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=170.255234s, valid=True
2026-05-28T14:33:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:33:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:33:02.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:32:30, diff=32.261915s, valid=True
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:33:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:33:02.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=170.264993s, valid=True
2026-05-28T14:33:02.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:33:02.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:33:02.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:33:02.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904224.26566s, valid=True
2026-05-28T14:33:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:33:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:33:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:33:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:33:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:33:02.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:33:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:33:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:33:02.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:33:02.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:33:02.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:33:02.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:33:02.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:33:02.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:33:02.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:33:03.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:33:03.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:33:03.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:33:03.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-28T14:33:03.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-28T14:33:03.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:33:03.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:33:33.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:33:33.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:33:33.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:33:33.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:33:33.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:33:33.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:33:33.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-28T14:33:33.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:33:33.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-28T14:33:33.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:33:33.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:33:33.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:33:33.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-28T14:33:36.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-28T14:33:36.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:33:36.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:33:36.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:33:36.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:33:36.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:33:36.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:33:36.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:33:36.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:33:36.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:33:36.348 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:33:36.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:33:36.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:33:36.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:33:36.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:33:36.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:33:36.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:33:36.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:33:36.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:33:36.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T14:33:36.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:33:36.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:33:36.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:33:36.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:33:36.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:33:33
2026-05-28T14:33:36.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69231, datetime.datetime(2026, 5, 28, 14, 33, 33), datetime.datetime(2026, 5, 28, 14, 33, 33), 'salt', 14.92, 26.68, None, 6.57, 184.4, 18.99, 829.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:33:36.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:33:36.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:33:36.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:33:33, diff=3.67578s, valid=True
2026-05-28T14:33:36.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:33:36.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:33:36.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=204.678653s, valid=True
2026-05-28T14:33:36.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:33:36.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:33:31, diff=5.685369s, valid=True
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:33:36.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T14:33:36.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=204.688372s, valid=True
2026-05-28T14:33:36.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:33:36.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:33:36.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:33:36.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904258.689044s, valid=True
2026-05-28T14:33:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:33:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:33:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:33:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:33:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:33:36.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:33:36.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:33:36.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:33:36.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:33:36.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:33:36.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:33:36.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:33:36.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:33:37.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:33:37.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:33:37.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:33:37.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:33:37.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:33:37.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-28T14:33:37.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-28T14:33:37.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:33:37.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:34:07.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:34:07.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:34:07.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:34:08.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:34:08.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:34:09.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:34:09.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-28T14:34:09.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:34:09.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-28T14:34:09.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:34:09.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:34:09.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:34:09.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-28T14:34:11.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-28T14:34:11.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:34:11.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:34:11.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:34:11.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:34:11.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:34:11.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:34:11.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:34:11.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:34:11.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:34:11.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:34:11.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:34:11.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:34:11.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:34:11.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:34:11.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:34:11.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:34:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:34:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:34:11.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:34:11.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:34:11.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:34:11.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:34:11.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:34:12.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:34:03
2026-05-28T14:34:12.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69232, datetime.datetime(2026, 5, 28, 14, 34, 3), datetime.datetime(2026, 5, 28, 14, 34, 3), 'salt', 14.99, 27.34, None, 7.17, 228.64, 18.68, 829.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:34:12.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:34:12.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:34:12.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:34:03, diff=9.034439s, valid=True
2026-05-28T14:34:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:34:12.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:34:12.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=240.037267s, valid=True
2026-05-28T14:34:12.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:34:12.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:34:12.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:34:01, diff=11.043871s, valid=True
2026-05-28T14:34:12.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:34:12.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:34:12.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:34:12.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:34:12.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:34:12.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:34:12.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=240.046915s, valid=True
2026-05-28T14:34:12.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:34:12.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:34:12.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:34:12.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904294.047564s, valid=True
2026-05-28T14:34:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:34:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:34:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:34:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:34:12.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:34:12.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:34:12.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:34:12.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:34:12.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:34:12.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:34:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:34:12.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:34:12.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:34:12.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:34:12.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:34:12.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:34:13.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:34:13.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:34:13.039 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:34:13.039 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:34:13.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:34:13.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:34:43.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:34:43.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:34:43.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:34:43.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:34:43.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:34:44.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:34:44.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:34:44.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:34:44.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-28T14:34:44.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:34:44.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:34:44.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:34:44.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-28T14:34:46.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-28T14:34:46.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:34:46.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:34:46.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:34:46.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:34:46.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:34:46.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:34:46.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:34:46.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:34:46.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:34:46.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:34:46.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:34:46.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:34:46.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:34:46.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:34:46.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:34:46.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:34:46.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:34:46.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:34:46.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:34:46.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:34:46.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:34:46.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:34:46.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:34:46.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:34:34
2026-05-28T14:34:46.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69233, datetime.datetime(2026, 5, 28, 14, 34, 34), datetime.datetime(2026, 5, 28, 14, 34, 33), 'salt', 15.08, 26.31, None, 2.54, 220.46, 19.19, 829.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:34:46.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:34:46.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:34:46.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:34:33, diff=13.860191s, valid=True
2026-05-28T14:34:46.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:34:46.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:34:46.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=274.863131s, valid=True
2026-05-28T14:34:46.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:34:46.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:34:46.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:34:30, diff=16.869835s, valid=True
2026-05-28T14:34:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:34:46.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:34:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:34:46.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:34:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:34:46.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:34:46.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=274.872878s, valid=True
2026-05-28T14:34:46.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:34:46.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:34:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:34:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904328.873531s, valid=True
2026-05-28T14:34:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:34:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:34:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:34:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:34:46.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:34:46.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:34:46.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:34:46.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:34:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:34:47.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:34:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:34:47.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:34:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:34:47.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:34:47.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:34:47.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:34:47.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:34:47.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:34:47.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-28T14:34:47.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-28T14:34:48.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:34:48.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:35:18.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:35:18.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:35:18.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:35:18.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:35:18.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:35:18.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:35:18.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-28T14:35:18.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:35:18.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-28T14:35:18.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:35:18.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:35:18.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:35:18.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-28T14:35: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-28T14:35:21.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:35:21.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:35:21.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:35:21.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:35:21.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:35:21.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:35:21.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:35:21.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:35:21.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:35:21.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:35:21.429 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:35:21.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:35:21.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:35:21.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:35:21.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:35:21.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:35:21.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:35:21.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:35:21.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:35:21.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:35:21.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:35:21.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:35:21.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:35:21.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:35:04
2026-05-28T14:35:21.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69234, datetime.datetime(2026, 5, 28, 14, 35, 4), datetime.datetime(2026, 5, 28, 14, 35, 3), 'salt', 15.12, 26.44, None, 1.41, 147.52, 19.14, 829.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:35:21.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:35:21.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:35:21.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:35:03, diff=18.760078s, valid=True
2026-05-28T14:35:21.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:35:21.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:35:21.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=309.762919s, valid=True
2026-05-28T14:35:21.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:35:21.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:35:21.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:35:02, diff=19.769617s, valid=True
2026-05-28T14:35:21.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:35:21.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:35:21.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:35:21.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:35:21.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:35:21.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:35:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:30:12, diff=309.772646s, valid=True
2026-05-28T14:35:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:35:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:35:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:35:21.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904363.773299s, valid=True
2026-05-28T14:35:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:35:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:35:21.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:35:21.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:35:21.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:35:21.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:35:21.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:35:21.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:35:21.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:35:21.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:35:21.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:35:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:35:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:35:22.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:35:22.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:35:22.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:35:22.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:35:22.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:35:22.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-28T14:35:22.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-28T14:35:23.022 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:35:23.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:35:53.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:35:53.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:35:53.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:35:53.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:35:53.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:35:53.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:35:53.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-28T14:35:53.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:35:53.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-28T14:35:53.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:35:53.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:35:53.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:35:53.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-28T14:35:56.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-28T14:35:56.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:35:56.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:35:56.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:35:56.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:35:56.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:35:56.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:35:56.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:35:56.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:35:56.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:35:56.082 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:35:56.082 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:35:56.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:35:56.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:35:56.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:35:56.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:35:56.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:35:56.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:35:56.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:35:56.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:35:56.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:35:56.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:35:56.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:35:56.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:35:56.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:35:34
2026-05-28T14:35:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69235, datetime.datetime(2026, 5, 28, 14, 35, 34), datetime.datetime(2026, 5, 28, 14, 35, 34), 'salt', 15.35, 28.47, None, 2.9, 140.28, 18.18, 829.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:35:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:35:56.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:35:56.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:35:34, diff=22.399126s, valid=True
2026-05-28T14:35:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:35:56.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:35:56.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:12, diff=-15.597889s, valid=True
2026-05-28T14:35:56.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:35:56.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:35:56.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:35:33, diff=23.408618s, valid=True
2026-05-28T14:35:56.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:35:56.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:35:56.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:35:56.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:35:56.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:35:56.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:35:56.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:12, diff=-15.58834s, valid=True
2026-05-28T14:35:56.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:35:56.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:35:56.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:35:56.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904398.412314s, valid=True
2026-05-28T14:35:56.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:35:56.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:35:56.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:35:56.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:35:56.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:35:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:35:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:35:56.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:35:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:35:56.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:35:56.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:35:56.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:35:56.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:35:56.734 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:35:57.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:35:57.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:35:57.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:35:57.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:35:57.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-28T14:35:57.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-28T14:35:57.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:35:57.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:36:27.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:36:27.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:36:27.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:36:28.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:36:28.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:36:28.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:36:28.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-28T14:36:28.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:36:28.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-28T14:36:28.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:36:28.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:36:28.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:36:28.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-28T14:36: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-28T14:36:30.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:36:30.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:36:30.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:36:30.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:36:30.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:36:30.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:36:30.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:36:30.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:36:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:36:30.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:36:30.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:36:30.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:36:30.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:36:30.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:36:30.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:36:30.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:36:30.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:36:30.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:36:31.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:36:31.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:36:31.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:36:31.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:36:31.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:36:31.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:36:04
2026-05-28T14:36:31.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69236, datetime.datetime(2026, 5, 28, 14, 36, 4), datetime.datetime(2026, 5, 28, 14, 36, 4), 'salt', 15.28, 27.57, None, 5.72, 206.86, 18.6, 829.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:36:31.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:36:31.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:36:31.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:04, diff=27.097378s, valid=True
2026-05-28T14:36:31.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:36:31.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:36:31.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:12, diff=19.100216s, valid=True
2026-05-28T14:36:31.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:36:31.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:02, diff=29.107044s, valid=True
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:36:31.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:36:31.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:36:12, diff=19.110054s, valid=True
2026-05-28T14:36:31.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:36:31.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:36:31.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:36:31.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904433.110714s, valid=True
2026-05-28T14:36:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:36:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:36:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:36:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:36:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:36:31.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:36:31.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:36:31.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:36:31.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:36:31.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:36:31.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:36:31.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:36:31.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:36:31.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:36:31.686 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:36:32.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:36:32.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:36:32.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:36:32.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-28T14:36:32.152 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:36:32.386 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:36:32.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:37:02.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:37:02.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:37:02.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:37:02.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:37:02.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:37:03.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:37:03.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-28T14:37:03.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:37:03.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-28T14:37:03.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:37:03.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:37:03.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:37: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-28T14:37:05.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-28T14:37:05.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:37:05.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:37:05.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:37:05.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:37:05.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:37:05.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:37:05.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:37:05.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:37:05.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:37:05.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:37:05.449 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:37:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:37:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:37:05.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:37:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:37:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:37:05.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:37:05.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:37:05.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:37:05.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:37:05.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:37:05.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:37:05.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:37:05.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:37:05
2026-05-28T14:37:05.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69238, datetime.datetime(2026, 5, 28, 14, 37, 5), datetime.datetime(2026, 5, 28, 14, 37, 4), 'salt', 15.55, 29.56, None, 4.38, 143.28, 17.7, 829.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:37:05.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:37:05.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:37:05.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:04, diff=1.767274s, valid=True
2026-05-28T14:37:05.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:37:05.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:37:05.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:12, diff=-6.229875s, valid=True
2026-05-28T14:37:05.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:37:05.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:37:05.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:03, diff=2.776775s, valid=True
2026-05-28T14:37:05.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:37:05.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:37:05.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:37:05.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:37:05.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:37:05.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:37:05.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:12, diff=-6.22024s, valid=True
2026-05-28T14:37:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:37:05.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:37:05.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:37:05.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904467.780407s, valid=True
2026-05-28T14:37:05.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:37:05.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:37:05.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:37:05.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:37:05.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:37:05.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:37:05.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:37:05.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:37:05.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:37:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:37:06.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:37:06.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:37:06.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:37:06.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:37:06.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:37:06.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:37:06.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:37:06.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:37:06.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-28T14:37:06.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-28T14:37:07.048 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:37:07.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:37:37.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:37:37.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:37:37.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:37:37.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:37:37.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:37:37.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:37:37.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-28T14:37:37.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:37:37.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-28T14:37:37.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:37:37.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:37:37.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:37:37.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:37:41.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-28T14:37:41.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:37:41.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:37:41.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:37:41.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:37:41.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:37:41.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:37:41.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:37:41.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:37:41.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:37:41.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:37:41.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:37:41.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:37:41.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:37:41.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:37:42.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:37:42.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:37:42.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:37:42.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:37:42.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:37:42.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:37:42.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:37:42.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:37:42.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:37:42.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:37:35
2026-05-28T14:37:42.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69239, datetime.datetime(2026, 5, 28, 14, 37, 35), datetime.datetime(2026, 5, 28, 14, 37, 34), 'salt', 15.71, 29.56, None, 3.07, 167.31, 17.72, 829.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:37:42.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:37:42.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:37:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:34, diff=8.183723s, valid=True
2026-05-28T14:37:42.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:37:42.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:37:42.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:12, diff=-29.813389s, valid=True
2026-05-28T14:37:42.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:37:42.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:37:33, diff=9.193412s, valid=True
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:37:42.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:37:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:12, diff=-29.803506s, valid=True
2026-05-28T14:37:42.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:37:42.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:37:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:37:42.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904504.197196s, valid=True
2026-05-28T14:37:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:37:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:37:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:37:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:37:42.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:37:42.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:37:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:37:42.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:37:42.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:37:42.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:37:42.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:37:42.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:37:42.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:37:42.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:37:42.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:37:43.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:37:43.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:37:43.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:37:43.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-28T14:37:43.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-28T14:37:43.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:37:43.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:38:13.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:38:13.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:38:13.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:38:13.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:38:13.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:38:14.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:38: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-28T14:38:14.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:38: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-28T14:38:14.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:38:14.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:38:14.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:38:14.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-28T14:38:16.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-28T14:38:16.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:38:16.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:38:16.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:38:16.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:38:16.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:38:16.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:38:16.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:38:16.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:38:16.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:38:16.472 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:38:16.472 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:38:16.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:38:16.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:38:16.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:38:16.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:38:16.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:38:16.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:38:16.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:38:16.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:38:16.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:38:16.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:38:16.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:38:16.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:38:16.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:38:05
2026-05-28T14:38:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69240, datetime.datetime(2026, 5, 28, 14, 38, 5), datetime.datetime(2026, 5, 28, 14, 38, 5), 'salt', 15.75, 28.93, None, 5.01, 165.74, 18.02, 829.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:38:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:38:16.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:38:16.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:05, diff=11.78732s, valid=True
2026-05-28T14:38:16.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:38:16.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:38:16.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:12, diff=4.790239s, valid=True
2026-05-28T14:38:16.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:38:16.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:38:16.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:04, diff=12.80076s, valid=True
2026-05-28T14:38:16.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:38:16.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:38:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:38:16.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:38:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:38:16.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:38:16.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:12, diff=4.803897s, valid=True
2026-05-28T14:38:16.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:38:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:38:16.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:38:16.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904538.80455s, valid=True
2026-05-28T14:38:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:38:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:38:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:38:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:38:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:38:16.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:38:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:38:16.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:38:16.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:38:17.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:38:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:38:17.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:38:17.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:38:17.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:38:17.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:38:17.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:38:17.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:38:17.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:38:17.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-28T14:38:17.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-28T14:38:18.127 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:38:18.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:38:48.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:38:48.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:38:48.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:38:48.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:38:48.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:38:48.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:38:48.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-28T14:38:48.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:38:48.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-28T14:38:48.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:38:48.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:38:48.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:38:48.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:38: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-28T14:38:51.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:38:51.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:38:51.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:38:51.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:38:51.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:38:51.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:38:51.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:38:51.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:38:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:38:51.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:38:51.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:38:51.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:38:51.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:38:51.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:38:51.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:38:51.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:38:51.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:38:51.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:38:51.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:38:51.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:38:51.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:38:51.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:38:51.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:38:51.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:38:35
2026-05-28T14:38:51.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69241, datetime.datetime(2026, 5, 28, 14, 38, 35), datetime.datetime(2026, 5, 28, 14, 38, 35), 'salt', 15.84, 28.2, None, 3.57, 148.9, 18.37, 829.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:38:51.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:38:51.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:38:51.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:35, diff=16.374385s, valid=True
2026-05-28T14:38:51.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:38:51.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:38:51.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:12, diff=-20.622688s, valid=True
2026-05-28T14:38:51.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:38:51.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:38:34, diff=17.384081s, valid=True
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:38:51.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:38:51.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:12, diff=-20.612826s, valid=True
2026-05-28T14:38:51.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:38:51.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:38:51.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:38:51.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904573.387844s, valid=True
2026-05-28T14:38:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:38:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:38:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:38:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:38:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:38:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:38:51.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:38:51.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:38:51.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:38:51.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:38:51.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:38:51.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:38:51.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:38:51.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:38:51.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:38:52.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:38:52.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:38:52.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:38:52.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-28T14:38:52.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-28T14:38:52.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:38:52.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:39:22.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:39:22.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:39:22.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:39:22.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:39:22.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:39:23.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:39:23.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-28T14:39:23.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:39:23.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-28T14:39:23.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:39:23.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:39:23.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:39:23.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-28T14:39:25.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-28T14:39:25.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:39:25.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:39:25.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:39:25.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:39:25.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:39:25.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:39:25.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:39:25.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:39:25.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:39:25.703 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:39:25.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:39:25.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:39:25.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:39:25.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:39:25.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:39:25.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:39:25.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:39:25.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:39:25.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:39:25.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:39:25.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:39:25.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:39:25.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:39:26.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:39:06
2026-05-28T14:39:26.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69242, datetime.datetime(2026, 5, 28, 14, 39, 6), datetime.datetime(2026, 5, 28, 14, 39, 5), 'salt', 15.78, 28.27, None, 4.03, 165.48, 18.33, 829.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:39:26.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:39:26.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:39:26.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:05, diff=21.014045s, valid=True
2026-05-28T14:39:26.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:39:26.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:39:26.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:12, diff=14.01683s, valid=True
2026-05-28T14:39:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:39:26.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:04, diff=22.023336s, valid=True
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:39:26.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:39:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:12, diff=14.026314s, valid=True
2026-05-28T14:39:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:39:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:39:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:39:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904608.026967s, valid=True
2026-05-28T14:39:26.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:39:26.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:39:26.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:39:26.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:39:26.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:39:26.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:39:26.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:39:26.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:39:26.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:39:26.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:39:26.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:39:26.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:39:26.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:39:26.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:39:26.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:39:26.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:39:26.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:39:26.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:39:26.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-28T14:39:26.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-28T14:39:27.060 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:39:27.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:39:57.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:39:57.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:39:57.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:39:57.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:39:57.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:39:57.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:39:57.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-28T14:39:57.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:39:57.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-28T14:39:57.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:39:57.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:39:57.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:39:57.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-28T14:39:59.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-28T14:39:59.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:39:59.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:39:59.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:39:59.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:39:59.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:39:59.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:39:59.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:39:59.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:39:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:39:59.874 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:39:59.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:39:59.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:39:59.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:39:59.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:40:00.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:40:00.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:40:00.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:40:00.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:40:00.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:40:00.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:40:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:40:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:40:00.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:40:00.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:39:36
2026-05-28T14:40:00.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69243, datetime.datetime(2026, 5, 28, 14, 39, 36), datetime.datetime(2026, 5, 28, 14, 39, 35), 'salt', 15.71, 27.31, None, 4.06, 211.22, 18.79, 829.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:40:00.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:40:00.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:40:00.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:35, diff=25.193967s, valid=True
2026-05-28T14:40:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:40:00.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:40:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:12, diff=-11.803014s, valid=True
2026-05-28T14:40:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:40:00.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:40:00.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:39:34, diff=26.203773s, valid=True
2026-05-28T14:40:00.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:40:00.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:40:00.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:40:00.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:40:00.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:40:00.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:40:00.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:12, diff=-11.793137s, valid=True
2026-05-28T14:40:00.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:40:00.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:40:00.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:40:00.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904642.207542s, valid=True
2026-05-28T14:40:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:40:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:40:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:40:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:40:00.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:40:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:40:00.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:40:00.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:40:00.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:40:00.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:40:00.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:40:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:40:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:40:00.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:40:00.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:40:01.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:40:01.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:40:01.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:40:01.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:40:01.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:40:01.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:40:01.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:40:31.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:40:31.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:40:31.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:40:31.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:40:31.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:40:31.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:40:31.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-28T14:40:31.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:40:31.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-28T14:40:31.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:40:31.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:40:31.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:40:31.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-28T14:40: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-28T14:40:34.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:40:34.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:40:34.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:40:34.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:40:34.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:40:34.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:40:34.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:40:34.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:40:34.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:40:34.374 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:40:34.374 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:40:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:40:34.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:40:34.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:40:34.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:40:34.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:40:34.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:40:34.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:40:34.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:40:34.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:40:34.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:40:34.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:40:34.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:40:34.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:40:06
2026-05-28T14:40:34.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69244, datetime.datetime(2026, 5, 28, 14, 40, 6), datetime.datetime(2026, 5, 28, 14, 40, 6), 'salt', 15.61, 26.81, None, 4.2, 269.9, 19.02, 829.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:40:34.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:40:34.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:40:34.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:06, diff=28.741532s, valid=True
2026-05-28T14:40:34.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:40:34.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:40:34.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:12, diff=22.744494s, valid=True
2026-05-28T14:40:34.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:40:34.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:40:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:05, diff=29.751655s, valid=True
2026-05-28T14:40:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:40:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:40:34.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:40:34.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:40:34.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:40:34.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:40:34.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:40:12, diff=22.754671s, valid=True
2026-05-28T14:40:34.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:40:34.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:40:34.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:40:34.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904676.755333s, valid=True
2026-05-28T14:40:34.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:40:34.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:40:34.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:40:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:40:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:40:34.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:40:34.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:40:34.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:40:34.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:40:34.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:40:34.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:40:34.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:40:35.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:40:35.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:40:35.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:40:35.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:40:35.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:40:35.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:40:35.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-28T14:40:35.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-28T14:40:35.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:40:35.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:41:05.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:41:05.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:41:05.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:41:06.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:41:06.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:41:06.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:41:06.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-28T14:41:06.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:41:06.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-28T14:41:06.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:41:06.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:41:06.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:41:06.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-28T14:41:09.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-28T14:41:09.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:41:09.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:41:09.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:41:09.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:41:09.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:41:09.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:41:09.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:41:09.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:41:09.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:41:09.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:41:09.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:41:09.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:41:09.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:41:09.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:41:09.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:41:09.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:41:09.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:41:09.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:41:10.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:41:10.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:41:10.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:41:10.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:41:10.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:41:10.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:41:06
2026-05-28T14:41:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69246, datetime.datetime(2026, 5, 28, 14, 41, 6), datetime.datetime(2026, 5, 28, 14, 41, 6), 'salt', 15.31, 26.41, None, 5.01, 212.48, 19.17, 829.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:41:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:41:10.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:41:10.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:06, diff=4.099187s, valid=True
2026-05-28T14:41:10.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:41:10.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:41:10.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:12, diff=-1.897795s, valid=True
2026-05-28T14:41:10.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:41:10.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:05, diff=5.109128s, valid=True
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:41:10.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:41:10.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:12, diff=-1.887614s, valid=True
2026-05-28T14:41:10.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:41:10.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:41:10.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:41:10.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904712.113134s, valid=True
2026-05-28T14:41:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:41:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:41:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:41:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:41:10.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:41:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:41:10.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:41:10.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:41:10.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:41:10.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:41:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:41:10.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:41:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:41:10.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:41:10.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:41:11.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:41:11.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:41:11.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:41:11.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-28T14:41:11.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-28T14:41:11.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:41:11.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:41:41.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:41:41.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:41:41.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:41:41.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:41:41.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:41:41.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:41:41.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-28T14:41:41.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:41:41.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:41:41.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:41:41.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:41:41.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:41:41.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-28T14:41:44.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-28T14:41:44.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:41:44.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:41:44.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:41:44.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:41:44.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:41:44.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:41:44.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:41:44.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:41:44.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:41:44.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:41:44.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:41:44.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:41:44.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:41:44.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:41:44.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:41:44.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:41:44.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:41:44.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:41:44.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:41:44.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:41:44.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:41:44.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:41:44.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:41:44.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:41:37
2026-05-28T14:41:44.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69247, datetime.datetime(2026, 5, 28, 14, 41, 37), datetime.datetime(2026, 5, 28, 14, 41, 36), 'salt', 15.28, 26.68, None, 6.35, 272.55, 19.04, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:41:44.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:41:44.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:41:44.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:36, diff=8.9011s, valid=True
2026-05-28T14:41:44.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:41:44.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:41:44.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:12, diff=-27.096029s, valid=True
2026-05-28T14:41:44.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:41:44.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:41:44.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:41:35, diff=9.910683s, valid=True
2026-05-28T14:41:44.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:41:44.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:41:44.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:41:44.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:41:44.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:41:44.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:41:44.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:12, diff=-27.086278s, valid=True
2026-05-28T14:41:44.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:41:44.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:41:44.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:41:44.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904746.914374s, valid=True
2026-05-28T14:41:44.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:41:44.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:41:44.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:41:44.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:41:44.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:41:44.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:41:44.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:41:44.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:41:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:41:45.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:41:45.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:41:45.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:41:45.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:41:45.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:41:45.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:41:45.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:41:45.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:41:45.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:41:45.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-28T14:41:45.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-28T14:41:46.158 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:41:46.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:42:16.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:42:16.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:42:16.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:42:16.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:42:16.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:42:16.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:42:16.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-28T14:42:16.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:42:16.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-28T14:42:16.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:42:16.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:42:16.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:42:16.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-28T14:42:19.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-28T14:42:19.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:42:19.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:42:19.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:42:19.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:42:19.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:42:19.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:42:19.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:42:19.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:42:19.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:42:19.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:42:19.182 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:42:19.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:42:19.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:42:19.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:42:19.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:42:19.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:42:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:42:19.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:42:19.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:42:19.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:42:19.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:42:19.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:42:19.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:42:19.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:42:07
2026-05-28T14:42:19.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69248, datetime.datetime(2026, 5, 28, 14, 42, 7), datetime.datetime(2026, 5, 28, 14, 42, 6), 'salt', 15.31, 28.33, None, 6.92, 218.86, 18.23, 829.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:42:19.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:42:19.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:42:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:06, diff=13.510109s, valid=True
2026-05-28T14:42:19.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:42:19.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:42:19.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:12, diff=7.512987s, valid=True
2026-05-28T14:42:19.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:42:19.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:05, diff=14.519577s, valid=True
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:42:19.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:42:19.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:42:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:12, diff=7.52259s, valid=True
2026-05-28T14:42:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:42:19.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:42:19.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:42:19.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904781.523269s, valid=True
2026-05-28T14:42:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:42:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:42:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:42:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:42:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:42:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:42:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:42:19.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:42:19.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:42:19.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:42:19.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:42:19.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:42:19.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:42:19.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:42:20.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:42:20.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:42:20.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:42:20.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:42:20.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-28T14:42:20.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-28T14:42:20.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:42:20.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:42:50.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:42:50.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:42:50.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:42:51.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:42:51.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:42:51.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:42:51.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-28T14:42:51.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:42:51.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-28T14:42:51.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:42:51.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:42:51.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:42:51.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-28T14:42: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-28T14:42:53.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:42:53.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:42:53.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:42:53.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:42:53.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:42:53.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:42:53.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:42:53.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:42:53.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:42:53.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:42:53.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:42:53.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:42:53.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:42:53.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:42:54.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:42:54.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:42:54.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:42:54.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:42:54.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:42:54.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:42:54.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:42:54.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:42:54.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:42:54.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:42:37
2026-05-28T14:42:54.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69249, datetime.datetime(2026, 5, 28, 14, 42, 37), datetime.datetime(2026, 5, 28, 14, 42, 37), 'salt', 15.45, 29.36, None, 7.8, 269.54, 17.78, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:42:54.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:42:54.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:42:54.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:37, diff=17.220555s, valid=True
2026-05-28T14:42:54.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:42:54.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:42:54.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:12, diff=-17.776593s, valid=True
2026-05-28T14:42:54.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:42:54.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:42:54.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:42:36, diff=18.229792s, valid=True
2026-05-28T14:42:54.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:42:54.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:42:54.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:42:54.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:42:54.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:42:54.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:42:54.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:12, diff=-17.767205s, valid=True
2026-05-28T14:42:54.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:42:54.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:42:54.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:42:54.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904816.23343s, valid=True
2026-05-28T14:42:54.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:42:54.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:42:54.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:42:54.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:42:54.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:42:54.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:42:54.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:42:54.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:42:54.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:42:54.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:42:54.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:42:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:42:54.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:42:54.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:42:54.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:42:55.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:42:55.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:42:55.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:42:55.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-28T14:42:55.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-28T14:42:55.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:42:55.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:43:25.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:43:25.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:43:25.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:43:25.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:43:25.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:43:26.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:43:26.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-28T14:43:26.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:43:26.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-28T14:43:26.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:43:26.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:43:26.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:43:26.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-28T14:43:28.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-28T14:43:28.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:43:28.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:43:28.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:43:28.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:43:28.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:43:28.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:43:28.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:43:28.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:43:28.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:43:28.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:43:28.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:43:28.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:43:28.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:43:28.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:43:28.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:43:28.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:43:28.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:43:28.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:43:28.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:43:28.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:43:28.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:43:28.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:43:28.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:43:28.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:43:07
2026-05-28T14:43:28.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69250, datetime.datetime(2026, 5, 28, 14, 43, 7), datetime.datetime(2026, 5, 28, 14, 43, 7), 'salt', 15.38, 28.56, None, 8.79, 253.6, 18.14, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:43:28.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:43:28.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:43:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:07, diff=21.9967s, valid=True
2026-05-28T14:43:28.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:43:28.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:43:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:12, diff=16.999603s, valid=True
2026-05-28T14:43:28.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:43:28.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:06, diff=23.006232s, valid=True
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:43:29.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:43:29.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:12, diff=17.009284s, valid=True
2026-05-28T14:43:29.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:43:29.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:43:29.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:43:29.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904851.009949s, valid=True
2026-05-28T14:43:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:43:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:43:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:43:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:43:29.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:43:29.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:43:29.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:43:29.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:43:29.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:43:29.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:43:29.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:43:29.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:43:29.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:43:29.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:43:29.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:43:29.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:43:30.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:43:30.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:43:30.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-28T14:43:30.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-28T14:43:30.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:43:30.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:44:00.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:44:00.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:44:00.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:44:00.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:44:00.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:44:00.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:44:00.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:44:00.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:44:00.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-28T14:44:01.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:44:01.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:44:01.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:44:01.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-28T14:44:03.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:44:03.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:44:03.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:44:03.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:44:03.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:44:03.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:44:03.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:44:03.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:44:03.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:44:03.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:44:03.551 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:44:03.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:44:03.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:44:03.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:44:03.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:44:03.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:44:03.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:44:03.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:44:03.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:44:03.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:44:03.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:44:03.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:44:03.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:44:03.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:44:03.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:43:37
2026-05-28T14:44:03.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69251, datetime.datetime(2026, 5, 28, 14, 43, 37), datetime.datetime(2026, 5, 28, 14, 43, 37), 'salt', 15.35, 28.56, None, 6.81, 236.56, 18.14, 829.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:44:03.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:44:03.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:44:03.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:37, diff=26.876899s, valid=True
2026-05-28T14:44:03.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:44:03.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:44:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:44:12, diff=-8.120218s, valid=True
2026-05-28T14:44:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:44:03.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:43:36, diff=27.886341s, valid=True
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:44:03.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:44:03.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:44:12, diff=-8.110613s, valid=True
2026-05-28T14:44:03.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:44:03.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:44:03.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:44:03.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904885.890052s, valid=True
2026-05-28T14:44:03.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:44:03.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:44:03.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:44:03.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:44:03.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:44:03.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:44:03.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:44:03.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:44:03.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:44:04.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:44:04.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:44:04.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:44:04.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:44:04.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:44:04.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:44:04.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:44:04.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:44:04.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:44:04.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-28T14:44:04.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-28T14:44:04.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:44:04.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:44:35.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:44:35.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:44:35.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:44:35.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:44:35.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:44:35.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:44:35.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-28T14:44:35.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:44:35.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-28T14:44:35.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:44:35.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:44:35.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:44:35.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-28T14:44:38.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-28T14:44:38.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:44:38.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:44:38.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:44:38.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:44:38.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:44:38.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:44:38.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:44:38.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:44:38.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:44:38.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:44:38.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:44:38.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:44:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:44:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:44:38.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:44:38.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:44:38.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:44:38.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:44:38.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:44:38.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:44:38.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:44:38.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:44:38.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:44:38.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:44:38
2026-05-28T14:44:38.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69253, datetime.datetime(2026, 5, 28, 14, 44, 38), datetime.datetime(2026, 5, 28, 14, 44, 37), 'salt', 15.31, 28.37, None, 7.98, 309.16, 18.22, 829.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:44:38.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:44:38.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:44:38.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:44:37, diff=1.940278s, valid=True
2026-05-28T14:44:38.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:44:38.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:44:38.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:12, diff=-33.056823s, valid=True
2026-05-28T14:44:38.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:44:38.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:44:38.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:44:37, diff=1.950741s, valid=True
2026-05-28T14:44:38.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:44:38.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:44:38.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:44:38.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:44:38.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:44:38.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:44:38.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:12, diff=-33.04604s, valid=True
2026-05-28T14:44:38.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:44:38.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:44:38.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:44:38.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904920.954636s, valid=True
2026-05-28T14:44:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:44:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:44:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:44:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:44:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:44:39.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:44:39.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:44:39.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:44:39.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:44:39.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:44:39.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:44:39.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:44:39.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:44:39.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:44:39.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:44:39.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:44:40.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:44:40.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:44:40.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-28T14:44:40.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-28T14:44:40.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:44:40.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:45:10.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:45:10.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:45:10.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:45:10.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:45:10.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:45:10.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:45:10.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:45:11.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:45:11.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-28T14:45:11.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:45:11.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:45:11.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:45:11.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-28T14:45:13.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-28T14:45:13.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:45:13.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:45:13.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:45:13.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:45:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:45:13.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:45:13.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:45:13.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:45:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:45:13.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:45:13.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:45:13.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:45:13.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:45:13.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:45:13.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:45:13.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:45:14.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:45:14.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:45:14.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:45:14.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:45:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:45:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:45:14.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:45:14.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:45:08
2026-05-28T14:45:14.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69254, datetime.datetime(2026, 5, 28, 14, 45, 8), datetime.datetime(2026, 5, 28, 14, 45, 8), 'salt', 15.35, 29.96, None, 6.04, 336.71, 17.49, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:45:14.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:45:14.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:45:14.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:08, diff=6.105949s, valid=True
2026-05-28T14:45:14.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:45:14.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:45:14.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:12, diff=2.108859s, valid=True
2026-05-28T14:45:14.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:45:14.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:45:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:07, diff=7.115656s, valid=True
2026-05-28T14:45:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:45:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:45:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:45:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:45:14.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:45:14.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:45:14.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:12, diff=2.11874s, valid=True
2026-05-28T14:45:14.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:45:14.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:45:14.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:45:14.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904956.1194s, valid=True
2026-05-28T14:45:14.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:45:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:45:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:45:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:45:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:45:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:45:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:45:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:45:14.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:45:14.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:45:14.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:45:14.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:45:14.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:45:14.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:45:14.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:45:15.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:45:15.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:45:15.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:45:15.111 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:45:15.111 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:45:15.356 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:45:15.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:45:45.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:45:45.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:45:45.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:45:45.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:45:45.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:45:45.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:45:45.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-28T14:45:45.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:45:45.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-28T14:45:45.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:45:45.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:45:45.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:45:45.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-28T14:45:48.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-28T14:45:48.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:45:48.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:45:48.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:45:48.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:45:48.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:45:48.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:45:48.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:45:48.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:45:48.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:45:48.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:45:48.429 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:45:48.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:45:48.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:45:48.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:45:48.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:45:48.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:45:48.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:45:48.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:45:48.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:45:48.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:45:48.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:45:48.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:45:48.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:45:48.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:45:38
2026-05-28T14:45:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69255, datetime.datetime(2026, 5, 28, 14, 45, 38), datetime.datetime(2026, 5, 28, 14, 45, 38), 'salt', 15.45, 30.39, None, 3.43, 349.21, 17.31, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:45:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:45:48.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:45:48.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:38, diff=10.760725s, valid=True
2026-05-28T14:45:48.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:45:48.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:45:48.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:12, diff=-23.236156s, valid=True
2026-05-28T14:45:48.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:45:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:45:37, diff=11.770495s, valid=True
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:45:48.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:45:48.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:12, diff=-23.226484s, valid=True
2026-05-28T14:45:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:45:48.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:45:48.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:45:48.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=904990.774188s, valid=True
2026-05-28T14:45:48.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:45:48.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:45:48.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:45:48.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:45:48.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:45:48.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:45:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:45:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:45:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:45:48.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:45:48.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:45:49.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:45:49.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:45:49.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:45:49.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:45:49.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:45:49.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:45:49.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:45:49.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-28T14:45:49.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-28T14:45:50.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:45:50.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:46:20.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:46:20.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:46:20.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:46:20.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:46:20.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:46:20.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:46:20.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-28T14:46:20.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:46:20.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-28T14:46:20.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:46:20.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:46:20.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:46:20.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-28T14:46:23.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-28T14:46:23.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:46:23.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:46:23.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:46:23.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:46:23.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:46:23.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14: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-28T14:46:23.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:46:23.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:46:23.067 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:46:23.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:46:23.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:46:23.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:46:23.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:46:23.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:46:23.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:46:23.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:46:23.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:46:23.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:46:23.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:46:23.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:46:23.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:46:23.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:46:23.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:46:09
2026-05-28T14:46:23.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69256, datetime.datetime(2026, 5, 28, 14, 46, 9), datetime.datetime(2026, 5, 28, 14, 46, 8), 'salt', 15.68, 28.93, None, 6.67, 247.62, 18.01, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:46:23.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:46:23.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:46:23.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:08, diff=15.385171s, valid=True
2026-05-28T14:46:23.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:46:23.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:46:23.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:12, diff=11.387994s, valid=True
2026-05-28T14:46:23.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:46:23.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:07, diff=16.394578s, valid=True
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:46:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:46:23.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:46:23.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:12, diff=11.397611s, valid=True
2026-05-28T14:46:23.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:46:23.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:46:23.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:46:23.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905025.398267s, valid=True
2026-05-28T14:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:46:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:46:23.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:46:23.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:46:23.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:46:23.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:46:23.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:46:23.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:46:23.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:46:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:46:23.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:46:23.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:46:23.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:46:23.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:46:24.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:46:24.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:46:24.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:46:24.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-28T14:46:24.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-28T14:46:24.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:46:24.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:46:54.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:46:54.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:46:54.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:46:54.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:46:54.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:46:55.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:46:55.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-28T14:46:55.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:46:55.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-28T14:46:55.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:46:55.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:46:55.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:46:55.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:46:57.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-28T14:46:57.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:46:57.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:46:57.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:46:57.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:46:57.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:46:57.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:46:57.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:46:57.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:46:57.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:46:57.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:46:57.502 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:46:57.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:46:57.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:46:57.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:46:57.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:46:57.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:46:57.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:46:57.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:46:57.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:46:57.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:46:57.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:46:57.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:46:57.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:46:57.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:46:39
2026-05-28T14:46:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69257, datetime.datetime(2026, 5, 28, 14, 46, 39), datetime.datetime(2026, 5, 28, 14, 46, 38), 'salt', 15.61, 28.37, None, 7.34, 264.34, 18.26, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:46:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:46:57.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:46:57.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:38, diff=19.814509s, valid=True
2026-05-28T14:46:57.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:46:57.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:46:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:12, diff=-14.182624s, valid=True
2026-05-28T14:46:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:46:57.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:46:57.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:46:37, diff=20.823853s, valid=True
2026-05-28T14:46:57.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:46:57.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:46:57.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:46:57.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:46:57.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:46:57.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:46:57.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:12, diff=-14.173094s, valid=True
2026-05-28T14:46:57.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:46:57.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:46:57.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:46:57.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905059.827555s, valid=True
2026-05-28T14:46:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:46:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:46:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:46:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:46:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:46:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:46:57.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:46:57.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:46:57.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:46:57.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:46:58.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:46:58.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:46:58.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:46:58.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:46:58.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:46:58.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:46:58.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:46:58.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:46:58.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-28T14:46:58.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-28T14:46:58.997 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:46:58.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:47:29.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:47:29.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:47:29.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:47:29.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:47:29.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:47:29.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:47:29.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-28T14:47:29.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:47:29.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-28T14:47:29.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:47:29.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:47:29.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:47:29.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-28T14:47:32.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:47:32.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:47:32.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:47:32.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:47:32.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:47:32.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:47:32.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:47:32.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:47:32.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:47:32.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:47:32.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:47:32.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:47:32.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:47:32.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:47:32.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:47:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:47:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:47:32.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:47:32.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:47:32.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:47:32.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:47:32.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:47:32.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:47:32.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:47:32.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:47:09
2026-05-28T14:47:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69258, datetime.datetime(2026, 5, 28, 14, 47, 9), datetime.datetime(2026, 5, 28, 14, 47, 9), 'salt', 15.68, 29.86, None, 8.54, 314.62, 17.58, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:47:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:47:32.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:47:32.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:09, diff=23.760193s, valid=True
2026-05-28T14:47:32.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:47:32.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:47:32.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:12, diff=20.763026s, valid=True
2026-05-28T14:47:32.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:47:32.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:08, diff=24.769593s, valid=True
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:47:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:47:32.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:47:32.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:12, diff=20.772589s, valid=True
2026-05-28T14:47:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:47:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:47:32.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:47:32.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905094.773254s, valid=True
2026-05-28T14:47:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:47:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:47:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:47:32.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:47:32.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:47:32.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:47:32.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:47:32.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:47:32.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:47:32.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:47:32.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:47:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:47:33.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:47:33.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:47:33.369 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:47:33.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:47:33.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:47:33.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:47:33.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-28T14:47:33.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-28T14:47:33.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:47:33.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:48:03.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:48:03.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:48:03.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:48:04.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:48:04.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:48:04.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:48:04.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-28T14:48:04.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:48:04.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-28T14:48:04.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:48:04.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:48:04.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:48:04.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-28T14:48:06.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-28T14:48:06.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:48:06.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:48:06.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:48:06.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:48:06.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:48:06.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:48:06.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:48:06.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:48:06.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:48:06.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:48:06.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:48:06.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:48:06.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:48:06.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:48:06.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:48:06.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:48:06.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:48:06.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:48:07.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:48:07.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:48:07.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:48:07.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:48:07.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:48:07.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:47:39
2026-05-28T14:48:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69259, datetime.datetime(2026, 5, 28, 14, 47, 39), datetime.datetime(2026, 5, 28, 14, 47, 39), 'salt', 15.81, 29.16, None, 10.48, 290.41, 17.92, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:48:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:48:07.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:48:07.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:39, diff=28.109212s, valid=True
2026-05-28T14:48:07.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:48:07.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:48:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:48:12, diff=-4.887931s, valid=True
2026-05-28T14:48:07.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:48:07.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:48:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:47:38, diff=29.118683s, valid=True
2026-05-28T14:48:07.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:48:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:48:07.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:48:07.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:48:07.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:48:07.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:48:07.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:48:12, diff=-4.878287s, valid=True
2026-05-28T14:48:07.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:48:07.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:48:07.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:48:07.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905129.122359s, valid=True
2026-05-28T14:48:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:48:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:48:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:48:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:48:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:48:07.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:48:07.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:48:07.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:48:07.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:48:07.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:48:07.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:48:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:48:07.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:48:07.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:48:07.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:48:07.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:48:08.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:48:08.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:48:08.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-28T14:48:08.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-28T14:48:08.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:48:08.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:48:38.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:48:38.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:48:38.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:48:38.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:48:38.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:48:39.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:48:39.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-28T14:48:39.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:48:39.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-28T14:48:39.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:48:39.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:48:39.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:48:39.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:48:41.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-28T14:48:41.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:48:41.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:48:41.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:48:41.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:48:41.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:48:41.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:48:41.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:48:41.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:48:41.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:48:41.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:48:41.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:48:41.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:48:41.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:48:41.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:48:41.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:48:41.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:48:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:48:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:48:41.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:48:41.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:48:41.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:48:41.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:48:41.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:48:41.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:48:40
2026-05-28T14:48:41.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69261, datetime.datetime(2026, 5, 28, 14, 48, 40), datetime.datetime(2026, 5, 28, 14, 48, 39), 'salt', 15.38, 27.54, None, 8.33, 315.49, 18.63, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:48:41.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:48:41.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:48:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:48:39, diff=2.932813s, valid=True
2026-05-28T14:48:41.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:48:41.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:48:41.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:12, diff=-30.064348s, valid=True
2026-05-28T14:48:41.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:48:41.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:48:39, diff=2.942247s, valid=True
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:48:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:48:41.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:12, diff=-30.054711s, valid=True
2026-05-28T14:48:41.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:48:41.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:48:41.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:48:41.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905163.945953s, valid=True
2026-05-28T14:48:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:48:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:48:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:48:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:48:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:48:42.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:48:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:48:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:48:42.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:48:42.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:48:42.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:48:42.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:48:42.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:48:42.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:48:42.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:48:42.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:48:42.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:48:42.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:48: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-28T14:48:42.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-28T14:48:43.061 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:48:43.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:49:13.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:49:13.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:49:13.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:49:13.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:49:13.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:49:13.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:49:13.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-28T14:49:13.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:49:13.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-28T14:49:13.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:49:13.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:49:13.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:49:13.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-28T14:49:16.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-28T14:49:16.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:49:16.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:49:16.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:49:16.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:49:16.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:49:16.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:49:16.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:49:16.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:49:16.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:49:16.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:49:16.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:49:16.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:49:16.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:49:16.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:49:16.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:49:16.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:49:16.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:49:16.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:49:16.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:49:16.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:49:16.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:49:16.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:49:16.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:49:16.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:49:10
2026-05-28T14:49:16.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69262, datetime.datetime(2026, 5, 28, 14, 49, 10), datetime.datetime(2026, 5, 28, 14, 49, 10), 'salt', 15.25, 27.4, None, 4.1, 340.81, 18.68, 829.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:49:16.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:49:16.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:49:16.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:10, diff=6.377266s, valid=True
2026-05-28T14:49:16.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:49:16.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:49:16.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:12, diff=4.380642s, valid=True
2026-05-28T14:49:16.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:49:16.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:09, diff=7.387608s, valid=True
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:49:16.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:49:16.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:49:16.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:12, diff=4.39064s, valid=True
2026-05-28T14:49:16.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:49:16.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:49:16.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:49:16.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905198.391411s, valid=True
2026-05-28T14:49:16.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:49:16.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:49:16.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:49:16.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:49:16.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:49:16.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:49:16.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:49:16.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:49:16.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:49:16.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:49:16.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:49:16.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:49:16.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:49:16.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:49:16.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:49:17.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:49:17.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:49:17.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:49:17.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-28T14:49:17.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-28T14:49:17.545 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:49:17.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:49:47.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:49:47.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:49:47.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:49:47.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:49:47.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:49:47.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:49:47.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-28T14:49:47.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:49:47.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-28T14:49:47.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:49:47.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:49:47.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:49:47.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:49:50.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-28T14:49:50.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:49:50.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:49:50.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:49:50.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:49:50.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:49:50.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:49:50.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:49:50.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:49:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:49:50.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:49:50.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:49:50.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:49:50.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:49:50.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:49:50.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:49:50.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:49:50.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:49:50.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:49:50.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:49:50.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:49:50.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:49:50.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:49:50.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:49:50.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:49:40
2026-05-28T14:49:50.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69263, datetime.datetime(2026, 5, 28, 14, 49, 40), datetime.datetime(2026, 5, 28, 14, 49, 40), 'salt', 15.28, 27.87, None, 3.92, 0.92, 18.45, 829.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:49:50.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:49:50.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:49:50.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:40, diff=10.68549s, valid=True
2026-05-28T14:49:50.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:49:50.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:49:50.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:12, diff=-21.311589s, valid=True
2026-05-28T14:49:50.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:49:50.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:49:39, diff=11.695038s, valid=True
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:49:50.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:49:50.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:12, diff=-21.301897s, valid=True
2026-05-28T14:49:50.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:49:50.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:49:50.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:49:50.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905232.698759s, valid=True
2026-05-28T14:49:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:49:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:49:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:49:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:49:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:49:50.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:49:50.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:49:50.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:49:50.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:49:50.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:49:50.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:49:51.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:49:51.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:49:51.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:49:51.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:49:51.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:49:51.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:49:51.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:49:51.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-28T14:49:51.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-28T14:49:51.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:49:51.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:50:21.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:50:21.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:50:21.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:50:22.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:50:22.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:50:22.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:50:22.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-28T14:50:22.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:50:22.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-28T14:50:22.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:50:22.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:50:22.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:50:22.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-28T14:50:24.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-28T14:50:24.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:50:24.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:50:24.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:50:24.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:50:24.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:50:24.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:50:24.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:50:24.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:50:24.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:50:24.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:50:24.750 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:50:24.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:50:24.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:50:24.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:50:24.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:50:24.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:50:24.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:50:24.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:50:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:50:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:50:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:50:25.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:50:25.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:50:25.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:50:10
2026-05-28T14:50:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69264, datetime.datetime(2026, 5, 28, 14, 50, 10), datetime.datetime(2026, 5, 28, 14, 50, 10), 'salt', 15.35, 28.0, None, 2.9, 22.21, 18.4, 829.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:50:25.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:50:25.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:50:25.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:10, diff=15.070528s, valid=True
2026-05-28T14:50:25.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:50:25.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:50:25.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:12, diff=13.073432s, valid=True
2026-05-28T14:50:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:50:25.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:10, diff=15.08015s, valid=True
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:50:25.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:50:25.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:12, diff=13.083208s, valid=True
2026-05-28T14:50:25.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:50:25.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:50:25.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:50:25.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905267.083865s, valid=True
2026-05-28T14:50:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:50:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:50:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:50:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:50:25.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:50:25.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:50:25.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:50:25.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:50:25.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:50:25.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:50:25.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:50:25.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:50:25.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:50:25.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:50:25.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:50:26.006 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:50:26.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:50:26.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:50:26.111 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:50:26.111 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:50:26.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:50:26.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:50:56.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:50:56.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:50:56.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:50:56.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:50:56.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:50:56.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:50:56.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:50:56.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:50:56.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-28T14:50:56.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:50:56.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:50:56.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:50:56.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-28T14:50:59.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-28T14:50:59.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:50:59.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:50:59.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:50:59.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:50:59.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:50:59.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:50:59.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:50:59.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:50:59.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:50:59.059 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:50:59.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:50:59.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:50:59.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:50:59.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:50:59.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:50:59.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:50:59.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:50:59.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:50:59.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:50:59.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:50:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:50:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:50:59.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:50:59.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:50:41
2026-05-28T14:50:59.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69265, datetime.datetime(2026, 5, 28, 14, 50, 41), datetime.datetime(2026, 5, 28, 14, 50, 40), 'salt', 15.51, 28.53, None, 2.19, 2.21, 18.17, 829.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:50:59.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:50:59.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:50:59.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:40, diff=19.382787s, valid=True
2026-05-28T14:50:59.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:50:59.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:50:59.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:12, diff=-12.614355s, valid=True
2026-05-28T14:50:59.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:50:59.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:50:40, diff=19.392233s, valid=True
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:50:59.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:50:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:12, diff=-12.604707s, valid=True
2026-05-28T14:50:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:50:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:50:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:50:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905301.395947s, valid=True
2026-05-28T14:50:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:50:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:50:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:50:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:50:59.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:50:59.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:50:59.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:50:59.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:50:59.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:50:59.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:50:59.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:50:59.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:50:59.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:50:59.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:51:00.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:51:00.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:51:00.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:51:00.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:51:00.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-28T14:51:00.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-28T14:51:00.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:51:00.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:51:30.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:51:30.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:51:30.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:51:30.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:51:30.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:51:31.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:51:31.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-28T14:51:31.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:51:31.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-28T14:51:31.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:51:31.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:51:31.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:51:31.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-28T14:51:33.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-28T14:51:33.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:51:33.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:51:33.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:51:33.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:51:33.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:51:33.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:51:33.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:51:33.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:51:33.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:51:33.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:51:33.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:51:33.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:51:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:51:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:51:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:51:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:51:33.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:51:33.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:51:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:51:33.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:51:33.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:51:33.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:51:33.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:51:33.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:51:11
2026-05-28T14:51:33.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69266, datetime.datetime(2026, 5, 28, 14, 51, 11), datetime.datetime(2026, 5, 28, 14, 51, 10), 'salt', 15.74, 26.15, None, 4.17, 9.08, 19.37, 829.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:51:33.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:51:33.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:51:33.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:10, diff=23.82925s, valid=True
2026-05-28T14:51:33.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:51:33.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:51:33.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:12, diff=21.832122s, valid=True
2026-05-28T14:51:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:51:33.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:51:33.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:10, diff=23.838808s, valid=True
2026-05-28T14:51:33.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:51:33.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:51:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:51:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:51:33.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:12, diff=21.841834s, valid=True
2026-05-28T14:51:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:51:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:51:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:51:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905335.842492s, valid=True
2026-05-28T14:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:51:33.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:51:33.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:51:33.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:51:33.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:51:33.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:51:34.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:51:34.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:51:34.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:51:34.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:51:34.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:51:34.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:51:34.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:51:34.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:51:34.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-28T14:51:34.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-28T14:51:35.081 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:51:35.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:52:05.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:52:05.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:52:05.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:52:05.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:52:05.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:52:05.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:52:05.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-28T14:52:05.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:52:05.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-28T14:52:05.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:52:05.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:52:05.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:52:05.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-28T14:52:07.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-28T14:52:07.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:52:07.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:52:07.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:52:07.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:52:07.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:52:07.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:52:07.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:52:07.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:52:07.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:52:07.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:52:07.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:52:07.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:52:08.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:52:08.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:52:08.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:52:08.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:52:08.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:52:08.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:52:08.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:52:08.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:52:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:52:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:52:08.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:52:08.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:51:41
2026-05-28T14:52:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69267, datetime.datetime(2026, 5, 28, 14, 51, 41), datetime.datetime(2026, 5, 28, 14, 51, 41), 'salt', 15.71, 26.08, None, 3.74, 2.94, 19.4, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:52:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:52:08.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:52:08.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:41, diff=27.25947s, valid=True
2026-05-28T14:52:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:52:08.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:52:08.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:52:12, diff=-3.737717s, valid=True
2026-05-28T14:52:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:52:08.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:52:08.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:51:37, diff=31.268825s, valid=True
2026-05-28T14:52:08.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:52:08.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:52:08.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:52:08.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:52:08.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:52:08.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:52:08.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:52:12, diff=-3.728189s, valid=True
2026-05-28T14:52:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:52:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:52:08.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:52:08.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905370.272458s, valid=True
2026-05-28T14:52:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:52:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:52:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:52:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:52:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:52:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:52:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:52:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:52:08.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:52:08.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:52:08.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:52:08.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:52:08.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:52:08.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:52:08.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:52:09.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:52:09.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:52:09.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:52:09.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-28T14:52:09.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-28T14:52:09.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:52:09.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:52:39.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:52:39.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:52:39.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:52:39.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:52:39.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:52:40.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:52:40.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-28T14:52:40.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:52:40.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-28T14:52:40.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:52:40.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:52:40.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:52:40.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-28T14:52:42.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:52:42.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:52:42.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:52:42.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:52:42.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:52:42.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:52:42.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:52:42.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:52:42.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:52:42.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:52:42.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:52:42.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:52:42.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:52:42.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:52:42.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:52:42.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:52:42.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:52:42.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:52:42.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:52:42.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:52:42.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:52:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:52:42.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:52:42.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:52:42.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:52:41
2026-05-28T14:52:42.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69269, datetime.datetime(2026, 5, 28, 14, 52, 41), datetime.datetime(2026, 5, 28, 14, 52, 41), 'salt', 16.04, 25.55, None, 4.24, 14.07, 19.72, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:52:42.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:52:42.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:52:42.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:52:41, diff=1.982242s, valid=True
2026-05-28T14:52:42.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:52:42.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:52:42.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:12, diff=-29.014879s, valid=True
2026-05-28T14:52:42.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:52:42.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:52:42.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:52:40, diff=2.991871s, valid=True
2026-05-28T14:52:42.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:52:42.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:52:42.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:52:42.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:52:42.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:52:42.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:52:42.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:12, diff=-29.005066s, valid=True
2026-05-28T14:52:42.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:52:42.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:52:42.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:52:42.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905404.995586s, valid=True
2026-05-28T14:52:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:52:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:52:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:52:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:52:42.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:52:43.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:52:43.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:52:43.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:52:43.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:52:43.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:52:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:52:43.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:52:43.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:52:43.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:52:43.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:52:43.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:52:44.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:52:44.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:52:44.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:52:44.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:52:44.229 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:52:44.229 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:53:14.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:53:14.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:53:14.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:53:14.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:53:14.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:53:14.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:53:14.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-28T14:53:14.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:53:14.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-28T14:53:14.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:53:14.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:53:14.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:53:14.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-28T14:53:17.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-28T14:53:17.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:53:17.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:53:17.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:53:17.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:53:17.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:53:17.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:53:17.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:53:17.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:53:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:53:17.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:53:17.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:53:17.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:53:17.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:53:17.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:53:17.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:53:17.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:53:17.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:53:17.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:53:17.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:53:17.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:53:17.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:53:17.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:53:17.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:53:17.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:53:12
2026-05-28T14:53:17.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69270, datetime.datetime(2026, 5, 28, 14, 53, 12), datetime.datetime(2026, 5, 28, 14, 53, 11), 'salt', 16.14, 25.88, None, 3.95, 318.25, 19.57, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:53:17.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:53:17.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:53:17.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:11, diff=6.482501s, valid=True
2026-05-28T14:53:17.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:53:17.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:53:17.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:12, diff=5.485318s, valid=True
2026-05-28T14:53:17.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:53:17.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:53:17.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:11, diff=6.491893s, valid=True
2026-05-28T14:53:17.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:53:17.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:53:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:53:17.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:53:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:53:17.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:53:17.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:12, diff=5.494939s, valid=True
2026-05-28T14:53:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:53:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:53:17.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:53:17.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905439.495602s, valid=True
2026-05-28T14:53:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:53:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:53:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:53:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:53:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:53:17.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:53:17.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:53:17.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:53:17.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:53:17.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:53:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:53:17.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:53:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:53:17.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:53:18.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:53:18.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:53:18.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:53:18.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:53:18.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:53:18.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:53:18.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:53:18.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:53:48.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:53:48.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:53:48.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:53:48.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:53:48.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:53:48.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:53:48.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-28T14:53:48.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:53:48.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-28T14:53:48.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:53:48.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:53:48.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:53:48.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-28T14:53:51.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T14:53:51.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:53:51.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:53:51.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:53:51.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:53:51.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:53:51.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:53:51.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:53:51.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:53:51.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:53:51.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:53:51.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:53:51.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:53:51.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:53:51.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:53:51.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:53:51.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:53:51.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:53:51.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:53:51.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:53:51.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:53:51.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:53:51.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:53:51.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:53:51.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:53:42
2026-05-28T14:53:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69271, datetime.datetime(2026, 5, 28, 14, 53, 42), datetime.datetime(2026, 5, 28, 14, 53, 41), 'salt', 16.27, 26.31, None, 5.3, 329.18, 19.36, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:53:51.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:53:51.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:53:51.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:41, diff=10.73392s, valid=True
2026-05-28T14:53:51.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:53:51.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:53:51.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:12, diff=-20.263226s, valid=True
2026-05-28T14:53:51.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:53:51.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:53:33, diff=18.74332s, valid=True
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:53:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:53:51.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:12, diff=-20.253635s, valid=True
2026-05-28T14:53:51.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:53:51.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:53:51.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:53:51.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905473.747021s, valid=True
2026-05-28T14:53:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:53:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:53:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:53:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:53:51.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:53:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:53:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:53:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:53:51.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:53:51.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:53:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:53:51.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:53:52.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:53:52.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:53:52.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:53:52.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:53:52.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:53:52.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:53:52.823 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T14:53:52.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-28T14:53:52.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:53:52.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:54:22.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:54:22.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:54:22.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:54:23.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:54:23.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:54:23.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:54:23.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-28T14:54:23.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:54:23.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:54:23.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:54:23.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:54:23.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:54: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-28T14:54:26.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-28T14:54:26.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:54:26.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:54:26.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:54:26.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:54:26.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:54:26.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:54:26.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:54:26.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:54:26.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:54:26.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:54:26.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:54:26.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:54:26.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:54:26.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:54:26.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:54:26.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:54:26.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:54:26.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:54:26.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:54:26.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:54:26.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:54:26.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:54:26.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:54:26.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:54:12
2026-05-28T14:54:26.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69272, datetime.datetime(2026, 5, 28, 14, 54, 12), datetime.datetime(2026, 5, 28, 14, 54, 12), 'salt', 16.47, 27.07, None, 13.83, 278.84, 19.01, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:54:26.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:54:26.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:54:26.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:12, diff=14.683885s, valid=True
2026-05-28T14:54:26.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:54:26.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:54:26.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:12, diff=14.686799s, valid=True
2026-05-28T14:54:26.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:54:26.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:04, diff=22.693554s, valid=True
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:54:26.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:54:26.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:54:26.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:12, diff=14.696778s, valid=True
2026-05-28T14:54:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:54:26.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:54:26.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:54:26.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905508.697911s, valid=True
2026-05-28T14:54:26.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:54:26.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:54:26.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:54:26.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:54:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:54:26.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:54:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:54:26.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:54:26.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:54:26.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:54:26.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:54:26.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:54:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:54:27.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:54:27.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:54:27.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:54:27.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:54:27.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:54:27.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-28T14:54:27.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-28T14:54:27.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:54:27.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:54:57.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:54:57.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:54:57.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:54:57.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:54:57.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:54:58.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:54:58.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-28T14:54:58.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:54:58.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-28T14:54:58.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:54:58.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:54:58.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:54:58.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-28T14:55:00.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-28T14:55:00.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:55:00.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:55:00.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:55:00.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:55:00.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:55:00.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:55:00.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:55:00.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:55:00.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:55:00.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:55:00.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:55:00.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:55:00.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:55:00.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:55:00.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:55:00.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:55:00.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:55:00.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:55:00.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:55:00.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:55:00.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:55:00.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:55:00.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:55:01.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:54:42
2026-05-28T14:55:01.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69273, datetime.datetime(2026, 5, 28, 14, 54, 42), datetime.datetime(2026, 5, 28, 14, 54, 41), 'salt', 16.31, 24.75, None, 8.58, 276.5, 20.19, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:55:01.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:55:01.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:55:01.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:41, diff=20.046528s, valid=True
2026-05-28T14:55:01.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:55:01.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:55:01.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:12, diff=-10.950615s, valid=True
2026-05-28T14:55:01.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:55:01.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:54:36, diff=25.055999s, valid=True
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:55:01.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:55:01.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:12, diff=-10.940977s, valid=True
2026-05-28T14:55:01.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:55:01.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:55:01.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:55:01.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905543.059728s, valid=True
2026-05-28T14:55:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:55:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:55:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:55:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:55:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:55:01.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:55:01.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:55:01.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:55:01.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:55:01.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:55:01.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:55:01.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:55:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:55:01.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:55:01.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:55:02.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:55:02.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:55:02.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:55:02.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-28T14:55:02.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-28T14:55:02.294 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:55:02.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:55:32.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:55:32.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:55:32.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:55:32.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:55:32.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:55:32.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:55:32.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-28T14:55:32.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:55:32.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:55:32.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:55:32.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:55:32.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:55:32.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-28T14:55:35.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-28T14:55:35.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:55:35.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:55:35.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:55:35.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:55:35.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:55:35.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:55:35.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:55:35.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:55:35.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:55:35.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:55:35.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:55:35.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:55:35.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:55:35.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:55:35.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:55:35.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:55:35.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:55:35.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:55:35.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:55:35.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:55:35.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:55:35.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:55:35.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:55:35.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:55:12
2026-05-28T14:55:35.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69274, datetime.datetime(2026, 5, 28, 14, 55, 12), datetime.datetime(2026, 5, 28, 14, 55, 12), 'salt', 15.68, 25.18, None, 7.62, 287.14, 19.87, 829.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:55:35.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:55:35.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:55:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:12, diff=23.831339s, valid=True
2026-05-28T14:55:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:55:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:55:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:12, diff=23.834438s, valid=True
2026-05-28T14:55:35.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:55:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:55:35.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:07, diff=28.841671s, valid=True
2026-05-28T14:55:35.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:55:35.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:55:35.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:55:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:55:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:55:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:55:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:12, diff=23.845003s, valid=True
2026-05-28T14:55:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:55:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:55:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:55:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905577.845734s, valid=True
2026-05-28T14:55:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:55:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:55:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:55:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:55:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:55:35.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:55:35.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:55:35.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:55:35.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:55:35.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:55:36.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:55:36.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:55:36.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:55:36.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:55:36.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:55:36.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:55:36.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:55:36.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:55:36.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-28T14:55:36.826 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:55:37.021 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:55:37.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:56:07.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:56:07.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:56:07.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:56:07.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:56:07.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:56:07.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:56:07.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:56:07.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:56:07.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:56:07.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:56:07.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:56:07.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:56:07.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-28T14:56:10.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-28T14:56:10.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:56:10.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:56:10.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:56:10.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:56:10.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:56:10.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:56:10.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:56:10.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:56:10.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:56:10.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:56:10.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:56:10.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:56:10.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:56:10.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:56:10.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:56:10.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:56:10.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:56:10.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:56:11.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:56:11.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:56:11.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:56:11.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:56:11.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:56:11.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:55:43
2026-05-28T14:56:11.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69275, datetime.datetime(2026, 5, 28, 14, 55, 43), datetime.datetime(2026, 5, 28, 14, 55, 42), 'salt', 15.45, 24.92, None, 8.58, 264.96, 19.97, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:56:11.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:56:11.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:56:11.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:42, diff=29.084162s, valid=True
2026-05-28T14:56:11.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:56:11.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:56:11.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:56:12, diff=-0.912921s, valid=True
2026-05-28T14:56:11.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:56:11.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:56:11.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:55:39, diff=32.093662s, valid=True
2026-05-28T14:56:11.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:56:11.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:56:11.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:56:11.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:56:11.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:56:11.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:56:11.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:56:12, diff=-0.903282s, valid=True
2026-05-28T14:56:11.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:56:11.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:56:11.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:56:11.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905613.097363s, valid=True
2026-05-28T14:56:11.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:56:11.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:56:11.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:56:11.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:56:11.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:56:11.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:56:11.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:56:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:56:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:56:11.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:56:11.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:56:11.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:56:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:56:11.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:56:11.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:56:12.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:56:12.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:56:12.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:56:12.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-28T14:56:12.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-28T14:56:12.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:56:12.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:56:42.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:56:42.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:56:42.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:56:42.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:56:42.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:56:42.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:56:42.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-28T14:56:42.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:56:42.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-28T14:56:42.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:56:42.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:56:42.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:56:42.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-28T14:56:46.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-28T14:56:46.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:56:46.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:56:46.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:56:46.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:56:46.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:56:46.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:56:46.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:56:46.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:56:46.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:56:46.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:56:46.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:56:46.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:56:46.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:56:46.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:56:46.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:56:46.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:56:46.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:56:46.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:56:46.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:56:46.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:56:46.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:56:46.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:56:46.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:56:46.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:56:43
2026-05-28T14:56:46.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69277, datetime.datetime(2026, 5, 28, 14, 56, 43), datetime.datetime(2026, 5, 28, 14, 56, 43), 'salt', 15.38, 27.57, None, 7.66, 240.65, 18.61, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:56:46.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:56:46.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:56:46.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:56:43, diff=3.682633s, valid=True
2026-05-28T14:56:46.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:56:46.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:56:46.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:12, diff=-25.31432s, valid=True
2026-05-28T14:56:46.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:56:46.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:56:46.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:56:42, diff=4.692592s, valid=True
2026-05-28T14:56:46.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:56:46.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:56:46.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:56:46.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:56:46.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:56:46.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:56:46.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:12, diff=-25.304192s, valid=True
2026-05-28T14:56:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:56:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:56:46.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:56:46.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905648.6965s, valid=True
2026-05-28T14:56:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:56:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:56:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:56:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:56:46.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:56:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:56:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:56:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:56:46.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:56:46.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:56:46.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:56:46.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:56:46.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:56:47.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:56:47.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:56:47.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:56:47.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:56:47.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:56:47.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-28T14:56:47.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-28T14:56:47.745 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:56:47.745 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:57:17.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:57:17.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:57:17.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:57:18.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:57:18.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:57:18.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:57:18.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-28T14:57:18.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:57:18.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-28T14:57:18.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:57:18.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:57:18.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:57:18.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-28T14:57:21.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-28T14:57:21.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:57:21.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:57:21.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:57:21.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:57:21.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:57:21.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:57:21.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:57:21.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:57:21.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:57:21.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:57:21.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:57:21.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:57:21.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:57:21.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:57:21.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:57:21.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:57:21.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:57:21.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:57:21.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:57:21.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:57:21.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:57:21.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:57:21.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:57:21.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:57:13
2026-05-28T14:57:21.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69278, datetime.datetime(2026, 5, 28, 14, 57, 13), datetime.datetime(2026, 5, 28, 14, 57, 13), 'salt', 15.21, 26.31, None, 7.98, 285.26, 19.21, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:57:21.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:57:21.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:57:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:13, diff=8.666077s, valid=True
2026-05-28T14:57:21.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:57:21.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:57:21.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:12, diff=9.66917s, valid=True
2026-05-28T14:57:21.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:57:21.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:13, diff=8.676074s, valid=True
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:57:21.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:57:21.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:12, diff=9.679314s, valid=True
2026-05-28T14:57:21.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:57:21.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:57:21.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:57:21.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905683.679987s, valid=True
2026-05-28T14:57:21.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:57:21.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:57:21.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:57:21.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:57:21.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:57:21.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:57:21.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:57:21.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:57:21.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:57:22.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:57:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:57:22.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:57:22.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:57:22.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:57:22.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:57:23.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:57:23.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:57:23.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:57:23.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-28T14:57:23.343 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T14:57:23.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:57:23.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:57:53.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:57:53.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:57:53.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:57:53.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:57:53.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:57:54.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:57:54.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-28T14:57:54.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:57:54.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-28T14:57:54.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:57:54.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:57:54.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:57:54.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-28T14:57:56.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-28T14:57:56.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:57:56.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:57:56.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:57:56.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:57:56.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:57:56.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:57:56.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:57:56.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:57:56.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:57:56.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:57:56.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:57:56.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:57:56.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:57:56.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:57:56.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:57:56.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:57:56.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:57:56.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:57:56.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:57:56.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:57:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:57:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:57:56.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:57:57.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:57:44
2026-05-28T14:57:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69279, datetime.datetime(2026, 5, 28, 14, 57, 44), datetime.datetime(2026, 5, 28, 14, 57, 43), 'salt', 15.25, 26.18, None, 10.27, 300.05, 19.29, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:57:57.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:57:57.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:57:57.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:43, diff=14.010164s, valid=True
2026-05-28T14:57:57.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:57:57.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:57:57.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:12, diff=-14.986948s, valid=True
2026-05-28T14:57:57.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:57:57.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:57:57.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:57:35, diff=22.019702s, valid=True
2026-05-28T14:57:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:57:57.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:57:57.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:57:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:57:57.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:57:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:57:57.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:12, diff=-14.977278s, valid=True
2026-05-28T14:57:57.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:57:57.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:57:57.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:57:57.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905719.023391s, valid=True
2026-05-28T14:57:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:57:57.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:57:57.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:57:57.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:57:57.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:57:57.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:57:57.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:57:57.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:57:57.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:57:57.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:57:57.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:57:57.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:57:57.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:57:57.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:57:57.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:57:57.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:57:58.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:57:58.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:57:58.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-28T14:57:58.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-28T14:57:58.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:57:58.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:58:28.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:58:28.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:58:28.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:58:28.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:58:28.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:58:29.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:58:29.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-28T14:58:29.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:58:29.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-28T14:58:29.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:58:29.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:58:29.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:58:29.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-28T14:58:36.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-28T14:58:36.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:58:36.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:58:36.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:58:36.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:58:36.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:58:36.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:58:36.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:58:36.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:58:36.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:58:36.380 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:58:36.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:58:36.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:58:36.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:58:36.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:58:36.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:58:36.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:58:36.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:58:36.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:58:36.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:58:36.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:58:36.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:58:36.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:58:36.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:58:36.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:58:14
2026-05-28T14:58:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69280, datetime.datetime(2026, 5, 28, 14, 58, 14), datetime.datetime(2026, 5, 28, 14, 58, 13), 'salt', 15.08, 25.25, None, 6.99, 346.33, 19.74, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:58:36.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:58:36.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:58:36.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:13, diff=23.691706s, valid=True
2026-05-28T14:58:36.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:58:36.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:58:36.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:12, diff=24.694496s, valid=True
2026-05-28T14:58:36.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:58:36.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:06, diff=30.701138s, valid=True
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:58:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:58:36.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:12, diff=24.704128s, valid=True
2026-05-28T14:58:36.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:58:36.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:58:36.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:58:36.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905758.704784s, valid=True
2026-05-28T14:58:36.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:58:36.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:58:36.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:58:36.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:58:36.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:58:36.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:58:36.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:58:36.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:58:36.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:58:36.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:58:36.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:58:36.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:58:36.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:58:37.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:58:37.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:58:37.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:58:37.698 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:58:37.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:58:37.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-28T14:58:37.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-28T14:58:37.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:58:37.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:59:07.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:59:07.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:59:07.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:59:08.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:59:08.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:59:08.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:59:08.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-28T14:59:08.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:59:08.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T14:59:08.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:59:08.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:59:08.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:59:08.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T14:59:10.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-28T14:59:10.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:59:10.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:59:10.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:59:10.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:59:10.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:59:10.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:59:10.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:59:10.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:59:10.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:59:10.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:59:10.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:59:10.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:59:11.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T14:59:11.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:59:11.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T14:59:11.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:59:11.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:59:11.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:59:11.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T14:59:11.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:59:11.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:59:11.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:59:11.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:59:11.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:58:44
2026-05-28T14:59:11.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69281, datetime.datetime(2026, 5, 28, 14, 58, 44), datetime.datetime(2026, 5, 28, 14, 58, 44), 'salt', 15.01, 25.95, None, 11.08, 319.04, 19.37, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:59:11.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:59:11.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T14:59:11.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:44, diff=27.283015s, valid=True
2026-05-28T14:59:11.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:59:11.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:59:11.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:59:12, diff=-0.714134s, valid=True
2026-05-28T14:59:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:59:11.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:58:37, diff=34.292415s, valid=True
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:59:11.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T14:59:11.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:59:12, diff=-0.704579s, valid=True
2026-05-28T14:59:11.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:59:11.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:59:11.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:59:11.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905793.29608s, valid=True
2026-05-28T14:59:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:59:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:59:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:59:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:59:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:59:11.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:59:11.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:59:11.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:59:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:59:11.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:59:11.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:59:11.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:59:11.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:59:11.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:59:11.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:59:12.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:59:12.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:59:12.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:59:12.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-28T14:59:12.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-28T14:59:12.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:59:12.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T14:59:42.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T14:59:42.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T14:59:42.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T14:59:43.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T14:59:43.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T14:59:43.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T14:59:43.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T14:59:43.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T14:59:43.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-28T14:59:43.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T14:59:43.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T14:59:43.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T14:59:43.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-28T14:59: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-28T14:59:46.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T14:59:46.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T14:59:46.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T14:59:46.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T14:59:46.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T14:59:46.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T14:59:46.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T14:59:46.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T14:59:46.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T14:59:46.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T14:59:46.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T14:59:46.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T14:59:46.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T14:59:46.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T14:59:46.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T14:59:46.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:59:46.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:59:46.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T14:59:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T14:59:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T14:59:46.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T14:59:46.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T14:59:46.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T14:59:46.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 14:59:44
2026-05-28T14:59:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69283, datetime.datetime(2026, 5, 28, 14, 59, 44), datetime.datetime(2026, 5, 28, 14, 59, 44), 'salt', 14.98, 26.91, None, 13.2, 312.88, 18.88, 829.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T14:59:46.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T14:59:46.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T14:59:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:59:44, diff=2.977523s, valid=True
2026-05-28T14:59:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T14:59:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:59:46.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:12, diff=-25.019624s, valid=True
2026-05-28T14:59:46.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T14:59:46.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T14:59:46.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 14:59:41, diff=5.986908s, valid=True
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T14:59:46.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T14:59:46.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:12, diff=-25.01006s, valid=True
2026-05-28T14:59:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T14:59:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T14:59:46.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T14:59:46.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905828.990591s, valid=True
2026-05-28T14:59:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T14:59:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T14:59:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T14:59:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T14:59:46.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T14:59:47.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T14:59:47.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T14:59:47.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T14:59:47.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T14:59:47.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T14:59:47.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T14:59:47.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T14:59:47.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T14:59:47.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T14:59:47.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:59:47.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T14:59:47.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T14:59:47.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T14:59: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-28T14:59:47.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-28T14:59:48.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T14:59:48.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:00:18.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:00:18.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:00:18.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:00:18.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:00:18.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:00:18.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:00:18.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-28T15:00:18.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:00:18.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-28T15:00:18.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:00:18.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:00:18.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:00:18.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-28T15:00:21.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-28T15:00:21.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:00:21.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:00:21.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:00:21.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:00:21.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:00:21.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:00:21.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:00:21.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:00:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:00:21.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:00:21.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:00:21.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:00:21.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:00:21.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:00:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:00:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:00:21.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:00:21.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:00:21.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:00:21.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:00:21.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:00:21.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:00:21.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:00:21.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:00:15
2026-05-28T15:00:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69284, datetime.datetime(2026, 5, 28, 15, 0, 15), datetime.datetime(2026, 5, 28, 15, 0, 14), 'salt', 14.82, 26.48, None, 12.35, 307.23, 19.08, 829.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:00:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:00:21.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:00:21.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:14, diff=7.418271s, valid=True
2026-05-28T15:00:21.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:00:21.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:00:21.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:12, diff=9.421132s, valid=True
2026-05-28T15:00:21.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:00:21.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:00:21.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:12, diff=9.427845s, valid=True
2026-05-28T15:00:21.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:00:21.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:00:21.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:00:21.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:00:21.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:00:21.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:00:21.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:12, diff=9.430879s, valid=True
2026-05-28T15:00:21.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:00:21.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:00:21.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:00:21.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905863.431535s, valid=True
2026-05-28T15:00:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:00:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:00:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:00:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:00:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:00:21.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:00:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:00:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:00:21.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:00:21.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:00:21.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:00:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:00:21.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:00:21.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:00:21.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:00:22.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:00:22.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:00:22.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:00:22.487 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:00:22.487 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:00:22.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:00:22.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:00:52.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:00:52.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:00:52.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:00:53.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:00:53.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:00:53.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:00:53.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:00:53.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:00:53.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-28T15:00:53.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:00:53.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:00:53.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:00:53.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-28T15:00: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-28T15:00:56.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:00:56.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:00:56.289 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:00:56.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:00:56.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:00:56.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:00:56.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:00:56.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:00:56.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:00:56.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:00:56.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:00:56.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:00:56.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:00:56.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:00:56.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:00:56.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:00:56.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:00:56.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:00:56.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:00:56.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:00:56.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:00:56.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:00:56.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:00:56.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:00:45
2026-05-28T15:00:56.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69285, datetime.datetime(2026, 5, 28, 15, 0, 45), datetime.datetime(2026, 5, 28, 15, 0, 44), 'salt', 14.85, 27.11, None, 13.59, 291.03, 18.77, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:00:56.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:00:56.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:00:56.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:44, diff=12.622404s, valid=True
2026-05-28T15:00:56.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:00:56.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:00:56.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:12, diff=-15.37471s, valid=True
2026-05-28T15:00:56.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:00:56.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:00:43, diff=13.632002s, valid=True
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:00:56.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:00:56.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:12, diff=-15.364986s, valid=True
2026-05-28T15:00:56.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:00:56.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:00:56.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:00:56.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905898.635675s, valid=True
2026-05-28T15:00:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:00:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:00:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:00:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:00:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:00:56.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:00:56.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:00:56.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:00:56.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:00:56.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:00:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:00:56.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:00:56.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:00:56.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:00:57.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:00:57.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:00:57.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:00:57.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:00:57.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-28T15:00:57.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-28T15:00:57.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:00:57.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:01:27.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:01:27.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:01:27.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:01:28.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:01:28.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:01:28.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:01:28.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-28T15:01:28.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:01:28.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-28T15:01:28.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:01:28.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:01:28.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:01:28.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-28T15:01:31.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-28T15:01:31.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:01:31.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:01:31.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:01:31.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:01:31.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:01:31.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:01:31.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:01:31.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:01:31.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:01:31.293 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:01:31.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:01:31.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:01:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:01:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:01:31.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:01:31.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:01:31.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:01:31.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:01:31.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:01:31.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:01:31.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:01:31.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:01:31.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:01:31.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:01:15
2026-05-28T15:01:31.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69286, datetime.datetime(2026, 5, 28, 15, 1, 15), datetime.datetime(2026, 5, 28, 15, 1, 15), 'salt', 14.55, 26.24, None, 9.53, 285.87, 19.15, 829.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:01:31.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:01:31.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:01:31.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:15, diff=16.607681s, valid=True
2026-05-28T15:01:31.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:01:31.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:01:31.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:12, diff=19.610566s, valid=True
2026-05-28T15:01:31.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:01:31.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:05, diff=26.617292s, valid=True
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:01:31.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:01:31.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:12, diff=19.620357s, valid=True
2026-05-28T15:01:31.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:01:31.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:01:31.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:01:31.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905933.621013s, valid=True
2026-05-28T15:01:31.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:01:31.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:01:31.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:01:31.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:01:31.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:01:31.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:01:31.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:01:31.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:01:31.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:01:31.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:01:31.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:01:31.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:01:31.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:01:31.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:01:32.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:01:32.572 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:01:32.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:01:32.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:01:32.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-28T15:01:32.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-28T15:01:32.895 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:01:32.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:02:02.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:02:02.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:02:02.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:02:03.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:02:03.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:02:03.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:02:03.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:02:03.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:02:03.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-28T15:02:03.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:02:03.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:02:03.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:02:03.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:02:06.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-28T15:02:06.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:02:06.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:02:06.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:02:06.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:02:06.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:02:06.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:02:06.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:02:06.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:02:06.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:02:06.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:02:06.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:02:06.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:02:06.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:02:06.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:02:06.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:02:06.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:02:06.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:02:06.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:02:06.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:02:06.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:02:06.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:02:06.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:02:06.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:02:06.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:01:45
2026-05-28T15:02:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69287, datetime.datetime(2026, 5, 28, 15, 1, 45), datetime.datetime(2026, 5, 28, 15, 1, 44), 'salt', 14.42, 27.11, None, 7.48, 294.21, 18.71, 829.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:02:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:02:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:02:06.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:44, diff=22.350993s, valid=True
2026-05-28T15:02:06.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:02:06.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:02:06.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:12, diff=-5.646196s, valid=True
2026-05-28T15:02:06.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:02:06.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:01:36, diff=30.360365s, valid=True
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:02:06.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:02:06.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:12, diff=-5.636604s, valid=True
2026-05-28T15:02:06.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:02:06.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:02:06.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:02:06.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=905968.364053s, valid=True
2026-05-28T15:02:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:02:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:02:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:02:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:02:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:02:06.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:02:06.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:02:06.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:02:06.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:02:06.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:02:06.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:02:06.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:02:06.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:02:06.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:02:06.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:02:07.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:02:07.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:02:07.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:02:07.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-28T15:02:07.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-28T15:02:07.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:02:07.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:02:37.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:02:37.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:02:37.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:02:38.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:02:38.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:02:38.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:02:38.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-28T15:02:38.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:02:38.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-28T15:02:38.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:02:38.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:02:38.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:02:38.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-28T15:02:40.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-28T15:02:40.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:02:40.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:02:40.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:02:40.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:02:40.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:02:40.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:02:40.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:02:40.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:02:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:02:40.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:02:40.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:02:40.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:02:40.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:02:40.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:02:40.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:02:40.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:02:40.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:02:40.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:02:40.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:02:40.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:02:40.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:02:40.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:02:40.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:02:41.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:02:15
2026-05-28T15:02:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69288, datetime.datetime(2026, 5, 28, 15, 2, 15), datetime.datetime(2026, 5, 28, 15, 2, 15), 'salt', 14.35, 26.87, None, 4.48, 284.02, 18.81, 829.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:02:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:02:41.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:02:41.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:15, diff=26.056154s, valid=True
2026-05-28T15:02:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:02:41.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:02:41.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:12, diff=29.059005s, valid=True
2026-05-28T15:02:41.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:02:41.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:02:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:07, diff=34.065657s, valid=True
2026-05-28T15:02:41.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:02:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:02:41.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:02:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:02:41.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:02:41.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:02:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:12, diff=29.068693s, valid=True
2026-05-28T15:02:41.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:02:41.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:02:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:02:41.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906003.069352s, valid=True
2026-05-28T15:02:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:02:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:02:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:02:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:02:41.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:02:41.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:02:41.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:02:41.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:02:41.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:02:41.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:02:41.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:02:41.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:02:41.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:02:41.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:02:41.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:02:42.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:02:42.157 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:02:42.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:02:42.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-28T15:02:42.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-28T15:02:42.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:02:42.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:03:12.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:03:12.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:03:12.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:03:12.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:03:12.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:03:12.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:03:12.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-28T15:03:12.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:03:12.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-28T15:03:12.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:03:12.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:03:12.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:03:12.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-28T15:03:15.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-28T15:03:15.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:03:15.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:03:15.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:03:15.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:03:15.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:03:15.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:03:15.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:03:15.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:03:15.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:03:15.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:03:15.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:03:15.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:03:15.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:03:15.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:03:15.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:03:15.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:03:15.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:03:15.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:03:15.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:03:15.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:03:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:03:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:03:15.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:03:15.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:02:46
2026-05-28T15:03:15.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69289, datetime.datetime(2026, 5, 28, 15, 2, 46), datetime.datetime(2026, 5, 28, 15, 2, 45), 'salt', 14.48, 26.31, None, 1.41, 250.23, 19.11, 829.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:03:15.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:03:15.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:03:15.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:45, diff=30.831381s, valid=True
2026-05-28T15:03:15.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:03:15.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:03:15.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:03:12, diff=3.834323s, valid=True
2026-05-28T15:03:15.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:03:15.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:02:39, diff=36.841117s, valid=True
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:03:15.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:03:15.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:03:12, diff=3.844203s, valid=True
2026-05-28T15:03:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:03:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:03:15.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:03:15.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906037.844876s, valid=True
2026-05-28T15:03:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:03:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:03:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:03:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:03:15.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:03:15.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:03:15.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:03:15.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:03:15.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:03:15.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:03:16.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:03:16.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:03:16.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:03:16.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:03:16.409 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:03:16.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:03:16.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:03:16.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:03:16.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-28T15:03:16.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-28T15:03:17.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:03:17.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:03:47.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:03:47.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:03:47.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:03:47.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:03:47.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:03:47.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:03:47.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-28T15:03:47.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:03:47.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-28T15:03:47.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:03:47.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:03:47.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:03:47.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-28T15:03:50.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-28T15:03:50.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:03:50.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:03:50.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:03:50.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:03:50.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:03:50.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:03:50.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:03:50.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:03:50.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:03:50.135 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:03:50.135 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:03:50.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:03:50.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:03:50.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:03:50.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:03:50.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:03:50.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:03:50.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:03:50.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:03:50.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:03:50.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:03:50.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:03:50.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:03:50.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:03:46
2026-05-28T15:03:50.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69291, datetime.datetime(2026, 5, 28, 15, 3, 46), datetime.datetime(2026, 5, 28, 15, 3, 46), 'salt', 14.78, 27.5, None, 6.57, 275.81, 18.56, 829.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:03:50.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:03:50.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:03:50.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:03:46, diff=4.48241s, valid=True
2026-05-28T15:03:50.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:03:50.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:03:50.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:12, diff=-21.510136s, valid=True
2026-05-28T15:03:50.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:03:50.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:03:42, diff=8.507185s, valid=True
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:03:50.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:03:50.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:12, diff=-21.48645s, valid=True
2026-05-28T15:03:50.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:03:50.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:03:50.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:03:50.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906072.514235s, valid=True
2026-05-28T15:03:50.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:03:50.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:03:50.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:03:50.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:03:50.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:03:50.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:03:50.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:03:50.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:03:50.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:03:50.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:03:50.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:03:50.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:03:50.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:03:50.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:03:51.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:03:51.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:03:51.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:03:51.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:03:51.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-28T15:03:51.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-28T15:03:51.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:03:51.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:04:21.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:04:21.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:04:21.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:04:22.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:04:22.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:04:22.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:04:22.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-28T15:04:22.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:04:22.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-28T15:04:22.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:04:22.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:04:22.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:04:22.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-28T15:04:25.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-28T15:04:25.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:04:25.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:04:25.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:04:25.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:04:25.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:04:25.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:04:25.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:04:25.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:04:25.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:04:25.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:04:25.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:04:25.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:04:25.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:04:25.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:04:25.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:04:25.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:04:25.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:04:25.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:04:25.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:04:25.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:04:25.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:04:25.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:04:25.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:04:25.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:04:16
2026-05-28T15:04:25.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69292, datetime.datetime(2026, 5, 28, 15, 4, 16), datetime.datetime(2026, 5, 28, 15, 4, 16), 'salt', 14.75, 28.0, None, 7.24, 284.41, 18.32, 829.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:04:25.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:04:25.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:04:25.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:16, diff=9.44602s, valid=True
2026-05-28T15:04:25.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:04:25.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:04:25.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:12, diff=13.44884s, valid=True
2026-05-28T15:04:25.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:04:25.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:13, diff=12.455435s, valid=True
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:04:25.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:04:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:12, diff=13.45844s, valid=True
2026-05-28T15:04:25.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:04:25.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:04:25.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:04:25.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906107.459096s, valid=True
2026-05-28T15:04:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:04:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:04:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:04:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:04:25.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:04:25.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:04:25.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:04:25.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:04:25.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:04:25.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:04:25.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:04:25.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:04:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:04:25.778 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:04:25.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:04:26.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:04:26.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:04:26.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:04:26.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-28T15:04:26.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-28T15:04:26.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:04:26.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:04:56.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:04:56.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:04:56.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:04:56.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:04:57.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:04:57.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:04:57.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-28T15:04:57.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:04:57.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-28T15:04:57.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:04:57.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:04:57.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:04:57.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-28T15:05:00.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-28T15:05:00.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:05:00.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:05:00.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:05:00.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:05:00.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:05:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:05:00.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:05:00.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:05:00.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:05:00.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:05:00.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:05:00.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:05:00.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:05:00.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:05:00.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:05:00.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:05:00.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:05:00.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:05:00.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:05:00.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:05:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:05:00.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:05:00.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:05:00.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:04:47
2026-05-28T15:05:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69293, datetime.datetime(2026, 5, 28, 15, 4, 47), datetime.datetime(2026, 5, 28, 15, 4, 46), 'salt', 14.88, 27.83, None, 8.68, 263.66, 18.42, 829.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:05:00.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:05:00.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:05:00.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:46, diff=14.354595s, valid=True
2026-05-28T15:05:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:05:00.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:05:00.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:12, diff=-11.642621s, valid=True
2026-05-28T15:05:00.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:05:00.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:04:45, diff=15.363989s, valid=True
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:05:00.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:05:00.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:12, diff=-11.63302s, valid=True
2026-05-28T15:05:00.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:05:00.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:05:00.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:05:00.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906142.367629s, valid=True
2026-05-28T15:05:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:05:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:05:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:05:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:05:00.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:05:00.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:05:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:05:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:05:00.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:05:00.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:05:00.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:05:00.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:05:00.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:05:00.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:05:00.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:05:01.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:05:01.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:05:01.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:05:01.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-28T15:05:01.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-28T15:05:01.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:05:01.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:05:31.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:05:31.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:05:31.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:05:31.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:05:31.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:05:31.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:05:31.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-28T15:05:31.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:05:31.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-28T15:05:31.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:05:31.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:05:31.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:05:31.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:05:34.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-28T15:05:34.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:05:34.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:05:34.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:05:34.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:05:34.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:05:34.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:05:34.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:05:34.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:05:34.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:05:34.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:05:34.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:05:34.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:05:34.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:05:34.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:05:34.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:05:34.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:05:34.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:05:34.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:05:34.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:05:34.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:05:34.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:05:34.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:05:34.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:05:34.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:05:17
2026-05-28T15:05:34.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69294, datetime.datetime(2026, 5, 28, 15, 5, 17), datetime.datetime(2026, 5, 28, 15, 5, 17), 'salt', 14.91, 27.77, None, 9.07, 263.85, 18.45, 829.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:05:34.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:05:34.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:05:34.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:17, diff=17.758493s, valid=True
2026-05-28T15:05:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:05:34.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:05:34.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:12, diff=22.761283s, valid=True
2026-05-28T15:05:34.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:05:34.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:05:34.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:16, diff=18.767814s, valid=True
2026-05-28T15:05:34.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:05:34.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:05:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:05:34.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:05:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:05:34.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:05:34.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:12, diff=22.770836s, valid=True
2026-05-28T15:05:34.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:05:34.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:05:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:05:34.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906176.771483s, valid=True
2026-05-28T15:05:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:05:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:05:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:05:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:05:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:05:34.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:05:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:05:34.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:05:34.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:05:34.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:05:34.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:05:35.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:05:35.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:05:35.090 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:05:35.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:05:35.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:05:35.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:05:35.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:05:35.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-28T15:05:35.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-28T15:05:35.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:05:35.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:06:05.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:06:05.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:06:05.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:06:06.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:06:06.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:06:06.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:06:06.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-28T15:06:06.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:06:06.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-28T15:06:06.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:06:06.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:06:06.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:06:06.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-28T15:06:08.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-28T15:06:08.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:06:08.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:06:08.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:06:08.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:06:08.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:06:08.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:06:08.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:06:08.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:06:08.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:06:08.961 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:06:08.961 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:06:08.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:06:09.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:06:09.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:06:09.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:06:09.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:06:09.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:06:09.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:06:09.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:06:09.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:06:09.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:06:09.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:06:09.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:06:09.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:05:47
2026-05-28T15:06:09.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69295, datetime.datetime(2026, 5, 28, 15, 5, 47), datetime.datetime(2026, 5, 28, 15, 5, 47), 'salt', 14.65, 26.51, None, 5.93, 239.85, 19.04, 829.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:06:09.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:06:09.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:06:09.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:47, diff=22.29772s, valid=True
2026-05-28T15:06:09.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:06:09.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:06:09.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:12, diff=-2.699397s, valid=True
2026-05-28T15:06:09.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:06:09.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:06:09.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:05:37, diff=32.307601s, valid=True
2026-05-28T15:06:09.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:06:09.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:06:09.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:06:09.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:06:09.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:06:09.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:06:09.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:12, diff=-2.688022s, valid=True
2026-05-28T15:06:09.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:06:09.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:06:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:06:09.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906211.312661s, valid=True
2026-05-28T15:06:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:06:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:06:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:06:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:06:09.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:06:09.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:06:09.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:06:09.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:06:09.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:06:09.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:06:09.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:06:09.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:06:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:06:09.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:06:09.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:06:10.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:06:10.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:06:10.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:06:10.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-28T15:06:10.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-28T15:06:10.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:06:10.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:06:40.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:06:40.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:06:40.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:06:41.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:06:41.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:06:41.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:06:41.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-28T15:06:41.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:06:41.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-28T15:06:41.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:06:41.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:06:41.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:06:41.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-28T15:06:43.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-28T15:06:43.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:06:43.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:06:43.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:06:43.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:06:43.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:06:43.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:06:43.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:06:43.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:06:43.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:06:43.806 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:06:43.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:06:43.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:06:43.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:06:43.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:06:43.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:06:43.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:06:44.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:06:44.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:06:44.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:06:44.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:06:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:06:44.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:06:44.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:06:44.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:06:17
2026-05-28T15:06:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69296, datetime.datetime(2026, 5, 28, 15, 6, 17), datetime.datetime(2026, 5, 28, 15, 6, 17), 'salt', 14.61, 26.57, None, 6.74, 238.93, 18.99, 829.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:06:44.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:06:44.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:06:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:17, diff=27.156586s, valid=True
2026-05-28T15:06:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:06:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:06:44.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:12, diff=32.159505s, valid=True
2026-05-28T15:06:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:06:44.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:09, diff=35.166338s, valid=True
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:06:44.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:06:44.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:06:12, diff=32.169436s, valid=True
2026-05-28T15:06:44.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:06:44.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:06:44.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:06:44.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906246.170105s, valid=True
2026-05-28T15:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:06:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:06:44.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:06:44.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:06:44.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:06:44.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:06:44.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:06:44.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:06:44.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:06:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:06:44.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:06:44.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:06:45.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:06:45.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:06:45.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:06:45.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-28T15:06:45.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-28T15:06:45.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:06:45.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:07:15.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:07:15.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:07:15.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:07:15.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:07:15.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:07:15.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:07:15.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:07:16.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:07:16.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-28T15:07:16.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:07:16.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:07:16.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:07:16.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-28T15:07:18.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-28T15:07:18.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:07:18.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:07:18.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:07:18.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:07:18.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:07:18.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:07:18.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:07:18.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:07:18.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:07:18.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:07:18.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:07:18.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:07:18.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:07:18.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:07:18.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:07:18.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:07:18.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:07:18.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:07:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:07:18.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:07:18.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:07:18.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:07:18.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:07:18.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:07:18
2026-05-28T15:07:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69298, datetime.datetime(2026, 5, 28, 15, 7, 18), datetime.datetime(2026, 5, 28, 15, 7, 17), 'salt', 14.68, 27.44, None, 1.7, 171.42, 18.58, 829.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:07:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:07:18.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:07:18.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:17, diff=1.766784s, valid=True
2026-05-28T15:07:18.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:07:18.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:07:18.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:12, diff=6.769684s, valid=True
2026-05-28T15:07:18.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:07:18.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:12, diff=6.776435s, valid=True
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:07:18.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:07:18.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:12, diff=6.779447s, valid=True
2026-05-28T15:07:18.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:07:18.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:07:18.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:07:18.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906280.780108s, valid=True
2026-05-28T15:07:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:07:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:07:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:07:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:07:18.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:07:18.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:07:18.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:07:18.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:07:18.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:07:18.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:07:18.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:07:19.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:07:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:07:19.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:07:19.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:07:19.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:07:19.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:07:19.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:07:19.756 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:07:19.756 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:07:19.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:07:19.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:07:49.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:07:49.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:07:49.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:07:50.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:07:50.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:07:50.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:07:50.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-28T15:07:50.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:07:50.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-28T15:07:50.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:07:50.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:07:50.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:07:50.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-28T15:07:53.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-28T15:07:53.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:07:53.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:07:53.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:07:53.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:07:53.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:07:53.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:07:53.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:07:53.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:07:53.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:07:53.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:07:53.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:07:53.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:07:53.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:07:53.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:07:53.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:07:53.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:07:53.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:07:53.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:07:53.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:07:53.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:07:53.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:07:53.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:07:53.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:07:53.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:07:48
2026-05-28T15:07:53.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69299, datetime.datetime(2026, 5, 28, 15, 7, 48), datetime.datetime(2026, 5, 28, 15, 7, 48), 'salt', 14.58, 27.2, None, 1.87, 151.7, 18.68, 829.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:07:53.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:07:53.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:07:53.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:48, diff=5.393758s, valid=True
2026-05-28T15:07:53.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:07:53.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:07:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:12, diff=-18.603419s, valid=True
2026-05-28T15:07:53.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:07:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:07:43, diff=10.403199s, valid=True
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:07:53.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:07:53.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:12, diff=-18.593775s, valid=True
2026-05-28T15:07:53.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:07:53.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:07:53.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:07:53.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906315.406905s, valid=True
2026-05-28T15:07:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:07:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:07:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:07:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:07:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:07:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:07:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:07:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:07:53.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:07:53.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:07:53.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:07:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:07:53.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:07:53.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:07:54.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:07:54.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:07:54.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:07:54.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:07:54.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:07:54.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-28T15:07:54.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:07:54.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:08:24.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:08:24.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:08:24.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:08:25.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:08:25.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:08:25.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:08:25.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:08:25.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:08:25.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-28T15:08:25.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:08:25.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:08:25.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:08: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-28T15:08:27.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-28T15:08:27.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:08:27.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:08:27.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:08:27.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:08:27.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:08:27.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:08:27.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:08:27.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:08:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:08:27.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:08:27.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:08:27.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:08:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:08:28.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:08:28.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:08:28.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:08:28.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:08:28.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:08:28.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:08:28.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:08:28.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:08:28.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:08:28.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:08:28.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:08:18
2026-05-28T15:08:28.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69300, datetime.datetime(2026, 5, 28, 15, 8, 18), datetime.datetime(2026, 5, 28, 15, 8, 18), 'salt', 14.68, 27.57, None, 1.87, 339.69, 18.52, 829.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:08:28.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:08:28.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:08:28.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:18, diff=10.351847s, valid=True
2026-05-28T15:08:28.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:08:28.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:08:28.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:12, diff=16.35472s, valid=True
2026-05-28T15:08:28.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:08:28.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:15, diff=13.361374s, valid=True
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:08:28.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:08:28.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:12, diff=16.36439s, valid=True
2026-05-28T15:08:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:08:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:08:28.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:08:28.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906350.365051s, valid=True
2026-05-28T15:08:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:08:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:08:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:08:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:08:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:08:28.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:08:28.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:08:28.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:08:28.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:08:28.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:08:28.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:08:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:08:28.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:08:28.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:08:28.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:08:29.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:08:29.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:08:29.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:08:29.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-28T15:08:29.346 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:08:29.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:08:29.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:08:59.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:08:59.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:08:59.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:08:59.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:08:59.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:09:00.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:09:00.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-28T15:09:00.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:09:00.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-28T15:09:00.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:09:00.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:09:00.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:09:00.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-28T15:09:02.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T15:09:02.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:09:02.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:09:02.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:09:02.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:09:02.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:09:02.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:09:02.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:09:02.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:09:02.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:09:02.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:09:02.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:09:02.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:09:02.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:09:02.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:09:02.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:09:02.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:09:02.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:09:02.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:09:02.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:09:02.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:09:02.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:09:02.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:09:02.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:09:02.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:08:48
2026-05-28T15:09:02.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69301, datetime.datetime(2026, 5, 28, 15, 8, 48), datetime.datetime(2026, 5, 28, 15, 8, 48), 'salt', 14.88, 27.34, None, 1.34, 20.17, 18.66, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:09:02.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:09:02.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:09:02.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:48, diff=14.94278s, valid=True
2026-05-28T15:09:02.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:09:02.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:09:02.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:12, diff=-9.0544s, valid=True
2026-05-28T15:09:02.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:09:02.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:08:46, diff=16.952194s, valid=True
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:09:02.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:09:02.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:12, diff=-9.044748s, valid=True
2026-05-28T15:09:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:09:02.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:09:02.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:09:02.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906384.955915s, valid=True
2026-05-28T15:09:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:09:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:09:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:09:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:09:02.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:09:03.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:09:03.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:09:03.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:09:03.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:09:03.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:09:03.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:09:03.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:09:03.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:09:03.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:09:03.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:09:03.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:09:04.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:09:04.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:09:04.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-28T15:09:04.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-28T15:09:04.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:09:04.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:09:34.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:09:34.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:09:34.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:09:34.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:09:34.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:09:34.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:09:34.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-28T15:09:34.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:09:34.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-28T15:09:34.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:09:34.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:09:34.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:09:34.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-28T15:09:37.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-28T15:09:37.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:09:37.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:09:37.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:09:37.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:09:37.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:09:37.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:09:37.157 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:09:37.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:09:37.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:09:37.158 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:09:37.158 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:09:37.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:09:37.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:09:37.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:09:37.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:09:37.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:09:37.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:09:37.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:09:37.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:09:37.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:09:37.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:09:37.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:09:37.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:09:37.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:09:19
2026-05-28T15:09:37.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69302, datetime.datetime(2026, 5, 28, 15, 9, 19), datetime.datetime(2026, 5, 28, 15, 9, 18), 'salt', 14.88, 28.03, None, 4.48, 275.29, 18.32, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:09:37.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:09:37.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:09:37.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:18, diff=19.469502s, valid=True
2026-05-28T15:09:37.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:09:37.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:09:37.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:12, diff=25.472344s, valid=True
2026-05-28T15:09:37.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:09:37.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:09:37.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:18, diff=19.478914s, valid=True
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:09:37.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:09:37.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:12, diff=25.481969s, valid=True
2026-05-28T15:09:37.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:09:37.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:09:37.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:09:37.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906419.482644s, valid=True
2026-05-28T15:09:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:09:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:09:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:09:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:09:37.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:09:37.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:09:37.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:09:37.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:09:37.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:09:37.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:09:37.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:09:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:09:37.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:09:37.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:09:38.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:09:38.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:09:38.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:09:38.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:09:38.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-28T15:09:38.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-28T15:09:38.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:09:38.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:10:08.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:10:08.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:10:08.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:10:09.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:10:09.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:10:09.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:10:09.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-28T15:10:09.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:10:09.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-28T15:10:09.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:10:09.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:10:09.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:10:09.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-28T15:10:11.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-28T15:10:11.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:10:11.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:10:11.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:10:11.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:10:11.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:10:11.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:10:11.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:10:11.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:10:11.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:10:11.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:10:11.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:10:11.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:10:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:10:11.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:10:12.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:10:12.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:10:12.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:10:12.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:10:12.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:10:12.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:10:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:10:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:10:12.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:10:12.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:09:49
2026-05-28T15:10:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69303, datetime.datetime(2026, 5, 28, 15, 9, 49), datetime.datetime(2026, 5, 28, 15, 9, 48), 'salt', 15.18, 27.87, None, 3.28, 334.11, 18.45, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:10:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:10:12.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:10:12.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:48, diff=24.166947s, valid=True
2026-05-28T15:10:12.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:10:12.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:10:12.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:12, diff=0.169845s, valid=True
2026-05-28T15:10:12.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:10:12.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:09:39, diff=33.176508s, valid=True
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:10:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:10:12.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:12, diff=0.179517s, valid=True
2026-05-28T15:10:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:10:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:10:12.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:10:12.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906454.180178s, valid=True
2026-05-28T15:10:12.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:10:12.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:10:12.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:10:12.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:10:12.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:10:12.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:10:12.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:10:12.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:10:12.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:10:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:10:12.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:10:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:10:12.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:10:12.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:10:12.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:10:13.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:10:13.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:10:13.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:10:13.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-28T15:10:13.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-28T15:10:13.318 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:10:13.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:10:43.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:10:43.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:10:43.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:10:43.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:10:43.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:10:43.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:10:43.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-28T15:10:43.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:10:43.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-28T15:10:43.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:10:43.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:10:43.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:10:43.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-28T15:10:46.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-28T15:10:46.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:10:46.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:10:46.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:10:46.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:10:46.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:10:46.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:10:46.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:10:46.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:10:46.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:10:46.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:10:46.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:10:46.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:10:46.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:10:46.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:10:46.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:10:46.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:10:46.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:10:46.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:10:46.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:10:46.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:10:46.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:10:46.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:10:46.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:10:46.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:10:19
2026-05-28T15:10:46.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69304, datetime.datetime(2026, 5, 28, 15, 10, 19), datetime.datetime(2026, 5, 28, 15, 10, 19), 'salt', 15.31, 27.97, None, 4.55, 266.1, 18.41, 829.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:10:46.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:10:46.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:10:46.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:19, diff=27.553235s, valid=True
2026-05-28T15:10:46.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:10:46.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:10:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:12, diff=34.556042s, valid=True
2026-05-28T15:10:46.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:10:46.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:10:46.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:10, diff=36.562833s, valid=True
2026-05-28T15:10:46.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:10:46.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:10:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:10:46.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:10:46.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:10:46.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:10:46.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:10:12, diff=34.565855s, valid=True
2026-05-28T15:10:46.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:10:46.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:10:46.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:10:46.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906488.566509s, valid=True
2026-05-28T15:10:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:10:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:10:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:10:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:10:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:10:46.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:10:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:10:46.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:10:46.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:10:46.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:10:46.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:10:46.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:10:46.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:10:46.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:10:47.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:10:47.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:10:47.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:10:47.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:10:47.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-28T15:10:47.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-28T15:10:47.723 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:10:47.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:11:17.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:11:17.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:11:17.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:11:18.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:11:18.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:11:18.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:11:18.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-28T15:11:18.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:11:18.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-28T15:11:18.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:11:18.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:11:18.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:11:18.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-28T15:11:21.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-28T15:11:21.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:11:21.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:11:21.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:11:21.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:11:21.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:11:21.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:11:21.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:11:21.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:11:21.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:11:21.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:11:21.228 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:11:21.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:11:21.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:11:21.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:11:21.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:11:21.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:11:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:11:21.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:11:21.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:11:21.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:11:21.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:11:21.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:11:21.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:11:21.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:11:19
2026-05-28T15:11:21.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69306, datetime.datetime(2026, 5, 28, 15, 11, 19), datetime.datetime(2026, 5, 28, 15, 11, 19), 'salt', 15.21, 29.56, None, 5.26, 292.8, 17.65, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:11:21.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:11:21.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:11:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:19, diff=2.551207s, valid=True
2026-05-28T15:11:21.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:11:21.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:11:21.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:12, diff=9.554029s, valid=True
2026-05-28T15:11:21.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:11:21.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:11:21.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:13, diff=8.560705s, valid=True
2026-05-28T15:11:21.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:11:21.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:11:21.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:11:21.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:11:21.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:11:21.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:11:21.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:12, diff=9.563702s, valid=True
2026-05-28T15:11:21.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:11:21.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:11:21.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:11:21.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906523.564366s, valid=True
2026-05-28T15:11:21.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:11:21.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:11:21.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:11:21.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:11:21.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:11:21.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:11:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:11:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:11:21.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:11:21.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:11:21.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:11:21.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:11:21.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:11:21.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:11:22.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:11:22.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:11:22.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:11:22.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:11:22.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-28T15:11:22.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-28T15:11:22.772 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:11:22.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:11:52.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:11:52.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:11:52.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:11:53.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:11:53.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:11:53.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:11:53.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-28T15:11:53.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:11: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-28T15:11:53.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:11:53.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:11:53.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:11:53.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-28T15:11:55.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-28T15:11:55.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:11:55.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:11:55.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:11:55.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:11:55.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:11:55.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:11:55.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:11:55.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:11:55.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:11:55.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:11:55.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:11:55.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:11:56.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:11:56.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:11:56.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:11:56.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:11:56.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:11:56.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:11:56.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:11:56.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:11:56.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:11:56.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:11:56.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:11:56.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:11:50
2026-05-28T15:11:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69307, datetime.datetime(2026, 5, 28, 15, 11, 50), datetime.datetime(2026, 5, 28, 15, 11, 49), 'salt', 15.28, 27.63, None, 6.57, 284.5, 18.57, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:11:56.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:11:56.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:11:56.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:49, diff=7.295961s, valid=True
2026-05-28T15:11:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:11:56.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:11:56.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:12, diff=-15.701156s, valid=True
2026-05-28T15:11:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:11:56.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:11:45, diff=11.30553s, valid=True
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:11:56.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:11:56.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:11:56.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:12, diff=-15.691349s, valid=True
2026-05-28T15:11:56.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:11:56.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:11:56.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:11:56.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906558.309301s, valid=True
2026-05-28T15:11:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:11:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:11:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:11:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:11:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:11:56.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:11:56.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:11:56.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:11:56.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:11:56.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:11:56.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:11:56.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:11:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:11:56.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:11:56.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:11:57.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:11:57.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:11:57.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:11:57.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-28T15:11:57.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-28T15:11:57.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:11:57.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:12:27.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:12:27.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:12:27.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:12:27.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:12:27.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:12:28.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:12:28.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:12:28.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:12:28.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-28T15:12:28.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:12:28.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:12:28.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:12:28.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-28T15:12:30.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-28T15:12:30.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:12:30.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:12:30.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:12:30.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:12:30.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:12:30.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:12:30.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:12:30.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:12:30.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:12:30.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:12:30.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:12:30.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:12:30.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:12:30.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:12:30.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:12:30.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:12:30.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:12:30.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:12:30.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:12:30.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:12:30.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:12:30.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:12:30.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:12:30.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:12:20
2026-05-28T15:12:30.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69308, datetime.datetime(2026, 5, 28, 15, 12, 20), datetime.datetime(2026, 5, 28, 15, 12, 19), 'salt', 15.34, 29.29, None, 9.67, 278.92, 17.79, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:12:30.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:12:30.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:12:30.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:19, diff=11.95719s, valid=True
2026-05-28T15:12:30.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:12:30.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:12:30.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:12, diff=18.960174s, valid=True
2026-05-28T15:12:30.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:12:30.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:12:30.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:16, diff=14.966954s, valid=True
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:12:30.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:12:30.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:12, diff=18.970045s, valid=True
2026-05-28T15:12:30.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:12:30.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:12:30.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:12:30.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906592.970725s, valid=True
2026-05-28T15:12:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:12:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:12:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:12:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:12:30.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:12:31.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:12:31.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:12:31.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:12:31.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:12:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:12:31.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:12:31.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:12:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:12:31.313 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:12:31.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:12:31.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:12:31.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:12:31.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:12:31.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-28T15:12:31.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-28T15:12:32.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:12:32.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:13:02.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:13:02.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:13:02.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:13:02.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:13:02.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:13:02.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:13:02.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-28T15:13:02.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:13:02.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:13:02.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:13:02.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:13:02.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:13:02.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-28T15:13: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-28T15:13:05.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:13:05.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:13:05.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:13:05.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:13:05.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:13:05.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:13:05.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:13:05.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:13:05.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:13:05.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:13:05.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:13:05.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:13:05.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:13:05.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:13:05.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:13:05.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:13:05.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:13:05.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:13:05.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:13:05.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:13:05.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:13:05.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:13:05.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:13:05.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:12:50
2026-05-28T15:13:05.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69309, datetime.datetime(2026, 5, 28, 15, 12, 50), datetime.datetime(2026, 5, 28, 15, 12, 50), 'salt', 15.41, 29.46, None, 10.94, 267.44, 17.73, 829.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:13:05.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:13:05.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:13:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:50, diff=15.743501s, valid=True
2026-05-28T15:13:05.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:13:05.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:13:05.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:12, diff=-6.253082s, valid=True
2026-05-28T15:13:05.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:13:05.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:13:05.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:12:47, diff=18.755647s, valid=True
2026-05-28T15:13:05.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:13:05.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:13:05.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:13:05.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:13:05.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:13:05.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:13:05.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:12, diff=-6.239574s, valid=True
2026-05-28T15:13:05.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:13:05.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:13:05.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:13:05.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906627.761501s, valid=True
2026-05-28T15:13:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:13:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:13:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:13:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:13:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:13:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:13:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:13:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:13:05.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:13:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:13:05.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:13:06.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:13:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:13:06.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:13:06.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:13:06.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:13:06.842 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:13:06.843 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:13:06.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-28T15:13:06.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-28T15:13:07.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:13:07.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:13:37.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:13:37.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:13:37.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:13:37.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:13:37.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:13:37.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:13:37.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-28T15:13:37.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:13: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-28T15:13:37.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:13:37.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:13:37.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:13: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-28T15:13:40.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-28T15:13:40.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:13:40.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:13:40.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:13:40.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:13:40.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:13:40.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:13:40.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:13:40.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:13:40.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:13:40.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:13:40.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:13:40.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:13:40.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:13:40.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:13:40.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:13:40.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:13:40.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:13:40.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:13:40.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:13:40.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:13:40.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:13:40.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:13:40.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:13:40.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:13:20
2026-05-28T15:13:40.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69310, datetime.datetime(2026, 5, 28, 15, 13, 20), datetime.datetime(2026, 5, 28, 15, 13, 20), 'salt', 15.44, 28.6, None, 9.56, 273.72, 18.13, 829.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:13:40.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:13:40.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:13:40.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:20, diff=20.580523s, valid=True
2026-05-28T15:13:40.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:13:40.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:13:40.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:12, diff=28.583411s, valid=True
2026-05-28T15:13:40.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:13:40.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:19, diff=21.590047s, valid=True
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:13:40.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:13:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:12, diff=28.593149s, valid=True
2026-05-28T15:13:40.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:13:40.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:13:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:13:40.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906662.593833s, valid=True
2026-05-28T15:13:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:13:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:13:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:13:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:13:40.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:13:40.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:13:40.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:13:40.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:13:40.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:13:40.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:13:40.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:13:40.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:13:40.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:13:40.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:13:41.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:13:41.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:13:41.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:13:41.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:13:41.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:13:41.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:13:41.680 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:13:41.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:14:11.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:14:11.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:14:11.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:14:11.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:14:11.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:14:12.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:14:12.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-28T15:14:12.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:14:12.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-28T15:14:12.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:14:12.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:14:12.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:14:12.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-28T15:14:14.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T15:14:14.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:14:14.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:14:14.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:14:14.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:14:14.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:14:14.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:14:14.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:14:14.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:14:14.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:14:14.506 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:14:14.506 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:14:14.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:14:14.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:14:14.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:14:14.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:14:14.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:14:14.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:14:14.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:14:14.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:14:14.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:14:14.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:14:14.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:14:14.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:14:14.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:13:50
2026-05-28T15:14:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69311, datetime.datetime(2026, 5, 28, 15, 13, 50), datetime.datetime(2026, 5, 28, 15, 13, 50), 'salt', 15.47, 29.39, None, 9.56, 267.65, 17.76, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:14:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:14:14.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:14:14.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:50, diff=24.830015s, valid=True
2026-05-28T15:14:14.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:14:14.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:14:14.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:12, diff=2.832889s, valid=True
2026-05-28T15:14:14.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:14:14.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:13:50, diff=24.839479s, valid=True
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:14:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:14:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:12, diff=2.842525s, valid=True
2026-05-28T15:14:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:14:14.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:14:14.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:14:14.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906696.843187s, valid=True
2026-05-28T15:14:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:14:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:14:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:14:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:14:14.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:14:14.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:14:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:14:14.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:14:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:14:14.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:14:15.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:14:15.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:14:15.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:14:15.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:14:15.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:14:15.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:14:15.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:14:15.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:14:15.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-28T15:14:15.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-28T15:14:16.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:14:16.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:14:46.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:14:46.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:14:46.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:14:46.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:14:46.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:14:46.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:14:46.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:14:46.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:14:46.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-28T15:14:46.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:14:46.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:14:46.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:14:46.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:14:49.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T15:14:49.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:14:49.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:14:49.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:14:49.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:14:49.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:14:49.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:14:49.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:14:49.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:14:49.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:14:49.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:14:49.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:14:49.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:14:49.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:14:49.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:14:49.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:14:49.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:14:49.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:14:49.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:14:49.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:14:49.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:14:49.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:14:49.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:14:49.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:14:49.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:14:21
2026-05-28T15:14:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69312, datetime.datetime(2026, 5, 28, 15, 14, 21), datetime.datetime(2026, 5, 28, 15, 14, 20), 'salt', 15.44, 28.69, None, 9.78, 260.33, 18.08, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:14:49.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:14:49.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:14:49.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:20, diff=29.585458s, valid=True
2026-05-28T15:14:49.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:14:49.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:14:49.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:12, diff=37.588278s, valid=True
2026-05-28T15:14:49.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:14:49.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:14:49.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:11, diff=38.594865s, valid=True
2026-05-28T15:14:49.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:14:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:14:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:14:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:14:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:14:49.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:14:49.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:14:12, diff=37.597838s, valid=True
2026-05-28T15:14:49.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:14:49.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:14:49.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:14:49.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906731.598491s, valid=True
2026-05-28T15:14:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:14:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:14:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:14:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:14:49.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:14:49.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:14:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:14:49.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:14:49.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:14:49.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:14:49.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:14:49.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:14:49.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:14:49.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:14:50.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:14:50.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:14:50.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:14:50.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:14:50.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-28T15:14:50.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-28T15:14:50.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:14:50.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:15:20.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:15:20.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:15:20.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:15:21.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:15:21.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:15:21.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:15:21.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-28T15:15:21.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:15:21.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-28T15:15:21.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:15:21.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:15:21.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:15:21.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:15:23.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-28T15:15:23.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:15:23.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:15:23.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:15:23.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:15:23.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:15:23.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:15:23.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:15:23.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:15:23.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:15:23.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:15:23.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:15:23.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:15:24.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:15:24.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:15:24.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:15:24.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:15:24.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:15:24.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:15:24.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:15:24.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:15:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:15:24.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:15:24.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:15:24.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:15:21
2026-05-28T15:15:24.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69314, datetime.datetime(2026, 5, 28, 15, 15, 21), datetime.datetime(2026, 5, 28, 15, 15, 21), 'salt', 14.98, 26.97, None, 5.08, 296.32, 18.85, 829.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:15:24.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:15:24.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:15:24.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:21, diff=3.261704s, valid=True
2026-05-28T15:15:24.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:15:24.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:15:24.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:12, diff=12.264537s, valid=True
2026-05-28T15:15:24.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:15:24.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:14, diff=10.271125s, valid=True
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:15:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:15:24.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:12, diff=12.274162s, valid=True
2026-05-28T15:15:24.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:15:24.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:15:24.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:15:24.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906766.274817s, valid=True
2026-05-28T15:15:24.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:15:24.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:15:24.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:15:24.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:15:24.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:15:24.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:15:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:15:24.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:15:24.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:15:24.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:15:24.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:15:24.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:15:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:15:24.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:15:24.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:15:25.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:15:25.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:15:25.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:15:25.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-28T15:15:25.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-28T15:15:25.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:15:25.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:15:55.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:15:55.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:15:55.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:15:56.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:15:56.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:15:56.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:15:56.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-28T15:15:56.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:15:56.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-28T15:15:56.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:15:56.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:15:56.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:15:56.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-28T15:15:58.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-28T15:15:58.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:15:58.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:15:58.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:15:58.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:15:58.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:15:58.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:15:58.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:15:58.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:15:58.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:15:58.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:15:58.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:15:58.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:15:58.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:15:58.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:15:58.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:15:58.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:15:58.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:15:58.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:15:59.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:15:59.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:15:59.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:15:59.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:15:59.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:15:59.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:15:51
2026-05-28T15:15:59.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69315, datetime.datetime(2026, 5, 28, 15, 15, 51), datetime.datetime(2026, 5, 28, 15, 15, 51), 'salt', 15.04, 27.4, None, 6.85, 328.52, 18.64, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:15:59.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:15:59.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:15:59.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:51, diff=8.095083s, valid=True
2026-05-28T15:15:59.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:15:59.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:15:59.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:12, diff=-12.902046s, valid=True
2026-05-28T15:15:59.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:15:59.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:15:46, diff=13.104578s, valid=True
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:15:59.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:15:59.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:15:59.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:12, diff=-12.892344s, valid=True
2026-05-28T15:15:59.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:15:59.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:15:59.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:15:59.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906801.108326s, valid=True
2026-05-28T15:15:59.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:15:59.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:15:59.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:15:59.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:15:59.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:15:59.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:15:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:15:59.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:15:59.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:15:59.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:15:59.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:15:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:15:59.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:15:59.428 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:15:59.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:15:59.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:16:00.102 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:16:00.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:16:00.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-28T15:16:00.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-28T15:16:00.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:16:00.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:16:30.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:16:30.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:16:30.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:16:30.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:16:30.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:16:30.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:16:30.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-28T15:16:30.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:16:30.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-28T15:16:30.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:16:30.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:16:30.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:16:30.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-28T15:16:34.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-28T15:16:34.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:16:34.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:16:34.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:16:34.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:16:34.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:16:34.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:16:34.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:16:34.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:16:34.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:16:34.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:16:34.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:16:34.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:16:34.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:16:34.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:16:34.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:16:34.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:16:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:16:34.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:16:34.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:16:34.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:16:34.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:16:34.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:16:34.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:16:34.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:16:22
2026-05-28T15:16:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69316, datetime.datetime(2026, 5, 28, 15, 16, 22), datetime.datetime(2026, 5, 28, 15, 16, 21), 'salt', 14.98, 27.5, None, 9.07, 346.11, 18.59, 829.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:16:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:16:34.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:16:34.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:21, diff=13.918651s, valid=True
2026-05-28T15:16:34.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:16:34.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:16:34.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:12, diff=22.921473s, valid=True
2026-05-28T15:16:34.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:16:34.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:17, diff=17.92808s, valid=True
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:16:34.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:16:34.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:12, diff=22.93108s, valid=True
2026-05-28T15:16:34.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:16:34.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:16:34.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:16:34.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906836.931736s, valid=True
2026-05-28T15:16:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:16:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:16:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:16:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:16:34.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:16:34.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:16:34.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:16:34.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:16:35.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:16:35.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:16:35.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:16:35.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:16:35.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:16:35.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:16:35.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:16:35.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:16:36.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:16:36.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:16:36.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:16:36.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:16:36.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:16:36.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:17:06.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:17:06.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:17:06.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:17:06.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:17:06.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:17:06.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:17:06.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-28T15:17:06.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:17:06.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-28T15:17:06.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:17:06.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:17:06.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:17:06.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-28T15:17:09.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-28T15:17:09.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:17:09.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:17:09.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:17:09.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:17:09.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:17:09.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:17:09.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:17:09.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:17:09.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:17:09.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:17:09.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:17:09.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:17:09.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:17:09.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:17:09.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:17:09.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:17:09.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:17:09.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:17:09.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:17:09.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:17:09.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:17:09.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:17:09.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:17:09.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:16:52
2026-05-28T15:17:09.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69317, datetime.datetime(2026, 5, 28, 15, 16, 52), datetime.datetime(2026, 5, 28, 15, 16, 51), 'salt', 15.24, 28.6, None, 6.92, 326.93, 18.1, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:17:09.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:17:09.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:17:09.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:51, diff=18.534901s, valid=True
2026-05-28T15:17:09.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:17:09.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:17:09.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:12, diff=-2.462228s, valid=True
2026-05-28T15:17:09.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:17:09.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:16:49, diff=20.544277s, valid=True
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:17:09.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:17:09.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:12, diff=-2.452638s, valid=True
2026-05-28T15:17:09.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:17:09.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:17:09.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:17:09.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906871.548032s, valid=True
2026-05-28T15:17:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:17:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:17:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:17:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:17:09.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:17:09.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:17:09.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:17:09.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:17:09.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:17:09.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:17:09.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:17:09.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:17:09.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:17:09.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:17:10.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:17:10.495 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:17:10.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:17:10.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:17:10.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-28T15:17:10.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-28T15:17:10.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:17:10.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:17:40.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:17:40.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:17:40.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:17:41.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:17:41.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:17:41.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:17:41.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-28T15:17:41.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:17:41.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:17:41.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:17:41.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:17:41.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:17:41.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:17:43.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-28T15:17:43.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:17:43.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:17:43.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:17:43.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:17:43.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:17:43.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:17:43.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:17:43.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:17:43.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:17:43.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:17:43.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:17:43.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:17:43.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:17:43.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:17:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:17:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:17:44.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:17:44.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:17:44.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:17:44.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:17:44.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:17:44.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:17:44.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:17:44.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:17:22
2026-05-28T15:17:44.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69318, datetime.datetime(2026, 5, 28, 15, 17, 22), datetime.datetime(2026, 5, 28, 15, 17, 22), 'salt', 15.37, 28.99, None, 6.99, 338.82, 17.93, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:17:44.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:17:44.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:17:44.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:22, diff=22.198794s, valid=True
2026-05-28T15:17:44.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:17:44.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:17:44.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:12, diff=32.201588s, valid=True
2026-05-28T15:17:44.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:17:44.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:20, diff=24.208142s, valid=True
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:17:44.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:17:44.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:12, diff=32.211233s, valid=True
2026-05-28T15:17:44.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:17:44.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:17:44.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:17:44.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906906.21189s, valid=True
2026-05-28T15:17:44.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:17:44.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:17:44.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:17:44.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:17:44.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:17:44.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:17:44.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:17:44.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:17:44.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:17:44.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:17:44.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:17:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:17:44.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:17:44.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:17:44.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:17:45.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:17:45.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:17:45.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:17:45.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-28T15:17:45.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-28T15:17:45.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:17:45.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:18:15.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:18:15.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:18:15.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:18:15.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:18:15.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:18:15.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:18:15.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:18:15.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:18:15.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:18:15.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:18:15.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:18:15.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:18:15.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-28T15:18:18.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-28T15:18:18.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:18:18.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:18:18.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:18:18.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:18:18.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:18:18.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:18:18.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:18:18.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:18:18.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:18:18.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:18:18.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:18:18.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:18:18.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:18:18.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:18:18.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:18:18.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:18:18.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:18:18.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:18:18.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:18:18.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:18:18.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:18:18.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:18:18.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:18:18.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:17:52
2026-05-28T15:18:18.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69319, datetime.datetime(2026, 5, 28, 15, 17, 52), datetime.datetime(2026, 5, 28, 15, 17, 52), 'salt', 15.37, 26.87, None, 6.53, 276.22, 18.95, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:18:18.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:18:18.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:18:18.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:52, diff=26.668651s, valid=True
2026-05-28T15:18:18.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:18:18.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:18:18.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:18:12, diff=6.671494s, valid=True
2026-05-28T15:18:18.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:18:18.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:17:52, diff=26.678064s, valid=True
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:18:18.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:18:18.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:18:12, diff=6.681144s, valid=True
2026-05-28T15:18:18.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:18:18.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:18:18.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:18:18.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906940.681831s, valid=True
2026-05-28T15:18:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:18:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:18:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:18:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:18:18.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:18:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:18:18.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:18:18.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:18:18.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:18:18.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:18:18.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:18:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:18:18.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:18:19.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:18:19.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:18:19.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:18:19.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:18:19.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:18:19.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-28T15:18:19.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-28T15:18:19.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:18:19.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:18:50.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:18:50.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:18:50.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:18:50.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:18:50.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:18:50.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:18:50.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-28T15:18:50.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:18:50.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-28T15:18:50.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:18:50.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:18:50.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:18:50.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-28T15:18:53.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-28T15:18:53.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:18:53.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:18:53.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:18:53.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:18:53.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:18:53.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:18:53.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:18:53.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:18:53.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:18:53.187 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:18:53.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:18:53.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:18:53.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:18:53.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:18:53.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:18:53.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:18:53.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:18:53.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:18:53.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:18:53.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:18:53.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:18:53.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:18:53.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:18:53.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:18:53
2026-05-28T15:18:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69321, datetime.datetime(2026, 5, 28, 15, 18, 53), datetime.datetime(2026, 5, 28, 15, 18, 52), 'salt', 15.51, 27.27, None, 4.45, 245.14, 18.78, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:18:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:18:53.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:18:53.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:18:52, diff=1.493403s, valid=True
2026-05-28T15:18:53.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:18:53.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:18:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:12, diff=-18.503805s, valid=True
2026-05-28T15:18:53.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:18:53.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:18:53.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:18:44, diff=9.502818s, valid=True
2026-05-28T15:18:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:18:53.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:18:53.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:18:53.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:18:53.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:18:53.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:18:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:12, diff=-18.494177s, valid=True
2026-05-28T15:18:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:18:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:18:53.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:18:53.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=906975.506483s, valid=True
2026-05-28T15:18:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:18:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:18:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:18:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:18:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:18:53.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:18:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:18:53.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:18:53.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:18:53.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:18:53.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:18:53.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:18:53.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:18:53.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:18:54.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:18:54.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:18:54.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:18:54.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:18:54.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-28T15:18:54.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-28T15:18:54.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:18:54.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:19:24.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:19:24.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:19:24.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:19:25.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:19:25.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:19:25.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:19:25.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:19:25.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:19:25.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-28T15:19:25.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:19:25.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:19:25.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:19:25.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-28T15:19:27.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T15:19:27.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:19:27.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:19:27.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:19:27.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:19:27.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:19:27.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:19:27.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:19:27.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:19:27.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:19:27.975 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:19:27.975 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:19:27.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:19:28.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:19:28.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:19:28.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:19:28.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:19:28.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:19:28.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:19:28.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:19:28.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:19:28.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:19:28.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:19:28.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:19:28.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:19:23
2026-05-28T15:19:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69322, datetime.datetime(2026, 5, 28, 15, 19, 23), datetime.datetime(2026, 5, 28, 15, 19, 23), 'salt', 15.54, 28.16, None, 4.84, 256.39, 18.35, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:19:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:19:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:19:28.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:23, diff=5.290832s, valid=True
2026-05-28T15:19:28.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:19:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:19:28.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:12, diff=16.293779s, valid=True
2026-05-28T15:19:28.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:19:28.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:15, diff=13.300403s, valid=True
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:19:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:19:28.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:12, diff=16.303462s, valid=True
2026-05-28T15:19:28.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:19:28.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:19:28.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:19:28.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907010.304132s, valid=True
2026-05-28T15:19:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:19:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:19:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:19:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:19:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:19:28.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:19:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:19:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:19:28.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:19:28.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:19:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:19:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:19:28.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:19:28.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:19:28.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:19:29.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:19:29.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:19:29.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:19:29.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-28T15:19:29.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-28T15:19:29.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:19:29.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:19:59.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:19:59.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:19:59.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:19:59.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:19:59.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:20:00.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:20:00.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-28T15:20:00.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:20:00.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-28T15:20:00.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:20:00.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:20:00.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:20:00.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-28T15:20:02.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-28T15:20:02.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:20:02.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:20:02.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:20:02.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:20:02.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:20:02.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:20:02.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:20:02.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:20:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:20:02.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:20:02.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:20:02.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:20:02.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:20:02.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:20:02.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:20:02.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:20:02.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:20:02.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:20:02.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:20:02.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:20:02.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:20:02.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:20:02.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:20:03.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:19:53
2026-05-28T15:20:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69323, datetime.datetime(2026, 5, 28, 15, 19, 53), datetime.datetime(2026, 5, 28, 15, 19, 53), 'salt', 15.61, 27.63, None, 10.48, 223.06, 18.62, 829.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:20:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:20:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:20:03.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:53, diff=10.044396s, valid=True
2026-05-28T15:20:03.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:20:03.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:20:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:12, diff=-8.952622s, valid=True
2026-05-28T15:20:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:20:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:19:47, diff=16.054164s, valid=True
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:20:03.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:20:03.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:12, diff=-8.942718s, valid=True
2026-05-28T15:20:03.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:20:03.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:20:03.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:20:03.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907045.05798s, valid=True
2026-05-28T15:20:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:20:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:20:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:20:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:20:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:20:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:20:03.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:20:03.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:20:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:20:03.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:20:03.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:20:03.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:20:03.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:20:03.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:20:03.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:20:03.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:20:04.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:20:04.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:20:04.044 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:20:04.044 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:20:04.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:20:04.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:20:34.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:20:34.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:20:34.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:20:34.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:20:34.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:20:35.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:20:35.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-28T15:20:35.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:20:35.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:20:35.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:20:35.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:20:35.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:20:35.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-28T15:20:37.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-28T15:20:37.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:20:37.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:20:37.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:20:37.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:20:37.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:20:37.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:20:37.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:20:37.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:20:37.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:20:37.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:20:37.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:20:37.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:20:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:20:37.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:20:37.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:20:37.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:20:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:20:38.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:20:38.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:20:38.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:20:38.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:20:38.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:20:38.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:20:38.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:20:23
2026-05-28T15:20:38.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69324, datetime.datetime(2026, 5, 28, 15, 20, 23), datetime.datetime(2026, 5, 28, 15, 20, 23), 'salt', 15.61, 27.1, None, 9.6, 227.44, 18.88, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:20:38.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:20:38.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:20:38.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:23, diff=15.142098s, valid=True
2026-05-28T15:20:38.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:20:38.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:20:38.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:12, diff=26.145017s, valid=True
2026-05-28T15:20:38.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:20:38.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:20:38.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:18, diff=20.151678s, valid=True
2026-05-28T15:20:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:20:38.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:20:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:20:38.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:20:38.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:20:38.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:20:38.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:12, diff=26.1547s, valid=True
2026-05-28T15:20:38.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:20:38.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:20:38.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:20:38.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907080.155347s, valid=True
2026-05-28T15:20:38.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:20:38.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:20:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:20:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:20:38.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:20:38.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:20:38.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:20:38.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:20:38.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:20:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:20:38.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:20:38.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:20:38.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:20:38.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:20:38.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:20:39.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:20:39.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:20:39.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:20: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-28T15:20: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-28T15:20:39.528 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:20:39.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:21:09.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:21:09.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:21:09.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:21:09.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:21:09.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:21:09.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:21:09.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-28T15:21:09.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:21:09.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:21:09.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:21:09.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:21:09.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:21:09.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:21:12.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-28T15:21:12.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:21:12.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:21:12.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:21:12.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:21:12.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:21:12.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:21:12.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:21:12.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:21:12.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:21:12.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:21:12.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:21:12.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:21:12.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:21:12.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:21:12.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:21:12.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:21:12.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:21:12.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:21:12.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:21:12.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:21:12.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:21:12.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:21:12.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:21:12.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:20:54
2026-05-28T15:21:12.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69325, datetime.datetime(2026, 5, 28, 15, 20, 54), datetime.datetime(2026, 5, 28, 15, 20, 53), 'salt', 15.47, 27.73, None, 9.88, 236.96, 18.54, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:21:12.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:21:12.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:21:12.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:53, diff=19.79675s, valid=True
2026-05-28T15:21:12.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:21:12.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:21:12.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:12, diff=0.800001s, valid=True
2026-05-28T15:21:12.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:21:12.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:20:50, diff=22.807193s, valid=True
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:21:12.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:21:12.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:12, diff=0.810847s, valid=True
2026-05-28T15:21:12.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:21:12.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:21:12.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:21:12.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907114.811501s, valid=True
2026-05-28T15:21:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:21:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:21:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:21:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:21:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:21:12.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:21:12.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:21:12.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:21:12.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:21:12.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:21:13.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:21:13.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:21:13.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:21:13.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:21:13.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:21:13.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:21:13.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:21:13.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:21:13.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-28T15:21:13.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-28T15:21:14.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:21:14.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:21:44.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:21:44.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:21:44.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:21:44.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:21:44.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:21:44.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:21:44.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-28T15:21:45.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:21:45.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-28T15:21:45.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:21:45.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:21:45.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:21:45.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:21:47.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-28T15:21:47.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:21:47.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:21:47.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:21:47.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:21:47.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:21:47.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:21:47.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:21:47.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:21:47.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:21:47.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:21:47.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:21:47.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:21:48.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:21:48.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:21:48.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:21:48.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:21:48.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:21:48.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:21:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:21:48.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:21:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:21:48.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:21:48.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:21:48.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:21:24
2026-05-28T15:21:48.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69326, datetime.datetime(2026, 5, 28, 15, 21, 24), datetime.datetime(2026, 5, 28, 15, 21, 23), 'salt', 15.28, 26.57, None, 8.72, 253.01, 19.1, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:21:48.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:21:48.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:21:48.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:23, diff=25.308169s, valid=True
2026-05-28T15:21:48.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:21:48.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:21:48.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:12, diff=36.31107s, valid=True
2026-05-28T15:21:48.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:21:48.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:21:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:21, diff=27.317733s, valid=True
2026-05-28T15:21:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:21:48.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:21:48.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:21:48.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:21:48.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:21:48.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:21:48.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:12, diff=36.320786s, valid=True
2026-05-28T15:21:48.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:21:48.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:21:48.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:21:48.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907150.321492s, valid=True
2026-05-28T15:21:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:21:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:21:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:21:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:21:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:21:48.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:21:48.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:21:48.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:21:48.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:21:48.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:21:48.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:21:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:21:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:21:48.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:21:48.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:21:49.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:21:49.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:21:49.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:21:49.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-28T15:21:49.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-28T15:21:49.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:21:49.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:22:19.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:22:19.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:22:19.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:22:19.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:22:19.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:22:19.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:22:19.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:22:19.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:22:19.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:22:20.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:22:20.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:22:20.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:22:20.012 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:22:22.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-28T15:22:22.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:22:22.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:22:22.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:22:22.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:22:22.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:22:22.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:22:22.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:22:22.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:22:22.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:22:22.436 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:22:22.436 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:22:22.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:22:22.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:22:22.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:22:22.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:22:22.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:22:22.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:22:22.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:22:22.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:22:22.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:22:22.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:22:22.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:22:22.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:22:22.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:21:54
2026-05-28T15:22:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69327, datetime.datetime(2026, 5, 28, 15, 21, 54), datetime.datetime(2026, 5, 28, 15, 21, 54), 'salt', 15.04, 26.61, None, 6.81, 230.46, 19.04, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:22:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:22:22.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:22:22.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:54, diff=28.763012s, valid=True
2026-05-28T15:22:22.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:22:22.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:22:22.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:22:12, diff=10.765855s, valid=True
2026-05-28T15:22:22.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:22:22.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:21:53, diff=29.772563s, valid=True
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:22:22.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:22:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:22:22.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:22:12, diff=10.775596s, valid=True
2026-05-28T15:22:22.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:22:22.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:22:22.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:22:22.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907184.776257s, valid=True
2026-05-28T15:22:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:22:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:22:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:22:22.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:22:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:22:22.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:22:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:22:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:22:22.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:22:22.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:22:22.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:22:23.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:22:23.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:22:23.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:22:23.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:22:23.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:22:23.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:22:23.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:22:23.783 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:22:23.783 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:22:24.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:22:24.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:22:54.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:22:54.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:22:54.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:22:54.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:22:54.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:22:54.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:22:54.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-28T15:22:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:22: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-28T15:22:54.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:22:54.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:22:54.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:22:54.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-28T15:22:57.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-28T15:22:57.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:22:57.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:22:57.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:22:57.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:22:57.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:22:57.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:22:57.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:22:57.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:22:57.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:22:57.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:22:57.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:22:57.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:22:57.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:22:57.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:22:57.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:22:57.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:22:57.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:22:57.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:22:57.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:22:57.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:22:57.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:22:57.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:22:57.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:22:57.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:22:54
2026-05-28T15:22:57.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69329, datetime.datetime(2026, 5, 28, 15, 22, 54), datetime.datetime(2026, 5, 28, 15, 22, 54), 'salt', 14.81, 27.4, None, 7.02, 283.89, 18.61, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:22:57.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:22:57.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:22:57.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:22:54, diff=3.679097s, valid=True
2026-05-28T15:22:57.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:22:57.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:22:57.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:12, diff=-14.318063s, valid=True
2026-05-28T15:22:57.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:22:57.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:22:57.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:22:46, diff=11.688741s, valid=True
2026-05-28T15:22:57.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:22:57.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:22:57.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:22:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:22:57.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:22:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:22:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:12, diff=-14.308263s, valid=True
2026-05-28T15:22:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:22:57.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:22:57.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:22:57.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907219.69238s, valid=True
2026-05-28T15:22:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:22:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:22:57.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:22:57.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:22:57.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:22:57.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:22:57.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:22:57.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:22:57.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:22:57.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:22:57.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:22:57.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:22:57.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:22:58.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:22:58.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:22:58.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:22:58.704 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:22:58.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:22: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-28T15:22: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-28T15:22:58.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:22:58.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:23:28.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:23:28.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:23:28.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:23:29.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:23:29.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:23:29.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:23:29.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-28T15:23:29.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:23:29.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-28T15:23:29.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:23:29.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:23:29.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:23:29.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:23: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-28T15:23:32.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:23:32.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:23:32.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:23:32.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:23:32.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:23:32.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:23:32.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:23:32.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:23:32.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:23:32.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:23:32.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:23:32.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:23:32.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:23:32.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:23:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:23:32.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:23:32.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:23:32.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:23:32.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:23:32.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:23:32.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:23:32.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:23:32.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:23:32.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:23:25
2026-05-28T15:23:32.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69330, datetime.datetime(2026, 5, 28, 15, 23, 25), datetime.datetime(2026, 5, 28, 15, 23, 24), 'salt', 14.88, 29.19, None, 10.41, 250.48, 17.78, 829.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:23:32.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:23:32.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:23:32.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:24, diff=8.737422s, valid=True
2026-05-28T15:23:32.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:23:32.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:23:32.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:12, diff=20.740266s, valid=True
2026-05-28T15:23:32.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:23:32.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:23:32.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:17, diff=15.746907s, valid=True
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:23:32.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:23:32.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:12, diff=20.749874s, valid=True
2026-05-28T15:23:32.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:23:32.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:23:32.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:23:32.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907254.750518s, valid=True
2026-05-28T15:23:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:23:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:23:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:23:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:23:32.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:23:32.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:23:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:23:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:23:32.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:23:32.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:23:32.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:23:32.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:23:33.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:23:33.068 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:23:33.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:23:33.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:23:33.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:23:33.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:23:33.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-28T15:23:33.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-28T15:23:33.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:23:33.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:24:03.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:24:03.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:24:03.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:24:04.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:24:04.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:24:04.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:24:04.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:24:04.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:24:04.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-28T15:24:04.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:24:04.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:24:04.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:24:04.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-28T15:24:06.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-28T15:24:06.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:24:06.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:24:06.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:24:06.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:24:06.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:24:06.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:24:06.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:24:06.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:24:06.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:24:06.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:24:06.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:24:06.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:24:06.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:24:06.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:24:06.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:24:06.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:24:06.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:24:06.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:24:07.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:24:07.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:24:07.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:24:07.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:24:07.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:24:07.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:23:56
2026-05-28T15:24:07.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69331, datetime.datetime(2026, 5, 28, 15, 23, 56), datetime.datetime(2026, 5, 28, 15, 23, 55), 'salt', 15.04, 28.13, None, 10.94, 256.23, 18.29, 829.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:24:07.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:24:07.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:24:07.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:55, diff=12.094131s, valid=True
2026-05-28T15:24:07.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:24:07.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:24:07.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:12, diff=-4.903015s, valid=True
2026-05-28T15:24:07.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:24:07.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:23:48, diff=19.10357s, valid=True
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:24:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:24:07.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:24:07.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:12, diff=-4.893396s, valid=True
2026-05-28T15:24:07.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:24:07.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:24:07.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:24:07.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907289.107259s, valid=True
2026-05-28T15:24:07.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:24:07.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:24:07.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:24:07.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:24:07.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:24:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:24:07.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:24:07.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:24:07.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:24:07.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:24:07.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:24:07.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:24:07.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:24:07.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:24:07.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:24:07.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:24:08.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:24:08.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:24:08.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-28T15:24:08.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-28T15:24:08.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:24:08.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:24:38.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:24:38.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:24:38.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:24:38.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:24:38.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:24:39.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:24:39.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-28T15:24:39.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:24:39.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-28T15:24:39.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:24:39.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:24:39.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:24:39.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-28T15:24:41.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-28T15:24:41.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:24:41.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:24:41.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:24:41.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:24:41.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:24:41.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:24:41.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:24:41.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:24:41.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:24:41.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:24:41.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:24:41.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:24:41.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:24:41.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:24:42.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:24:42.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:24:42.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:24:42.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:24:42.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:24:42.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:24:42.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:24:42.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:24:42.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:24:42.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:24:26
2026-05-28T15:24:42.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69332, datetime.datetime(2026, 5, 28, 15, 24, 26), datetime.datetime(2026, 5, 28, 15, 24, 26), 'salt', 15.24, 28.69, None, 11.89, 244.93, 18.06, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:24:42.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:24:42.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:24:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:26, diff=16.198604s, valid=True
2026-05-28T15:24:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:24:42.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:24:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:12, diff=30.201443s, valid=True
2026-05-28T15:24:42.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:24:42.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:19, diff=23.207988s, valid=True
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:24:42.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:24:42.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:12, diff=30.21104s, valid=True
2026-05-28T15:24:42.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:24:42.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:24:42.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:24:42.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907324.211711s, valid=True
2026-05-28T15:24:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:24:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:24:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:24:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:24:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:24:42.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:24:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:24:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:24:42.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:24:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:24:42.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:24:42.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:24:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:24:42.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:24:42.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:24:43.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:24:43.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:24:43.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:24:43.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-28T15:24:43.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-28T15:24:43.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:24:43.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:25:13.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:25:13.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:25:13.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:25:13.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:25:13.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:25:13.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:25:13.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-28T15:25:13.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:25:13.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-28T15:25:13.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:25:13.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:25:13.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:25: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-28T15:25:16.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-28T15:25:16.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:25:16.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:25:16.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:25:16.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:25:16.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:25:16.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:25:16.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:25:16.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:25:16.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:25:16.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:25:16.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:25:16.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:25:16.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:25:16.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:25:16.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:25:16.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:25:16.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:25:16.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:25:16.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:25:16.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:25:16.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:25:16.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:25:16.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:25:16.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:24:56
2026-05-28T15:25:16.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69333, datetime.datetime(2026, 5, 28, 15, 24, 56), datetime.datetime(2026, 5, 28, 15, 24, 56), 'salt', 15.24, 27.37, None, 11.22, 238.27, 18.69, 829.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:25:16.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:25:16.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:25:16.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:56, diff=20.604503s, valid=True
2026-05-28T15:25:16.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:25:16.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:25:16.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:12, diff=4.607395s, valid=True
2026-05-28T15:25:16.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:25:16.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:24:51, diff=25.614007s, valid=True
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:25:16.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:25:16.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:12, diff=4.617059s, valid=True
2026-05-28T15:25:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:25:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:25:16.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:25:16.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907358.61776s, valid=True
2026-05-28T15:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:25:16.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:25:16.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:25:16.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:25:16.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:25:16.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:25:16.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:25:16.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:25:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:25:16.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:25:16.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:25:17.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:25:17.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:25:17.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:25:17.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:25:17.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-28T15:25:17.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-28T15:25:17.789 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:25:17.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:25:47.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:25:47.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:25:47.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:25:48.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:25:48.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:25:48.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:25:48.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-28T15:25:48.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:25:48.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-28T15:25:48.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:25:48.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:25:48.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:25:48.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-28T15:25:50.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-28T15:25:50.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:25:50.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:25:50.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:25:50.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:25:50.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:25:50.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:25:50.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:25:50.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:25:50.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:25:50.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:25:50.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:25:50.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:25:50.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:25:50.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:25:50.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:25:50.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:25:50.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:25:50.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:25:50.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:25:50.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:25:50.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:25:50.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:25:50.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:25:51.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:25:26
2026-05-28T15:25:51.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69334, datetime.datetime(2026, 5, 28, 15, 25, 26), datetime.datetime(2026, 5, 28, 15, 25, 26), 'salt', 15.08, 27.0, None, 10.62, 198.89, 18.85, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:25:51.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:25:51.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:25:51.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:26, diff=25.041539s, valid=True
2026-05-28T15:25:51.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:25:51.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:25:51.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:12, diff=39.044346s, valid=True
2026-05-28T15:25:51.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:25:51.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:25:51.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:22, diff=29.050943s, valid=True
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:25:51.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:25:51.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:12, diff=39.053987s, valid=True
2026-05-28T15:25:51.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:25:51.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:25:51.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:25:51.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907393.054655s, valid=True
2026-05-28T15:25:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:25:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:25:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:25:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:25:51.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:25:51.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:25:51.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:25:51.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:25:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:25:51.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:25:51.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:25:51.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:25:51.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:25:51.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:25:51.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:25:52.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:25:52.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:25:52.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:25:52.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-28T15:25:52.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-28T15:25:52.296 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:25:52.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:26:22.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:26:22.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:26:22.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:26:22.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:26:22.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:26:23.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:26:23.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-28T15:26:23.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:26:23.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-28T15:26:23.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:26:23.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:26:23.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:26:23.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-28T15:26:25.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-28T15:26:25.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:26:25.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:26:25.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:26:25.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:26:25.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:26:25.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:26:25.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:26:25.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:26:25.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:26:25.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:26:25.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:26:25.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:26:25.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:26:25.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:26:25.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:26:25.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:26:25.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:26:25.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:26:25.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:26:25.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:26:25.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:26:25.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:26:25.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:26:25.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:25:57
2026-05-28T15:26:25.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69335, datetime.datetime(2026, 5, 28, 15, 25, 57), datetime.datetime(2026, 5, 28, 15, 25, 56), 'salt', 15.01, 27.14, None, 12.18, 210.61, 18.77, 829.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:26:25.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:26:25.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:26:25.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:56, diff=29.975381s, valid=True
2026-05-28T15:26:25.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:26:25.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:26:25.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:26:12, diff=13.978284s, valid=True
2026-05-28T15:26:25.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:26:25.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:25:54, diff=31.985222s, valid=True
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:26:25.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:26:25.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:26:12, diff=13.988323s, valid=True
2026-05-28T15:26:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:26:25.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:26:25.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:26:25.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907427.989002s, valid=True
2026-05-28T15:26:25.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:26:25.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:26:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:26:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:26:25.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:26:26.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:26:26.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:26:26.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:26:26.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:26:26.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:26:26.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:26:26.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:26:26.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:26:26.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:26:26.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:26:26.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:26:27.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:26:27.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:26:27.037 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:26:27.037 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:26:27.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:26:27.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:26:57.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:26:57.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:26:57.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:26:57.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:26:57.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:26:57.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:26:57.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-28T15:26:57.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:26:57.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-28T15:26:57.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:26:57.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:26:57.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:26:57.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-28T15:27:00.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-28T15:27:00.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:27:00.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:27:00.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:27:00.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:27:00.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:27:00.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:27:00.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:27:00.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:27:00.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:27:00.235 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:27:00.235 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:27:00.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:27:00.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:27:00.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:27:00.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:27:00.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:27:00.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:27:00.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:27:00.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:27:00.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:27:00.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:27:00.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:27:00.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:27:00.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:26:57
2026-05-28T15:27:00.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69337, datetime.datetime(2026, 5, 28, 15, 26, 57), datetime.datetime(2026, 5, 28, 15, 26, 57), 'salt', 15.01, 28.23, None, 10.02, 212.34, 18.24, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:27:00.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:27:00.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:27:00.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:26:57, diff=3.559784s, valid=True
2026-05-28T15:27:00.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:27:00.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:27:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:12, diff=-11.437343s, valid=True
2026-05-28T15:27:00.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:27:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:26:57, diff=3.569415s, valid=True
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:27:00.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:27:00.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:12, diff=-11.427567s, valid=True
2026-05-28T15:27:00.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:27:00.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:27:00.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:27:00.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907462.573115s, valid=True
2026-05-28T15:27:00.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:27:00.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:27:00.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:27:00.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:27:00.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:27:00.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:27:00.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:27:00.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:27:00.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:27:00.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:27:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:27:00.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:27:00.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:27:00.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:27:01.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:27:01.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:27:01.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:27:01.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:27:01.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-28T15:27:01.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-28T15:27:01.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:27:01.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:27:31.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:27:31.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:27:31.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:27:32.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:27:32.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:27:32.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:27:32.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:27:32.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:27:32.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:27:32.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:27:32.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:27:32.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:27:32.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-28T15:27:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T15:27:34.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:27:34.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:27:34.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:27:34.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:27:34.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:27:34.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:27:34.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:27:34.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:27:34.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:27:34.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:27:34.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:27:34.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:27:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:27:34.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:27:34.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:27:34.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:27:35.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:27:35.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:27:35.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:27:35.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:27:35.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:27:35.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:27:35.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:27:35.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:27:27
2026-05-28T15:27:35.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69338, datetime.datetime(2026, 5, 28, 15, 27, 27), datetime.datetime(2026, 5, 28, 15, 27, 27), 'salt', 14.74, 26.67, None, 7.66, 214.38, 18.96, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:27:35.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:27:35.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:27:35.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:27, diff=8.141849s, valid=True
2026-05-28T15:27:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:27:35.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:27:35.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:12, diff=23.144714s, valid=True
2026-05-28T15:27:35.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:27:35.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:18, diff=17.151552s, valid=True
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:27:35.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:27:35.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:27:35.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:12, diff=23.154645s, valid=True
2026-05-28T15:27:35.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:27:35.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:27:35.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:27:35.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907497.155301s, valid=True
2026-05-28T15:27:35.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:27:35.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:27:35.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:27:35.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:27:35.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:27:35.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:27:35.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:27:35.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:27:35.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:27:35.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:27:35.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:27:35.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:27:35.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:27:35.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:27:35.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:27:36.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:27:36.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:27:36.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:27:36.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-28T15:27:36.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-28T15:27:36.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:27:36.298 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:28:06.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:28:06.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:28:06.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:28:06.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:28:06.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:28:06.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:28:06.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-28T15:28:06.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:28:06.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-28T15:28:06.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:28:06.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:28:06.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:28:06.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:28:10.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-28T15:28:10.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:28:10.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:28:10.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:28:10.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:28:10.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:28:10.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:28:10.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:28:10.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:28:10.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:28:10.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:28:10.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:28:10.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:28:10.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:28:10.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:28:10.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:28:10.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:28:10.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:28:10.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:28:10.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:28:10.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:28:10.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:28:10.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:28:10.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:28:10.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:27:58
2026-05-28T15:28:10.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69339, datetime.datetime(2026, 5, 28, 15, 27, 58), datetime.datetime(2026, 5, 28, 15, 27, 57), 'salt', 14.74, 26.41, None, 5.61, 202.52, 19.09, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:28:10.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:28:10.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:28:10.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:57, diff=13.892942s, valid=True
2026-05-28T15:28:10.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:28:10.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:28:10.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:12, diff=-1.104204s, valid=True
2026-05-28T15:28:10.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:28:10.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:28:10.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:27:49, diff=21.902834s, valid=True
2026-05-28T15:28:10.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:28:10.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:28:10.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:28:10.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:28:10.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:28:10.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:28:10.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:12, diff=-1.094047s, valid=True
2026-05-28T15:28:10.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:28:10.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:28:10.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:28:10.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907532.906596s, valid=True
2026-05-28T15:28:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:28:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:28:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:28:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:28:10.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:28:10.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:28:10.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:28:10.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:28:10.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:28:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:28:11.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:28:11.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:28:11.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:28:11.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:28:11.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:28:11.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:28:11.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:28:11.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:28:11.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-28T15:28:11.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-28T15:28:11.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:28:11.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:28:42.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:28:42.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:28:42.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:28:42.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:28:42.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:28:42.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:28:42.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:28:42.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:28:42.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-28T15:28:42.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:28:42.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:28:42.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:28:42.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-28T15:28:45.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-28T15:28:45.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:28:45.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:28:45.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:28:45.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:28:45.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:28:45.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:28:45.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:28:45.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:28:45.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:28:45.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:28:45.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:28:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:28:45.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:28:45.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:28:45.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:28:45.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:28:45.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:28:45.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:28:45.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:28:45.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:28:45.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:28:45.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:28:45.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:28:45.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:28:28
2026-05-28T15:28:45.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69340, datetime.datetime(2026, 5, 28, 15, 28, 28), datetime.datetime(2026, 5, 28, 15, 28, 27), 'salt', 14.88, 27.73, None, 6.39, 197.03, 18.47, 829.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:28:45.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:28:45.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:28:45.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:27, diff=18.857265s, valid=True
2026-05-28T15:28:45.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:28:45.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:28:45.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:12, diff=33.860106s, valid=True
2026-05-28T15:28:45.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:28:45.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:28:45.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:20, diff=25.866828s, valid=True
2026-05-28T15:28:45.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:28:45.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:28:45.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:28:45.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:28:45.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:28:45.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:28:45.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:12, diff=33.869883s, valid=True
2026-05-28T15:28:45.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:28:45.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:28:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:28:45.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907567.870532s, valid=True
2026-05-28T15:28:45.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:28:45.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:28:45.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:28:45.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:28:45.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:28:45.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:28:45.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:28:45.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:28:45.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:28:46.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:28:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:28:46.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:28:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:28:46.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:28:46.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:28:46.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:28:46.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:28:46.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:28:46.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-28T15:28:46.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-28T15:28:47.159 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:28:47.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:29:17.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:29:17.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:29:17.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:29:17.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:29:17.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:29:17.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:29:17.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-28T15:29:17.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:29:17.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-28T15:29:17.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:29:17.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:29:17.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:29:17.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:29:20.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-28T15:29:20.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:29:20.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:29:20.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:29:20.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:29:20.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:29:20.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:29:20.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:29:20.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:29:20.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:29:20.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:29:20.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:29:20.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:29:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:29:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:29:20.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:29:20.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:29:20.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:29:20.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:29:20.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:29:20.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:29:20.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:29:20.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:29:20.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:29:20.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:28:58
2026-05-28T15:29:20.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69341, datetime.datetime(2026, 5, 28, 15, 28, 58), datetime.datetime(2026, 5, 28, 15, 28, 58), 'salt', 14.94, 27.0, None, 7.09, 212.85, 18.83, 829.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:29:20.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:29:20.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:29:20.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:58, diff=22.570735s, valid=True
2026-05-28T15:29:20.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:29:20.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:29:20.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:12, diff=8.573544s, valid=True
2026-05-28T15:29:20.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:29:20.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:28:52, diff=28.580105s, valid=True
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:29:20.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:29:20.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:12, diff=8.583105s, valid=True
2026-05-28T15:29:20.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:29:20.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:29:20.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:29:20.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907602.583774s, valid=True
2026-05-28T15:29:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:29:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:29:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:29:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:29:20.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:29:20.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:29:20.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:29:20.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:29:20.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:29:20.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:29:20.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:29:20.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:29:20.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:29:20.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:29:21.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:29:21.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:29:21.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:29:21.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:29:21.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-28T15:29:21.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-28T15:29:21.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:29:21.856 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:29:51.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:29:51.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:29:51.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:29:52.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:29:52.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:29:52.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:29:52.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-28T15:29:52.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:29:52.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-28T15:29:52.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:29:52.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:29:52.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:29:52.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-28T15:29:55.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-28T15:29:55.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:29:55.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:29:55.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:29:55.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:29:55.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:29:55.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:29:55.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:29:55.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:29:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:29:55.097 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:29:55.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:29:55.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:29:55.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:29:55.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:29:55.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:29:55.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:29:55.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:29:55.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:29:55.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:29:55.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:29:55.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:29:55.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:29:55.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:29:55.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:29:28
2026-05-28T15:29:55.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69342, datetime.datetime(2026, 5, 28, 15, 29, 28), datetime.datetime(2026, 5, 28, 15, 29, 28), 'salt', 14.94, 25.91, None, 5.12, 251.86, 19.38, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:29:55.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:29:55.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:29:55.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:28, diff=27.46442s, valid=True
2026-05-28T15:29:55.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:29:55.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:29:55.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:12, diff=43.467356s, valid=True
2026-05-28T15:29:55.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:29:55.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:23, diff=32.474163s, valid=True
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:29:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:29:55.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:29:12, diff=43.477339s, valid=True
2026-05-28T15:29:55.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:29:55.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:29:55.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:29:55.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907637.478008s, valid=True
2026-05-28T15:29:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:29:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:29:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:29:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:29:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:29:55.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:29:55.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:29:55.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:29:55.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:29:55.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:29:55.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:29:55.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:29:55.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:29:55.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:29:56.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:29:56.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:29:56.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:29:56.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:29:56.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-28T15:29:56.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-28T15:29:56.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:29:56.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:30:26.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:30:26.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:30:26.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:30:27.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:30:27.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:30:27.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:30:27.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-28T15:30:27.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:30:27.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-28T15:30:27.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:30:27.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:30:27.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:30:27.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-28T15:30:29.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-28T15:30:29.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:30:29.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:30:29.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:30:29.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:30:30.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:30:30.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:30:30.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:30:30.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:30:30.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:30:30.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:30:30.015 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:30:30.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:30:30.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:30:30.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:30:30.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:30:30.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:30:30.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:30:30.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:30:30.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:30:30.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:30:30.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:30:30.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:30:30.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:30:30.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:30:29
2026-05-28T15:30:30.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69344, datetime.datetime(2026, 5, 28, 15, 30, 29), datetime.datetime(2026, 5, 28, 15, 30, 29), 'salt', 14.91, 27.14, None, 8.15, 213.35, 18.76, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:30:30.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:30:30.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:30:30.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:29, diff=1.338985s, valid=True
2026-05-28T15:30:30.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:30:30.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:30:30.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:12, diff=18.342015s, valid=True
2026-05-28T15:30:30.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:30:30.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:30:30.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:27, diff=3.348818s, valid=True
2026-05-28T15:30:30.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:30:30.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:30:30.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:30:30.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:30:30.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:30:30.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:30:30.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:12, diff=18.351949s, valid=True
2026-05-28T15:30:30.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:30:30.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:30:30.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:30:30.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907672.352626s, valid=True
2026-05-28T15:30:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:30:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:30:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:30:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:30:30.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:30:30.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:30:30.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:30:30.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:30:30.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:30:30.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:30:30.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:30:30.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:30:30.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:30:30.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:30:30.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:30:31.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:30:31.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:30:31.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:30:31.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-28T15:30:31.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-28T15:30:31.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:30:31.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:31:01.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:31:01.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:31:01.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:31:01.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:31:01.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:31:02.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:31:02.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-28T15:31:02.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:31:02.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-28T15:31:02.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:31:02.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:31:02.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:31:02.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-28T15:31:04.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-28T15:31:04.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:31:04.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:31:04.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:31:04.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:31:04.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:31:04.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:31:04.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:31:04.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:31:04.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:31:04.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:31:04.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:31:04.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:31:04.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:31:04.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:31:04.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:31:04.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:31:04.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:31:04.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:31:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:31:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:31:04.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:31:04.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:31:04.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:31:04.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:30:59
2026-05-28T15:31:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69345, datetime.datetime(2026, 5, 28, 15, 30, 59), datetime.datetime(2026, 5, 28, 15, 30, 59), 'salt', 14.88, 27.07, None, 6.21, 193.3, 18.79, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:31:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:31:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:31:04.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:59, diff=5.815541s, valid=True
2026-05-28T15:31:04.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:31:04.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:31:04.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:12, diff=-7.181533s, valid=True
2026-05-28T15:31:04.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:31:04.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:30:58, diff=6.82529s, valid=True
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:31:04.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:31:04.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:12, diff=-7.171571s, valid=True
2026-05-28T15:31:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:31:04.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:31:04.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:31:04.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907706.829108s, valid=True
2026-05-28T15:31:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:31:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:31:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:31:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:31:04.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:31:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:31:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:31:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:31:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:31:04.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:31:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:31:05.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:31:05.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:31:05.232 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:31:05.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:31:05.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:31:05.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:31:05.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:31:05.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-28T15:31:05.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-28T15:31:06.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:31:06.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:31:36.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:31:36.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:31:36.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:31:36.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:31:36.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:31:36.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:31:36.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-28T15:31:36.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:31:36.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-28T15:31:36.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:31:36.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:31:36.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:31:36.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-28T15:31:39.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-28T15:31:39.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:31:39.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:31:39.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:31:39.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:31:39.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:31:39.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:31:39.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:31:39.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:31:39.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:31:39.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:31:39.273 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:31:39.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:31:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:31:39.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:31:39.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:31:39.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:31:39.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:31:39.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:31:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:31:39.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:31:39.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:31:39.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:31:39.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:31:39.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:31:30
2026-05-28T15:31:39.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69346, datetime.datetime(2026, 5, 28, 15, 31, 30), datetime.datetime(2026, 5, 28, 15, 31, 29), 'salt', 15.01, 28.83, None, 2.83, 218.83, 17.97, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:31:39.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:31:39.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:31:39.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:29, diff=10.588123s, valid=True
2026-05-28T15:31:39.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:31:39.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:31:39.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:12, diff=27.590972s, valid=True
2026-05-28T15:31:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:31:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:31:39.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:29, diff=10.597598s, valid=True
2026-05-28T15:31:39.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:31:39.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:31:39.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:31:39.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:31:39.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:31:39.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:31:39.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:12, diff=27.600686s, valid=True
2026-05-28T15:31:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:31:39.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:31:39.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:31:39.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907741.601359s, valid=True
2026-05-28T15:31:39.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:31:39.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:31:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:31:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:31:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:31:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:31:39.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:31:39.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:31:39.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:31:39.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:31:39.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:31:39.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:31:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:31:39.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:31:40.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:31:40.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:31:40.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:31:40.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:31:40.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-28T15:31:40.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-28T15:31:40.777 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:31:40.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:32:10.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:32:10.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:32:10.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:32:11.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:32:11.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:32:11.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:32:11.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-28T15:32:11.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:32:11.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-28T15:32:11.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:32:11.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:32:11.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:32:11.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-28T15:32:13.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-28T15:32:13.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:32:13.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:32:13.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:32:13.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:32:14.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:32:14.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:32:14.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:32:14.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:32:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:32:14.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:32:14.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:32:14.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:32:14.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:32:14.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:32:14.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:32:14.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:32:14.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:32:14.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:32:14.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:32:14.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:32:14.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:32:14.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:32:14.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:32:14.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:32:00
2026-05-28T15:32:14.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69347, datetime.datetime(2026, 5, 28, 15, 32), datetime.datetime(2026, 5, 28, 15, 32), 'salt', 15.17, 29.16, None, 4.06, 248.76, 17.83, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:32:14.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:32:14.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:32:14.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:00, diff=14.337556s, valid=True
2026-05-28T15:32:14.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:32:14.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:32:14.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:12, diff=2.340378s, valid=True
2026-05-28T15:32:14.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:32:14.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:32:14.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:31:51, diff=23.346959s, valid=True
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:32:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:32:14.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:12, diff=2.349932s, valid=True
2026-05-28T15:32:14.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:32:14.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:32:14.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:32:14.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907776.350577s, valid=True
2026-05-28T15:32:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:32:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:32:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:32:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:32:14.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:32:14.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:32:14.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:32:14.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:32:14.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:32:14.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:32:14.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:32:14.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:32:14.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:32:14.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:32:14.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:32:15.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:32:15.428 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:32:15.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:32:15.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:32:15.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:32:15.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:32:15.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:32:45.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:32:45.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:32:45.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:32:46.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:32:46.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:32:46.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:32:46.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-28T15:32:46.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:32:46.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-28T15:32:46.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:32:46.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:32:46.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:32:46.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-28T15:32:48.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-28T15:32:48.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:32:48.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:32:48.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:32:48.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:32:48.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:32:48.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:32:48.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:32:48.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:32:48.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:32:48.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:32:48.953 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:32:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:32:49.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:32:49.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:32:49.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:32:49.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:32:49.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:32:49.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:32:49.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:32:49.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:32:49.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:32:49.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:32:49.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:32:49.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:32:30
2026-05-28T15:32:49.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69348, datetime.datetime(2026, 5, 28, 15, 32, 30), datetime.datetime(2026, 5, 28, 15, 32, 30), 'salt', 15.24, 26.44, None, 7.2, 247.97, 19.15, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:32:49.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:32:49.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:32:49.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:30, diff=19.272047s, valid=True
2026-05-28T15:32:49.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:32:49.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:32:49.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:12, diff=37.275003s, valid=True
2026-05-28T15:32:49.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:32:49.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:32:49.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:22, diff=27.281777s, valid=True
2026-05-28T15:32:49.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:32:49.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:32:49.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:32:49.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:32:49.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:32:49.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:32:49.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:12, diff=37.284889s, valid=True
2026-05-28T15:32:49.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:32:49.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:32:49.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:32:49.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907811.285556s, valid=True
2026-05-28T15:32:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:32:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:32:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:32:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:32:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:32:49.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:32:49.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:32:49.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:32:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:32:49.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:32:49.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:32:49.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:32:49.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:32:49.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:32:49.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:32:50.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:32:50.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:32:50.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:32:50.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-28T15:32:50.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-28T15:32:50.501 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:32:50.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:33:20.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:33:20.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:33:20.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:33:20.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:33:20.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:33:21.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:33: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-28T15:33:21.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:33:21.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-28T15:33:21.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:33:21.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:33:21.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:33:21.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:33:23.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-28T15:33:23.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:33:23.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:33:23.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:33:23.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:33:23.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:33:23.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:33:23.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:33:23.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:33:23.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:33:23.604 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:33:23.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:33:23.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:33:23.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:33:23.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:33:23.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:33:23.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:33:23.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:33:23.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:33:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:33:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:33:23.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:33:23.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:33:23.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:33:23.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:33:00
2026-05-28T15:33:23.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69349, datetime.datetime(2026, 5, 28, 15, 33), datetime.datetime(2026, 5, 28, 15, 33), 'salt', 15.17, 27.1, None, 11.47, 292.86, 18.81, 829.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:33:23.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:33:23.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:33:23.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:00, diff=23.920639s, valid=True
2026-05-28T15:33:23.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:33:23.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:33:23.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:12, diff=11.923537s, valid=True
2026-05-28T15:33:23.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:33:23.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:32:54, diff=29.930317s, valid=True
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:33:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:33:23.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:12, diff=11.933405s, valid=True
2026-05-28T15:33:23.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:33:23.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:33:23.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:33:23.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907845.934075s, valid=True
2026-05-28T15:33:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:33:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:33:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:33:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:33:23.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:33:23.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:33:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:33:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:33:24.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:33:24.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:33:24.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:33:24.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:33:24.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:33:24.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:33:24.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:33:24.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:33:24.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:33:24.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:33:24.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-28T15:33:24.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-28T15:33:25.183 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:33:25.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:33:55.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:33:55.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:33:55.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:33:55.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:33:55.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:33:55.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:33:55.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:33:55.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:33:55.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-28T15:33:55.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:33:55.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:33:55.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:33:55.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:33:58.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-28T15:33:58.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:33:58.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:33:58.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:33:58.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:33:58.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:33:58.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:33:58.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:33:58.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:33:58.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:33:58.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:33:58.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:33:58.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:33:58.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:33:58.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:33:58.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:33:58.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:33:58.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:33:58.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:33:58.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:33:58.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:33:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:33:58.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:33:58.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:33:58.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:33:31
2026-05-28T15:33:58.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69350, datetime.datetime(2026, 5, 28, 15, 33, 31), datetime.datetime(2026, 5, 28, 15, 33, 30), 'salt', 15.31, 28.83, None, 11.54, 226.21, 18.01, 829.78, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:33:58.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:33:58.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:33:58.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:30, diff=28.527068s, valid=True
2026-05-28T15:33:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:33:58.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:33:58.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:12, diff=46.530181s, valid=True
2026-05-28T15:33:58.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:33:58.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:25, diff=33.537362s, valid=True
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:33:58.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:33:58.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:33:12, diff=46.540614s, valid=True
2026-05-28T15:33:58.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:33:58.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:33:58.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:33:58.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907880.541341s, valid=True
2026-05-28T15:33:58.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:33:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:33:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:33:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:33:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:33:58.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:33:58.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:33:58.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:33:58.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:33:58.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:33:58.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:33:58.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:33:58.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:33:58.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:33:59.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:33:59.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:33:59.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:33:59.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:33:59.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-28T15:33:59.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-28T15:34:01.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:34:01.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:34:31.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:34:31.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:34:31.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:34:31.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:34:31.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:34:31.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:34:31.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-28T15:34:31.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:34:31.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-28T15:34:31.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:34:31.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:34:31.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:34:31.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-28T15:34:34.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-28T15:34:34.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:34:34.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:34:34.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:34:34.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:34:34.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:34:34.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:34:34.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:34:34.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:34:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:34:34.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:34:34.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:34:34.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:34:34.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:34:34.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:34:34.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:34:34.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:34:34.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:34:34.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:34:34.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:34:34.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:34:34.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:34:34.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:34:34.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:34:34.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:34:31
2026-05-28T15:34:34.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69352, datetime.datetime(2026, 5, 28, 15, 34, 31), datetime.datetime(2026, 5, 28, 15, 34, 31), 'salt', 14.97, 31.51, None, 11.15, 245.9, 16.75, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:34:34.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:34:34.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:34:34.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:34:31, diff=3.754545s, valid=True
2026-05-28T15:34:34.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:34:34.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:34:34.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:34:12, diff=22.757359s, valid=True
2026-05-28T15:34:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:34:34.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:34:34.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:34:28, diff=6.763863s, valid=True
2026-05-28T15:34:34.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:34:34.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:34:34.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:34:34.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:34:34.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:34:34.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:34:34.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:34:12, diff=22.766854s, valid=True
2026-05-28T15:34:34.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:34:34.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:34:34.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:34:34.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907916.767489s, valid=True
2026-05-28T15:34:34.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:34:34.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:34:34.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:34:34.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:34:34.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:34:34.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:34:34.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:34:34.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:34:34.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:34:34.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:34:34.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:34:34.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:34:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:34:35.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:34:35.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:34:35.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:34:35.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:34:35.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:34:35.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-28T15:34:35.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-28T15:34:35.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:34:35.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:35:05.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:35:05.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:35:05.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:35:06.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:35:06.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:35:06.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:35:06.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:35:06.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:35:06.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:35:06.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:35:06.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:35:06.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:35:06.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-28T15:35:09.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-28T15:35:09.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:35:09.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:35:09.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:35:09.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:35:09.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:35:09.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:35:09.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:35:09.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:35:09.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:35:09.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:35:09.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:35:09.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:35:09.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:35:09.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:35:09.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:35:09.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:35:09.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:35:09.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:35:09.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:35:09.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:35:09.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:35:09.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:35:09.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:35:09.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:35:01
2026-05-28T15:35:09.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69353, datetime.datetime(2026, 5, 28, 15, 35, 1), datetime.datetime(2026, 5, 28, 15, 35, 1), 'salt', 14.81, 32.77, None, 9.49, 223.68, 16.21, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:35:09.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:35:09.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:35:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:01, diff=8.577208s, valid=True
2026-05-28T15:35:09.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:35:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:35:09.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:12, diff=-2.419849s, valid=True
2026-05-28T15:35:09.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:35:09.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:35:09.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:34:59, diff=10.586809s, valid=True
2026-05-28T15:35:09.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:35:09.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:35:09.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:35:09.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:35:09.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:35:09.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:35:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:12, diff=-2.410153s, valid=True
2026-05-28T15:35:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:35:09.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:35:09.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:35:09.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907951.5905s, valid=True
2026-05-28T15:35:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:35:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:35:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:35:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:35:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:35:09.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:35:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:35:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:35:09.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:35:09.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:35:09.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:35:09.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:35:09.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:35:09.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:35:10.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:35:10.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:35:10.699 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:35:10.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:35:10.700 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:35:10.700 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:35:10.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:35:10.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:35:40.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:35:40.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:35:40.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:35:41.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:35:41.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:35:41.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:35:41.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-28T15:35:41.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:35:41.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-28T15:35:41.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:35:41.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:35:41.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:35:41.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:35:43.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-28T15:35:43.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:35:43.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:35:43.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:35:43.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:35:43.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:35:43.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:35:43.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:35:43.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:35:43.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:35:43.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:35:43.836 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:35:43.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:35:43.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:35:43.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:35:44.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:35:44.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:35:44.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:35:44.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:35:44.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:35:44.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:35:44.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:35:44.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:35:44.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:35:44.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:35:31
2026-05-28T15:35:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69354, datetime.datetime(2026, 5, 28, 15, 35, 31), datetime.datetime(2026, 5, 28, 15, 35, 31), 'salt', 14.91, 31.81, None, 13.16, 275.44, 16.62, 829.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:35:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:35:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:35:44.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:31, diff=13.159096s, valid=True
2026-05-28T15:35:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:35:44.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:35:44.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:12, diff=32.162003s, valid=True
2026-05-28T15:35:44.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:35:44.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:31, diff=13.16858s, valid=True
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:35:44.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:35:44.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:35:44.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:12, diff=32.17164s, valid=True
2026-05-28T15:35:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:35:44.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:35:44.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:35:44.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=907986.172283s, valid=True
2026-05-28T15:35:44.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:35:44.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:35:44.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:35:44.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:35:44.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:35:44.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:35:44.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:35:44.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:35:44.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:35:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:35:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:35:44.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:35:44.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:35:44.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:35:44.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:35:45.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:35:45.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:35:45.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:35:45.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-28T15:35:45.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-28T15:35:45.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:35:45.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:36:15.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:36:15.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:36:15.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:36:15.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:36:15.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:36:16.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:36:16.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-28T15:36:16.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:36:16.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-28T15:36:16.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:36:16.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:36:16.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:36:16.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:36:18.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-28T15:36:18.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:36:18.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:36:18.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:36:18.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:36:18.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:36:18.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:36:18.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:36:18.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:36:18.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:36:18.543 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:36:18.543 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:36:18.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:36:18.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:36:18.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:36:18.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:36:18.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:36:18.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:36:18.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:36:18.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 673 rows from lcogt
2026-05-28T15:36:18.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:36:18.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:36:18.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:36:18.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:36:18.904 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:36:02
2026-05-28T15:36:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69355, datetime.datetime(2026, 5, 28, 15, 36, 2), datetime.datetime(2026, 5, 28, 15, 36, 1), 'salt', 15.04, 29.19, None, 7.8, 250.07, 17.8, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:36:18.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:36:18.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:36:18.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:01, diff=17.911018s, valid=True
2026-05-28T15:36:18.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:36:18.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:36:18.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=6.913914s, valid=True
2026-05-28T15:36:18.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:36:18.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:35:53, diff=25.920592s, valid=True
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:36:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:36:18.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 673 rows. Structure expected: 10 fields
2026-05-28T15:36:18.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=6.923624s, valid=True
2026-05-28T15:36:18.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:36:18.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:36:18.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:36:18.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908020.924274s, valid=True
2026-05-28T15:36:18.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:36:18.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:36:18.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:36:18.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:36:18.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:36:18.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:36:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:36:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:36:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:36:19.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:36:19.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:36:19.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:36:19.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:36:19.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:36:19.545 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:36:19.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:36:20.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:36:20.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:36:20.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-28T15:36:20.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-28T15:36:20.095 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:36:20.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:36:50.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:36:50.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:36:50.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:36:50.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:36:50.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:36:50.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:36:50.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-28T15:36:50.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:36:50.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-28T15:36:50.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:36:50.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:36:50.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:36:50.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-28T15:36:53.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-28T15:36:53.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:36:53.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:36:53.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:36:53.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:36:53.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:36:53.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:36:53.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:36:53.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:36:53.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:36:53.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:36:53.116 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:36:53.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:36:53.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:36:53.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:36:53.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:36:53.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:36:53.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:36:53.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:36:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:36:53.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:36:53.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:36:53.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:36:53.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:36:53.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:36:32
2026-05-28T15:36:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69356, datetime.datetime(2026, 5, 28, 15, 36, 32), datetime.datetime(2026, 5, 28, 15, 36, 32), 'salt', 15.21, 31.21, None, 5.61, 277.17, 16.92, 829.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:36:53.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:36:53.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:36:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:32, diff=21.432141s, valid=True
2026-05-28T15:36:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:36:53.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:36:53.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=41.435031s, valid=True
2026-05-28T15:36:53.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:36:53.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:36:53.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:23, diff=30.441722s, valid=True
2026-05-28T15:36:53.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:36:53.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:36:53.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:36:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:36:53.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:36:53.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:36:53.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=41.444837s, valid=True
2026-05-28T15:36:53.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:36:53.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:36:53.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:36:53.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908055.445505s, valid=True
2026-05-28T15:36:53.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:36:53.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:36:53.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:36:53.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:36:53.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:36:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:36:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:36:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:36:53.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:36:53.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:36:53.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:36:53.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:36:53.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:36:53.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:36:54.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:36:54.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:36:54.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:36:54.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:36:54.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-28T15:36:54.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-28T15:36:54.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:36:54.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:37:24.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:37:24.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:37: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-28T15:37:25.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:37:25.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:37:25.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:37:25.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-28T15:37:25.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:37:25.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-28T15:37:25.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:37:25.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:37:25.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:37: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-28T15:37:27.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-28T15:37:27.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:37:27.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:37:27.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:37:27.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:37:27.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:37:27.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:37:27.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:37:27.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:37:27.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:37:27.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:37:27.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:37:27.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:37:27.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:37:27.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:37:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:37:27.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:37:27.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:37:27.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:37:28.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 672 rows from lcogt
2026-05-28T15:37:28.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:37:28.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:37:28.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:37:28.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:37:28.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:37:02
2026-05-28T15:37:28.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69357, datetime.datetime(2026, 5, 28, 15, 37, 2), datetime.datetime(2026, 5, 28, 15, 37, 2), 'salt', 15.21, 29.55, None, 5.15, 281.13, 17.66, 829.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:37:28.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:37:28.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:37:28.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:37:02, diff=26.107255s, valid=True
2026-05-28T15:37:28.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:37:28.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:37:28.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=76.110273s, valid=True
2026-05-28T15:37:28.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:37:28.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:54, diff=34.117159s, valid=True
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:37:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 672 rows. Structure expected: 10 fields
2026-05-28T15:37:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=76.120289s, valid=True
2026-05-28T15:37:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:37:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:37:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:37:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908090.12098s, valid=True
2026-05-28T15:37:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:37:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:37:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:37:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:37:28.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:37:28.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:37:28.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:37:28.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:37:28.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:37:28.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:37:28.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:37:28.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:37:28.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:37:28.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:37:28.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:37:29.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:37:29.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:37:29.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:37:29.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-28T15:37:29.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-28T15:37:29.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:37:29.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:37:59.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:37:59.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:37:59.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:37:59.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:37:59.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:37:59.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:37:59.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-28T15:37:59.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:37:59.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:37:59.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:37:59.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:37:59.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:37:59.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-28T15:38:02.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-28T15:38:02.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:38:02.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:38:02.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:38:02.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:38:02.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:38:02.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:38:02.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:38:02.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:38:02.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:38:02.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:38:02.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:38:02.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:38:02.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:38:02.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:38:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:38:02.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:38:02.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:38:02.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:38:02.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:38:02.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:38:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:38:02.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:38:02.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:38:02.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:37:32
2026-05-28T15:38:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69358, datetime.datetime(2026, 5, 28, 15, 37, 32), datetime.datetime(2026, 5, 28, 15, 37, 32), 'salt', 15.4, 30.35, None, 3.95, 345.52, 17.32, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:38:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:38:02.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:38:02.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:37:32, diff=30.726801s, valid=True
2026-05-28T15:38:02.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:38:02.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:38:02.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=110.729738s, valid=True
2026-05-28T15:38:02.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:38:02.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:38:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:37:26, diff=36.736672s, valid=True
2026-05-28T15:38:02.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:38:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:38:02.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:38:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:38:02.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:38:02.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:38:02.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=110.739863s, valid=True
2026-05-28T15:38:02.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:38:02.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:38:02.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:38:02.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908124.740534s, valid=True
2026-05-28T15:38:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:38:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:38:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:38:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:38:02.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:38:02.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:38:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:38:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:38:02.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:38:02.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:38:02.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:38:02.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:38:03.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:38:03.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:38:03.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:38:03.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:38:03.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:38:03.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:38:03.709 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:38:03.709 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:38:03.918 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:38:03.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:38:33.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:38:33.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:38:33.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:38:34.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:38:34.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:38:34.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:38:34.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-28T15:38:34.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:38:34.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:38:34.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:38:34.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:38:34.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:38:34.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-28T15:38:37.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-28T15:38:37.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:38:37.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:38:37.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:38:37.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:38:37.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:38:37.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:38:37.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:38:37.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:38:37.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:38:37.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:38:37.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:38:37.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:38:37.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:38:37.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:38:37.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:38:37.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:38:37.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:38:37.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:38:37.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T15:38:37.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:38:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:38:37.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:38:37.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:38:37.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:38:33
2026-05-28T15:38:37.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69360, datetime.datetime(2026, 5, 28, 15, 38, 33), datetime.datetime(2026, 5, 28, 15, 38, 32), 'salt', 15.5, 28.89, None, 4.41, 252.3, 18.0, 829.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:38:37.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:38:37.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:38:37.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:38:32, diff=5.40787s, valid=True
2026-05-28T15:38:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:38:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:38:37.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=145.410719s, valid=True
2026-05-28T15:38:37.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:38:37.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:38:29, diff=8.417371s, valid=True
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:38:37.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T15:38:37.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=145.420347s, valid=True
2026-05-28T15:38:37.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:38:37.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:38:37.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:38:37.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908159.420991s, valid=True
2026-05-28T15:38:37.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:38:37.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:38:37.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:38:37.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:38:37.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:38:37.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:38:37.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:38:37.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:38:37.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:38:37.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:38:37.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:38:37.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:38:37.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:38:37.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:38:37.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:38:38.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:38:38.392 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:38:38.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:38:38.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-28T15:38:38.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-28T15:38:38.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:38:38.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:39:08.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:39:08.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:39:08.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:39:09.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:39:09.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:39:09.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:39:09.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:39:09.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:39:09.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-28T15:39:09.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:39:09.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:39:09.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:39:09.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-28T15:39:11.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-28T15:39:11.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:39:11.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:39:11.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:39:11.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:39:11.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:39:11.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:39:11.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:39:11.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:39:11.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:39:11.789 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:39:11.789 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:39:11.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:39:11.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:39:11.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:39:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:39:11.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:39:12.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:39:12.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:39:12.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:39:12.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:39:12.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:39:12.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:39:12.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:39:12.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:39:03
2026-05-28T15:39:12.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69361, datetime.datetime(2026, 5, 28, 15, 39, 3), datetime.datetime(2026, 5, 28, 15, 39, 3), 'salt', 15.47, 29.19, None, 10.23, 264.79, 17.86, 829.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:39:12.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:39:12.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:39:12.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:39:03, diff=9.105227s, valid=True
2026-05-28T15:39:12.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:39:12.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:39:12.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=180.10814s, valid=True
2026-05-28T15:39:12.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:39:12.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:39:12.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:39:00, diff=12.114777s, valid=True
2026-05-28T15:39:12.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:39:12.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:39:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:39:12.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:39:12.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:39:12.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:39:12.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=180.117839s, valid=True
2026-05-28T15:39:12.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:39:12.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:39:12.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:39:12.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908194.11849s, valid=True
2026-05-28T15:39:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:39:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:39:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:39:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:39:12.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:39:12.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:39:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:39:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:39:12.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:39:12.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:39:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:39:12.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:39:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:39:12.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:39:12.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:39:13.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:39:13.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:39:13.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:39:13.142 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:39:13.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-28T15:39:13.395 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:39:13.395 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:39:43.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:39:43.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:39:43.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:39:43.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:39:43.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:39:44.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:39:44.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-28T15:39:44.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:39:44.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-28T15:39:44.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:39:44.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:39:44.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:39:44.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:39:46.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-28T15:39:46.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:39:46.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:39:46.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:39:46.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:39:46.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:39:46.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:39:46.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:39:46.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:39:46.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:39:46.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:39:46.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:39:46.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:39:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:39:46.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:39:46.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:39:46.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:39:46.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:39:46.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:39:46.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T15:39:46.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:39:46.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:39:46.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:39:46.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:39:46.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:39:33
2026-05-28T15:39:46.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69362, datetime.datetime(2026, 5, 28, 15, 39, 33), datetime.datetime(2026, 5, 28, 15, 39, 33), 'salt', 15.5, 30.48, None, 9.56, 242.83, 17.27, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:39:46.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:39:46.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:39:46.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:39:33, diff=13.86746s, valid=True
2026-05-28T15:39:46.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:39:46.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:39:46.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=214.870255s, valid=True
2026-05-28T15:39:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:39:46.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:39:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:39:32, diff=14.876833s, valid=True
2026-05-28T15:39:46.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:39:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:39:46.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:39:46.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:39:46.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:39:46.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T15:39:46.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=214.879791s, valid=True
2026-05-28T15:39:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:39:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:39:46.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:39:46.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908228.880433s, valid=True
2026-05-28T15:39:46.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:39:46.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:39:46.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:39:46.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:39:46.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:39:46.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:39:46.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:39:46.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:39:46.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:39:47.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:39:47.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:39:47.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:39:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:39:47.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:39:47.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:39:47.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:39:47.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:39:47.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:39:47.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-28T15:39:47.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-28T15:39:47.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:39:47.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:40:17.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:40:17.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:40:17.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:40:18.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:40:18.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:40:18.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:40:18.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-28T15:40:18.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:40:18.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:40:18.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:40:18.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:40:18.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:40:18.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:40:20.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-28T15:40:20.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:40:20.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:40:20.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:40:20.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:40:20.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:40:20.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:40:20.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:40:20.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:40:20.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:40:20.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:40:20.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:40:20.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:40:21.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:40:21.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:40:21.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:40:21.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:40:21.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:40:21.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:40:21.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:40:21.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:40:21.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:40:21.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:40:21.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:40:21.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:40:03
2026-05-28T15:40:21.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69363, datetime.datetime(2026, 5, 28, 15, 40, 3), datetime.datetime(2026, 5, 28, 15, 40, 3), 'salt', 15.4, 29.55, None, 9.78, 241.63, 17.68, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:40:21.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:40:21.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:40:21.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:40:03, diff=18.283274s, valid=True
2026-05-28T15:40:21.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:40:21.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:40:21.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=249.28613s, valid=True
2026-05-28T15:40:21.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:40:21.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:40:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:40:03, diff=18.292696s, valid=True
2026-05-28T15:40:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:40:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:40:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:40:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:40:21.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:40:21.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:40:21.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=249.295696s, valid=True
2026-05-28T15:40:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:40:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:40:21.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:40:21.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908263.296344s, valid=True
2026-05-28T15:40:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:40:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:40:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:40:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:40:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:40:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:40:21.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:40:21.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:40:21.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:40:21.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:40:21.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:40:21.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:40:21.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:40:21.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:40:21.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:40:22.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:40:22.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:40:22.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:40:22.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:40:22.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:40:22.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:40:22.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:40:52.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:40:52.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:40:52.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:40:53.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:40:53.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:40:53.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:40:53.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-28T15:40:53.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:40:53.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:40:53.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:40:53.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:40:53.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:40:53.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-28T15:40:56.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-28T15:40:56.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:40:56.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:40:56.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:40:56.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:40:56.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:40:56.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:40:56.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:40:56.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:40:56.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:40:56.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:40:56.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:40:56.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:40:56.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:40:56.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:40:56.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:40:56.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:40:56.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:40:56.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:40:56.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:40:56.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:40:56.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:40:56.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:40:56.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:40:56.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:40:34
2026-05-28T15:40:56.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69364, datetime.datetime(2026, 5, 28, 15, 40, 34), datetime.datetime(2026, 5, 28, 15, 40, 33), 'salt', 15.14, 30.38, None, 8.33, 284.72, 17.27, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:40:56.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:40:56.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:40:56.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:40:33, diff=23.457306s, valid=True
2026-05-28T15:40:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:40:56.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:40:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=284.460156s, valid=True
2026-05-28T15:40:56.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:40:56.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:40:56.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:40:25, diff=31.46673s, valid=True
2026-05-28T15:40:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:40:56.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:40:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:40:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:40:56.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:40:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:40:56.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=284.469705s, valid=True
2026-05-28T15:40:56.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:40:56.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:40:56.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:40:56.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908298.470349s, valid=True
2026-05-28T15:40:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:40:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:40:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:40:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:40:56.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:40:56.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:40:56.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:40:56.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:40:56.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:40:56.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:40:56.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:40:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:40:56.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:40:56.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:40:56.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:40:57.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:40:57.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:40:57.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:40: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-28T15:40: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-28T15:40:57.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:40:57.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:41:27.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:41:27.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:41:27.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:41:27.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:41:27.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:41:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:41:28.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-28T15:41:28.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:41:28.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-28T15:41:28.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:41:28.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:41:28.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:41:28.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-28T15:41:30.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-28T15:41:30.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:41:30.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:41:30.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:41:30.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:41:30.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:41:30.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:41:30.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:41:30.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:41:30.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:41:30.658 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:41:30.658 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:41:30.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:41:30.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:41:30.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:41:30.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:41:30.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:41:30.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:41:30.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:41:30.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:41:30.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:41:30.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:41:30.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:41:30.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:41:30.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:41:04
2026-05-28T15:41:30.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69365, datetime.datetime(2026, 5, 28, 15, 41, 4), datetime.datetime(2026, 5, 28, 15, 41, 3), 'salt', 15.11, 30.68, None, 5.65, 272.32, 17.14, 829.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:41:30.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:41:30.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:41:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:41:03, diff=27.986756s, valid=True
2026-05-28T15:41:30.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:41:30.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:41:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=318.989576s, valid=True
2026-05-28T15:41:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:41:30.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:40:55, diff=35.996148s, valid=True
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:41:30.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:41:30.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:36:12, diff=318.999168s, valid=True
2026-05-28T15:41:30.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:41:30.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:41:30.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:41:30.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908332.999828s, valid=True
2026-05-28T15:41:31.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:41:31.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:41:31.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:41:31.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:41:31.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:41:31.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:41:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:41:31.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:41:31.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:41:31.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:41:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:41:31.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:41:31.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:41:31.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:41:31.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:41:31.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:41:32.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:41:32.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:41:32.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-28T15:41:32.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-28T15:41:32.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:41:32.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:42:02.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:42:02.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:42:02.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:42:02.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:42:02.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:42:03.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:42:03.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-28T15:42:03.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:42:03.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-28T15:42:03.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:42:03.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:42:03.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:42:03.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-28T15:42:05.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-28T15:42:05.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:42:05.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:42:05.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:42:05.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:42:05.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:42:05.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:42:05.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:42:05.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:42:05.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:42:05.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:42:05.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:42:05.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:42:05.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:42:05.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:42:05.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:42:05.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:42:05.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:42:05.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:42:05.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:42:05.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:42:05.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:42:05.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:42:05.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:42:05.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:42:04
2026-05-28T15:42:05.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69367, datetime.datetime(2026, 5, 28, 15, 42, 4), datetime.datetime(2026, 5, 28, 15, 42, 4), 'salt', 15.21, 32.04, None, 8.29, 281.53, 16.56, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:42:05.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:42:05.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:42:05.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:42:04, diff=1.898928s, valid=True
2026-05-28T15:42:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:42:05.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:42:05.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:42:12, diff=-6.09823s, valid=True
2026-05-28T15:42:05.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:42:05.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:41:58, diff=7.908476s, valid=True
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:42:05.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:42:05.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:42:12, diff=-6.088489s, valid=True
2026-05-28T15:42:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:42:05.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:42:05.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:42:05.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908367.912178s, valid=True
2026-05-28T15:42:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:42:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:42:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:42:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:42:05.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:42:05.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:42:05.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:42:05.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:42:05.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:42:06.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:42:06.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:42:06.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:42:06.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:42:06.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:42:06.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:42:06.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:42:06.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:42:06.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:42:06.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-28T15:42:06.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-28T15:42:07.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:42:07.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:42:37.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:42:37.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:42:37.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:42:37.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:42:37.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:42:37.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:42:37.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-28T15:42:37.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:42:37.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-28T15:42:37.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:42:37.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:42:37.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:42:37.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-28T15:42:40.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-28T15:42:40.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:42:40.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:42:40.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:42:40.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:42:40.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:42:40.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:42:40.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:42:40.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:42:40.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:42:40.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:42:40.326 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:42:40.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:42:40.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:42:40.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:42:40.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:42:40.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:42:40.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:42:40.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:42:40.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:42:40.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:42:40.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:42:40.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:42:40.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:42:40.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:42:34
2026-05-28T15:42:40.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69368, datetime.datetime(2026, 5, 28, 15, 42, 34), datetime.datetime(2026, 5, 28, 15, 42, 34), 'salt', 15.07, 30.25, None, 6.14, 228.18, 17.32, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:42:40.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:42:40.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:42:40.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:42:34, diff=6.730739s, valid=True
2026-05-28T15:42:40.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:42:40.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:42:40.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:12, diff=-31.266352s, valid=True
2026-05-28T15:42:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:42:40.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:42:30, diff=10.740376s, valid=True
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:42:40.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:42:40.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:12, diff=-31.256508s, valid=True
2026-05-28T15:42:40.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:42:40.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:42:40.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:42:40.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908402.744189s, valid=True
2026-05-28T15:42:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:42:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:42:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:42:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:42:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:42:40.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:42:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:42:40.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:42:40.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:42:40.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:42:40.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:42:41.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:42:41.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:42:41.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:42:41.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:42:41.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:42:41.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:42:41.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:42:41.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-28T15:42:41.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-28T15:42:42.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:42:42.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:43:12.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:43:12.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:43:12.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:43:12.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:43:12.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:43:12.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:43:12.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-28T15:43:12.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:43:12.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-28T15:43:12.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:43:12.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:43:12.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:43:12.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-28T15:43:15.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-28T15:43:15.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:43:15.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:43:15.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:43:15.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:43:15.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:43:15.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:43:15.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:43:15.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:43:15.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:43:15.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:43:15.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:43:15.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:43:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:43:15.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:43:15.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:43:15.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:43:15.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:43:15.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:43:15.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:43:15.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:43:15.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:43:15.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:43:15.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:43:15.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:43:05
2026-05-28T15:43:15.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69369, datetime.datetime(2026, 5, 28, 15, 43, 5), datetime.datetime(2026, 5, 28, 15, 43, 4), 'salt', 15.11, 31.74, None, 4.66, 252.25, 16.68, 829.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:43:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:43:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:43:15.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:04, diff=11.677962s, valid=True
2026-05-28T15:43:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:43:15.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:43:15.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:12, diff=3.680818s, valid=True
2026-05-28T15:43:15.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:43:15.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:01, diff=14.687425s, valid=True
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:43:15.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:43:15.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:12, diff=3.69042s, valid=True
2026-05-28T15:43:15.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:43:15.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:43:15.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:43:15.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908437.69108s, valid=True
2026-05-28T15:43:15.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:43:15.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:43:15.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:43:15.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:43:15.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:43:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:43:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:43:15.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:43:15.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:43:15.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:43:15.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:43:15.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:43:15.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:43:16.027 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:43:16.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:43:16.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:43:16.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:43:16.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:43:16.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-28T15:43:16.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-28T15:43:16.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:43:16.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:43:46.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:43:46.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:43:46.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:43:47.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:43:47.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:43:47.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:43:47.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-28T15:43:47.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:43:47.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-28T15:43:47.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:43:47.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:43:47.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:43:47.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-28T15:43:49.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-28T15:43:49.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:43:49.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:43:49.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:43:49.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:43:49.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:43:49.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:43:49.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:43:49.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:43:49.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:43:49.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:43:49.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:43:49.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:43:49.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:43:49.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:43:50.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:43:50.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:43:50.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:43:50.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:43:50.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:43:50.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:43:50.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:43:50.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:43:50.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:43:50.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:43:35
2026-05-28T15:43:50.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69370, datetime.datetime(2026, 5, 28, 15, 43, 35), datetime.datetime(2026, 5, 28, 15, 43, 35), 'salt', 15.27, 33.13, None, 8.75, 233.54, 16.11, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:43:50.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:43:50.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:43:50.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:35, diff=15.237058s, valid=True
2026-05-28T15:43:50.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:43:50.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:43:50.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:12, diff=-21.760072s, valid=True
2026-05-28T15:43:50.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:43:50.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:43:50.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:43:33, diff=17.246669s, valid=True
2026-05-28T15:43:50.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:43:50.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:43:50.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:43:50.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:43:50.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:43:50.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:43:50.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:12, diff=-21.750308s, valid=True
2026-05-28T15:43:50.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:43:50.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:43:50.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:43:50.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908472.250339s, valid=True
2026-05-28T15:43:50.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:43:50.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:43:50.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:43:50.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:43:50.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:43:50.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:43:50.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:43:50.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:43:50.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:43:50.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:43:50.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:43:50.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:43:50.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:43:50.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:43:50.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:43:51.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:43:51.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:43:51.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:43:51.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-28T15:43:51.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:43:51.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:43:51.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:44:21.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:44:21.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:44:21.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:44:21.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:44:21.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:44:21.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:44:21.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-28T15:44:21.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:44:21.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-28T15:44:21.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:44:21.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:44:21.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:44:21.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-28T15:44:24.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-28T15:44:24.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:44:24.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:44:24.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:44:24.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:44:24.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:44:24.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:44:24.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:44:24.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:44:24.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:44:24.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:44:24.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:44:24.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:44:24.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:44:24.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:44:24.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:44:24.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:44:24.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:44:24.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:44:24.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:44:24.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:44:24.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:44:24.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:44:24.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:44:24.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:44:05
2026-05-28T15:44:24.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69371, datetime.datetime(2026, 5, 28, 15, 44, 5), datetime.datetime(2026, 5, 28, 15, 44, 5), 'salt', 15.3, 29.99, None, 6.71, 227.52, 17.47, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:44:24.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:44:24.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:44:24.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:05, diff=19.957164s, valid=True
2026-05-28T15:44:24.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:44:24.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:44:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:12, diff=12.960022s, valid=True
2026-05-28T15:44:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:44:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:44:24.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:04, diff=20.966714s, valid=True
2026-05-28T15:44:24.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:44:24.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:44:24.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:44:24.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:44:24.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:44:24.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:44:24.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:12, diff=12.969757s, valid=True
2026-05-28T15:44:24.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:44:24.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:44:24.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:44:24.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908506.970421s, valid=True
2026-05-28T15:44:24.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:44:25.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:44:25.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:44:25.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:44:25.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:44:25.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:44:25.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:44:25.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:44:25.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:44:25.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:44:25.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:44:25.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:44:25.960 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:44:25.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:44:25.960 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:44:25.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-28T15:44:26.114 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:44:26.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:44:56.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:44:56.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:44:56.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:44:56.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:44:56.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:44:56.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:44:56.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-28T15:44:56.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:44:56.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-28T15:44:56.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:44:56.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:44:56.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:44:56.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-28T15:44:59.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-28T15:44:59.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:44:59.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:44:59.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:44:59.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:44:59.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:44:59.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:44:59.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:44:59.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:44:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:44:59.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:44:59.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:44:59.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:45:00.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:45:00.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:45:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:45:00.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:45:00.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:45:00.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:45:00.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:45:00.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:45:00.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:45:00.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:45:00.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:45:00.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:44:35
2026-05-28T15:45:00.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69372, datetime.datetime(2026, 5, 28, 15, 44, 35), datetime.datetime(2026, 5, 28, 15, 44, 35), 'salt', 15.17, 31.08, None, 9.81, 226.79, 16.97, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:45:00.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:45:00.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:45:00.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:35, diff=25.281443s, valid=True
2026-05-28T15:45:00.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:45:00.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:45:00.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:12, diff=-11.71568s, valid=True
2026-05-28T15:45:00.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:45:00.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:45:00.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:27, diff=33.290958s, valid=True
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:45:00.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:45:00.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:12, diff=-11.706024s, valid=True
2026-05-28T15:45:00.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:45:00.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:45:00.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:45:00.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908542.294639s, valid=True
2026-05-28T15:45:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:45:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:45:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:45:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:45:00.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:45:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:45:00.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:45:00.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:45:00.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:45:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:45:00.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:45:00.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:45:00.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:45:00.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:45:00.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:45:01.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:45:01.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:45:01.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:45:01.263 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:45:01.263 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:45:01.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:45:01.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:45:31.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:45:31.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:45:31.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:45:31.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:45:32.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:45:32.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:45:32.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-28T15:45:32.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:45:32.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-28T15:45:32.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:45:32.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:45:32.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:45:32.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-28T15:45:34.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-28T15:45:34.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:45:34.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:45:34.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:45:34.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:45:34.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:45:34.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:45:34.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:45:34.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:45:34.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:45:34.720 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:45:34.720 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:45:34.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:45:34.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:45:34.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:45:34.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:45:34.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:45:34.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:45:34.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:45:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:45:34.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:45:34.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:45:34.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:45:34.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:45:35.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:45:06
2026-05-28T15:45:35.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69373, datetime.datetime(2026, 5, 28, 15, 45, 6), datetime.datetime(2026, 5, 28, 15, 45, 5), 'salt', 15.17, 31.64, None, 7.06, 196.6, 16.72, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:45:35.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:45:35.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:45:35.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:05, diff=30.03801s, valid=True
2026-05-28T15:45:35.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:45:35.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:45:35.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:12, diff=23.040852s, valid=True
2026-05-28T15:45:35.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:45:35.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:44:57, diff=38.047519s, valid=True
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:45:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:45:35.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:12, diff=23.050526s, valid=True
2026-05-28T15:45:35.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:45:35.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:45:35.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:45:35.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908577.051184s, valid=True
2026-05-28T15:45:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:45:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:45:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:45:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:45:35.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:45:35.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:45:35.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:45:35.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:45:35.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:45:35.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:45:35.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:45:35.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:45:35.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:45:35.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:45:35.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:45:35.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:45:36.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:45:36.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:45:36.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-28T15:45:36.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-28T15:45:36.236 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:45:36.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:46:06.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:46:06.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:46:06.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:46:06.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:46:06.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:46:06.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:46:06.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-28T15:46:06.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:46:06.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-28T15:46:06.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:46:06.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:46:06.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:46:06.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-28T15:46:09.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-28T15:46:09.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:46:09.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:46:09.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:46:09.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:46:09.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:46:09.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:46:09.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:46:09.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:46:09.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:46:09.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:46:09.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:46:09.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:46:09.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:46:09.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:46:09.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:46:09.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:46:09.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:46:09.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:46:09.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:46:09.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:46:09.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:46:09.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:46:09.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:46:09.864 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:46:06
2026-05-28T15:46:09.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69375, datetime.datetime(2026, 5, 28, 15, 46, 6), datetime.datetime(2026, 5, 28, 15, 46, 6), 'salt', 15.07, 30.08, None, 8.26, 213.03, 17.39, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:46:09.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:46:09.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:46:09.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:46:06, diff=3.87051s, valid=True
2026-05-28T15:46:09.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:46:09.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:46:09.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:46:12, diff=-2.125852s, valid=True
2026-05-28T15:46:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:46:09.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:45:59, diff=10.8813s, valid=True
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:46:09.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:46:09.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:46:12, diff=-2.115489s, valid=True
2026-05-28T15:46:09.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:46:09.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:46:09.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:46:09.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908611.885181s, valid=True
2026-05-28T15:46:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:46:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:46:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:46:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:46:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:46:09.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:46:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:46:09.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:46:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:46:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:46:10.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:46:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:46:10.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:46:10.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:46:10.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:46:11.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:46:11.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:46:11.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:46:11.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-28T15:46:11.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-28T15:46:13.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:46:13.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:46:43.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:46:43.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:46:43.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:46:43.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:46:43.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:46:43.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:46: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-28T15:46:43.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:46:43.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-28T15:46:43.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:46:43.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:46:43.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:46:43.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-28T15:46:46.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-28T15:46:46.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:46:46.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:46:46.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:46:46.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:46:46.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:46:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:46:46.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:46:46.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:46:46.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:46:46.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:46:46.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:46:46.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:46:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:46:46.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:46:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:46:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:46:46.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:46:46.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:46:46.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:46:46.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:46:46.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:46:46.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:46:36
2026-05-28T15:46:46.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69376, datetime.datetime(2026, 5, 28, 15, 46, 36), datetime.datetime(2026, 5, 28, 15, 46, 36), 'salt', 15.04, 29.72, None, 6.71, 197.56, 17.56, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:46:46.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:46:46.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:46:46.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:46:36, diff=10.814828s, valid=True
2026-05-28T15:46:46.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:46:46.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:46:46.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:12, diff=-25.180842s, valid=True
2026-05-28T15:46:46.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:46:46.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:46:31, diff=15.828517s, valid=True
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:46:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:46:46.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:12, diff=-25.168387s, valid=True
2026-05-28T15:46:46.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:46:46.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:46:46.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:46:46.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908648.83228s, valid=True
2026-05-28T15:46:46.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:46:46.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:46:46.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:46:46.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:46:46.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:46:46.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:46:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:46:46.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:46:46.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:46:46.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:46:47.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:46:47.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:46:47.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:46:47.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:46:47.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:46:47.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:46:47.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:46:47.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:46:47.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-28T15:46:47.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-28T15:46:48.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:46:48.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:47:18.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:47:18.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:47:18.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:47:18.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:47:18.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:47:18.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:47:18.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-28T15:47:18.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:47:18.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-28T15:47:18.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:47:18.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:47:18.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:47:18.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-28T15:47:21.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-28T15:47:21.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:47:21.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:47:21.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:47:21.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:47:21.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:47:21.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:47:21.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:47:21.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:47:21.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:47:21.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:47:21.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:47:21.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:47:21.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:47:21.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:47:21.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:47:21.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:47:21.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:47:21.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:47:21.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:47:21.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:47:21.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:47:21.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:47:21.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:47:21.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:47:07
2026-05-28T15:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69377, datetime.datetime(2026, 5, 28, 15, 47, 7), datetime.datetime(2026, 5, 28, 15, 47, 6), 'salt', 15.04, 30.32, None, 5.12, 170.7, 17.29, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:47:21.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:47:21.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:47:21.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:06, diff=15.731269s, valid=True
2026-05-28T15:47:21.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:47:21.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:47:21.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:12, diff=9.734187s, valid=True
2026-05-28T15:47:21.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:47:21.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:02, diff=19.743016s, valid=True
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:47:21.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:47:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:12, diff=9.747755s, valid=True
2026-05-28T15:47:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:47:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:47:21.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:47:21.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908683.748455s, valid=True
2026-05-28T15:47:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:47:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:47:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:47:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:47:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:47:21.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:47:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:47:21.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:47:21.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:47:21.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:47:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:47:21.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:47:22.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:47:22.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:47:22.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:47:22.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:47:22.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:47:22.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:47:22.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-28T15:47:22.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-28T15:47:22.924 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:47:22.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:47:52.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:47:52.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:47:52.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:47:53.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:47:53.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:47:53.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:47:53.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-28T15:47:53.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:47:53.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-28T15:47:53.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:47:53.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:47:53.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:47:53.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-28T15:47:55.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-28T15:47:55.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:47:55.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:47:55.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:47:55.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:47:55.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:47:55.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:47:55.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:47:55.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:47:55.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:47:55.909 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:47:55.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:47:55.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:47:55.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:47:55.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:47:56.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:47:56.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:47:56.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:47:56.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:47:56.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:47:56.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:47:56.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:47:56.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:47:56.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:47:56.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:47:37
2026-05-28T15:47:56.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69378, datetime.datetime(2026, 5, 28, 15, 47, 37), datetime.datetime(2026, 5, 28, 15, 47, 37), 'salt', 15.07, 29.69, None, 7.52, 174.85, 17.57, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:47:56.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:47:56.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:47:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:37, diff=19.226166s, valid=True
2026-05-28T15:47:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:47:56.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:47:56.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:12, diff=-15.770949s, valid=True
2026-05-28T15:47:56.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:47:56.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:47:56.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:47:34, diff=22.235756s, valid=True
2026-05-28T15:47:56.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:47:56.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:47:56.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:47:56.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:47:56.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:47:56.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:47:56.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:12, diff=-15.761222s, valid=True
2026-05-28T15:47:56.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:47:56.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:47:56.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:47:56.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908718.239429s, valid=True
2026-05-28T15:47:56.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:47:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:47:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:47:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:47:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:47:56.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:47:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:47:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:47:56.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:47:56.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:47:56.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:47:56.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:47:56.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:47:56.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:47:56.834 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:47:57.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:47:57.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:47:57.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:47:57.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-28T15:47:57.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-28T15:47:57.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:47:57.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:48:27.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:48:27.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:48:27.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:48:27.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:48:27.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:48:27.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:48:27.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-28T15:48:27.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:48:27.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:48:27.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:48:27.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:48:27.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:48:27.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-28T15:48:30.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-28T15:48:30.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:48:30.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:48:30.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:48:30.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:48:30.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:48:30.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:48:30.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:48:30.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:48:30.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:48:30.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:48:30.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:48:30.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:48:30.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:48:30.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:48:30.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:48:30.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:48:30.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:48:30.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:48:30.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:48:30.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:48:30.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:48:30.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:48:30.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:48:30.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:48:07
2026-05-28T15:48:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69379, datetime.datetime(2026, 5, 28, 15, 48, 7), datetime.datetime(2026, 5, 28, 15, 48, 6), 'salt', 14.87, 30.58, None, 7.31, 180.66, 17.15, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:48:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:48:30.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:48:30.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:06, diff=24.568685s, valid=True
2026-05-28T15:48:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:48:30.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:48:30.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:12, diff=18.57155s, valid=True
2026-05-28T15:48:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:48:30.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:05, diff=25.57818s, valid=True
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:48:30.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:48:30.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:12, diff=18.581233s, valid=True
2026-05-28T15:48:30.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:48:30.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:48:30.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:48:30.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908752.581899s, valid=True
2026-05-28T15:48:30.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:48:30.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:48:30.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:48:30.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:48:30.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:48:30.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:48:30.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:48:30.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:48:30.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:48:30.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:48:30.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:48:30.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:48:30.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:48:30.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:48:31.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:48:31.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:48:31.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:48:31.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:48:31.543 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:48:31.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-28T15:48:31.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:48:31.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:49:01.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:49:01.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:49:01.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:49:01.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:49:01.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:49:02.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:49:02.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-28T15:49:02.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:49:02.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-28T15:49:02.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:49:02.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:49:02.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:49:02.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-28T15:49:04.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-28T15:49:04.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:49:04.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:49:04.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:49:04.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:49:04.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:49:04.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:49:04.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:49:04.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:49:04.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:49:04.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:49:04.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:49:04.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:49:04.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:49:04.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:49:04.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:49:04.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:49:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:49:04.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:49:04.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:49:04.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:49:04.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:49:04.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:49:04.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:49:04.872 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:48:37
2026-05-28T15:49:04.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69380, datetime.datetime(2026, 5, 28, 15, 48, 37), datetime.datetime(2026, 5, 28, 15, 48, 37), 'salt', 14.94, 31.14, None, 5.65, 174.19, 16.91, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:49:04.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:49:04.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:49:04.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:37, diff=27.878289s, valid=True
2026-05-28T15:49:04.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:49:04.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:49:04.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:49:12, diff=-7.118845s, valid=True
2026-05-28T15:49:04.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:49:04.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:49:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:48:37, diff=27.887788s, valid=True
2026-05-28T15:49:04.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:49:04.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:49:04.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:49:04.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:49:04.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:49:04.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:49:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:49:12, diff=-7.109144s, valid=True
2026-05-28T15:49:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:49:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:49:04.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:49:04.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908786.891516s, valid=True
2026-05-28T15:49:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:49:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:49:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:49:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:49:04.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:49:04.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:49:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:49:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:49:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:49:05.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:49:05.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:49:05.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:49:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:49:05.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:49:05.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:49:05.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:49:05.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:49:05.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:49:05.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:49:05.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:49:06.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:49:06.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:49:36.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:49:36.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:49:36.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:49:36.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:49:36.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:49:36.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:49:36.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-28T15:49:36.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:49:36.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-28T15:49:36.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:49:36.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:49:36.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:49:36.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-28T15:49:39.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-28T15:49:39.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:49:39.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:49:39.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:49:39.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:49:39.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:49:39.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:49:39.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:49:39.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:49:39.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:49:39.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:49:39.184 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:49:39.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:49:39.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:49:39.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:49:39.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:49:39.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:49:39.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:49:39.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:49:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:49:39.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:49:39.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:49:39.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:49:39.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:49:39.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:49:38
2026-05-28T15:49:39.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69382, datetime.datetime(2026, 5, 28, 15, 49, 38), datetime.datetime(2026, 5, 28, 15, 49, 37), 'salt', 15.01, 31.51, None, 9.64, 216.27, 16.77, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:49:39.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:49:39.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:49:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:49:37, diff=2.50573s, valid=True
2026-05-28T15:49:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:49:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:49:39.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:12, diff=-32.491403s, valid=True
2026-05-28T15:49:39.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:49:39.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:49:29, diff=10.515351s, valid=True
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:49:39.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:49:39.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:12, diff=-32.481653s, valid=True
2026-05-28T15:49:39.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:49:39.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:49:39.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:49:39.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908821.519031s, valid=True
2026-05-28T15:49:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:49:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:49:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:49:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:49:39.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:49:39.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:49:39.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:49:39.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:49:39.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:49:39.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:49:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:49:39.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:49:39.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:49:39.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:49:40.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:49:40.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:49:40.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:49:40.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:49:40.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:49:40.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-28T15:49:40.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:49:40.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:50:10.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:50:10.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:50:10.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:50:11.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:50:11.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:50:11.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:50:11.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-28T15:50:11.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:50:11.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-28T15:50:11.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:50:11.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:50:11.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:50:11.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-28T15:50:13.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-28T15:50:13.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:50:13.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:50:13.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:50:13.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:50:13.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:50:13.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:50:13.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:50:13.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:50:13.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:50:13.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:50:13.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:50:13.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:50:13.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:50:13.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:50:13.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:50:13.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:50:13.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:50:13.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:50:14.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:50:14.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:50:14.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:50:14.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:50:14.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:50:14.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:50:08
2026-05-28T15:50:14.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69383, datetime.datetime(2026, 5, 28, 15, 50, 8), datetime.datetime(2026, 5, 28, 15, 50, 8), 'salt', 14.94, 30.05, None, 7.73, 223.65, 17.4, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:50:14.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:50:14.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:50:14.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:08, diff=6.16817s, valid=True
2026-05-28T15:50:14.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:50:14.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:50:14.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:12, diff=2.171058s, valid=True
2026-05-28T15:50:14.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:50:14.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:50:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:00, diff=14.17771s, valid=True
2026-05-28T15:50:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:50:14.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:50:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:50:14.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:50:14.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:50:14.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:50:14.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:12, diff=2.180707s, valid=True
2026-05-28T15:50:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:50:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:50:14.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:50:14.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908856.18135s, valid=True
2026-05-28T15:50:14.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:50:14.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:50:14.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:50:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:50:14.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:50:14.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:50:14.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:50:14.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:50:14.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:50:14.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:50:14.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:50:14.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:50:14.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:50:14.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:50:14.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:50:15.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:50:15.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:50:15.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:50:15.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-28T15:50:15.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-28T15:50:15.364 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:50:15.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:50:45.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:50:45.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:50:45.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:50:45.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:50:45.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:50:45.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:50:45.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-28T15:50:45.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:50:45.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-28T15:50:45.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:50:45.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:50:45.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:50:45.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:50:48.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-28T15:50:48.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:50:48.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:50:48.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:50:48.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:50:48.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:50:48.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:50:48.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:50:48.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:50:48.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:50:48.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:50:48.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:50:48.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:50:48.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:50:48.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:50:48.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:50:48.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:50:48.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:50:48.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:50:48.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:50:48.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:50:48.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:50:48.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:50:48.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:50:48.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:50:38
2026-05-28T15:50:48.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69384, datetime.datetime(2026, 5, 28, 15, 50, 38), datetime.datetime(2026, 5, 28, 15, 50, 38), 'salt', 14.84, 30.55, None, 8.19, 239.33, 17.16, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:50:48.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:50:48.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:50:48.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:38, diff=10.516667s, valid=True
2026-05-28T15:50:48.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:50:48.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:50:48.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:12, diff=-23.480387s, valid=True
2026-05-28T15:50:48.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:50:48.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:50:32, diff=16.526358s, valid=True
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:50:48.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:50:48.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:12, diff=-23.470641s, valid=True
2026-05-28T15:50:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:50:48.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:50:48.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:50:48.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908890.530075s, valid=True
2026-05-28T15:50:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:50:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:50:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:50:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:50:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:50:48.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:50:48.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:50:48.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:50:48.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:50:48.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:50:48.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:50:48.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:50:48.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:50:48.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:50:49.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:50:49.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:50:49.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:50:49.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:50:49.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T15:50:49.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T15:50:49.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:50:49.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:51:19.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:51:19.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:51:19.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:51:20.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:51:20.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:51:20.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:51:20.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-28T15:51:20.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:51:20.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-28T15:51:20.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:51:20.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:51:20.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:51:20.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-28T15:51:22.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-28T15:51:22.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:51:22.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:51:22.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:51:22.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:51:22.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:51:22.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:51:22.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:51:22.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:51:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:51:22.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:51:22.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:51:22.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:51:23.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:51:23.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:51:23.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:51:23.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:51:23.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:51:23.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:51:23.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:51:23.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:51:23.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:51:23.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:51:23.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:51:23.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:51:08
2026-05-28T15:51:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69385, datetime.datetime(2026, 5, 28, 15, 51, 8), datetime.datetime(2026, 5, 28, 15, 51, 8), 'salt', 14.77, 30.45, None, 5.23, 229.91, 17.19, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:51:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:51:23.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:51:23.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:08, diff=15.301731s, valid=True
2026-05-28T15:51:23.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:51:23.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:51:23.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:12, diff=11.30564s, valid=True
2026-05-28T15:51:23.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:51:23.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:51:23.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:03, diff=20.314885s, valid=True
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:51:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:51:23.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:12, diff=11.319167s, valid=True
2026-05-28T15:51:23.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:51:23.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:51:23.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:51:23.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908925.320169s, valid=True
2026-05-28T15:51:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:51:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:51:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:51:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:51:23.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:51:23.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:51:23.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:51:23.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:51:23.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:51:23.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:51:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:51:23.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:51:23.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:51:23.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:51:23.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:51:24.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:51:24.434 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:51:24.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:51:24.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-28T15:51:24.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-28T15:51:24.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:51:24.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:51:54.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:51:54.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:51:54.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:51:55.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:51:55.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:51:55.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:51:55.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:51:55.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:51:55.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:51:55.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:51:55.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:51:55.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:51:55.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-28T15:51:57.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-28T15:51:57.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:51:57.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:51:57.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:51:57.741 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:51:57.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:51:57.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:51:57.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:51:57.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:51:57.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:51:57.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:51:57.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:51:57.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:51:57.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:51:57.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:51:57.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:51:57.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:51:57.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:51:57.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:51:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:51:58.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:51:58.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:51:58.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:51:58.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:51:58.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:51:39
2026-05-28T15:51:58.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69386, datetime.datetime(2026, 5, 28, 15, 51, 39), datetime.datetime(2026, 5, 28, 15, 51, 38), 'salt', 14.81, 30.08, None, 4.7, 253.79, 17.37, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:51:58.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:51:58.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:51:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:38, diff=20.085533s, valid=True
2026-05-28T15:51:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:51:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:51:58.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:12, diff=-13.911557s, valid=True
2026-05-28T15:51:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:51:58.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:51:35, diff=23.095267s, valid=True
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:51:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:51:58.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:12, diff=-13.901507s, valid=True
2026-05-28T15:51:58.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:51:58.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:51:58.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:51:58.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908960.099222s, valid=True
2026-05-28T15:51:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:51:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:51:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:51:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:51:58.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:51:58.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:51:58.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:51:58.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:51:58.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:51:58.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:51:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:51:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:51:58.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:51:58.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:51:58.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:51:59.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:51:59.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:51:59.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:51:59.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-28T15:51:59.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-28T15:51:59.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:51:59.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:52:29.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:52:29.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:52:29.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:52:30.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:52:30.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:52:30.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:52:30.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-28T15:52:30.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:52:30.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-28T15:52:30.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:52:30.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:52:30.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:52:30.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-28T15:52:33.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-28T15:52:33.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:52:33.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:52:33.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:52:33.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:52:33.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:52:33.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:52:33.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:52:33.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:52:33.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:52:33.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:52:33.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:52:33.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:52:33.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:52:33.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:52:33.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:52:33.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:52:33.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:52:33.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:52:33.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:52:33.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:52:33.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:52:33.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:52:33.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:52:33.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:52:09
2026-05-28T15:52:33.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69387, datetime.datetime(2026, 5, 28, 15, 52, 9), datetime.datetime(2026, 5, 28, 15, 52, 8), 'salt', 14.77, 29.95, None, 4.34, 216.13, 17.41, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:52:33.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:52:33.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:52:33.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:08, diff=25.591988s, valid=True
2026-05-28T15:52:33.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:52:33.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:52:33.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:12, diff=21.59487s, valid=True
2026-05-28T15:52:33.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:52:33.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:06, diff=27.601538s, valid=True
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:52:33.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:52:33.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:52:33.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:12, diff=21.604592s, valid=True
2026-05-28T15:52:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:52:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:52:33.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:52:33.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=908995.605247s, valid=True
2026-05-28T15:52:33.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:52:33.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:52:33.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:52:33.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:52:33.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:52:33.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:52:33.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:52:33.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:52:33.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:52:33.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:52:33.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:52:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:52:33.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:52:33.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:52:34.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:52:34.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:52:34.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:52:34.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:52:34.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-28T15:52:34.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-28T15:52:34.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:52:34.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:53:04.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:53:04.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:53:04.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:53:05.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:53:05.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:53:05.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:53:05.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-28T15:53:05.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:53:05.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:53:05.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:53:05.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:53:05.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:53:05.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:53:08.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-28T15:53:08.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:53:08.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:53:08.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:53:08.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:53:08.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:53:08.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:53:08.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:53:08.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:53:08.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:53:08.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:53:08.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:53:08.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:53:08.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:53:08.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:53:08.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:53:08.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:53:08.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:53:08.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:53:08.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:53:08.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:53:08.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:53:08.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:53:08.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:53:08.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:52:39
2026-05-28T15:53:08.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69388, datetime.datetime(2026, 5, 28, 15, 52, 39), datetime.datetime(2026, 5, 28, 15, 52, 39), 'salt', 14.74, 30.18, None, 4.45, 175.6, 17.31, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:53:08.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:53:08.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:53:08.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:39, diff=29.404871s, valid=True
2026-05-28T15:53:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:53:08.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:53:08.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:53:12, diff=-3.592216s, valid=True
2026-05-28T15:53:08.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:53:08.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:52:38, diff=30.414569s, valid=True
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:53:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:53:08.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:53:08.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:53:12, diff=-3.582359s, valid=True
2026-05-28T15:53:08.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:53:08.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:53:08.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:53:08.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909030.418308s, valid=True
2026-05-28T15:53:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:53:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:53:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:53:08.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:53:08.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:53:08.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:53:08.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:53:08.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:53:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:53:08.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:53:08.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:53:08.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:53:08.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:53:08.807 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:53:09.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:53:09.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:53:09.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:53:09.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:53:09.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-28T15:53:09.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-28T15:53:10.721 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:53:10.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:53:40.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:53:40.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:53:40.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:53:41.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:53:41.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:53:41.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:53:41.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-28T15:53:41.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:53:41.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-28T15:53:41.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:53:41.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:53:41.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:53:41.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-28T15:53:44.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-28T15:53:44.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:53:44.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:53:44.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:53:44.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:53:44.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:53:44.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:53:44.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:53:44.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:53:44.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:53:44.524 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:53:44.524 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:53:44.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:53:44.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:53:44.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:53:44.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:53:44.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:53:44.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:53:44.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:53:44.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:53:44.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:53:44.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:53:44.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:53:44.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:53:44.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:53:39
2026-05-28T15:53:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69390, datetime.datetime(2026, 5, 28, 15, 53, 39), datetime.datetime(2026, 5, 28, 15, 53, 39), 'salt', 14.84, 31.08, None, 6.92, 185.72, 16.93, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:53:44.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:53:44.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:53:44.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:53:39, diff=5.86541s, valid=True
2026-05-28T15:53:44.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:53:44.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:53:44.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:12, diff=-27.131646s, valid=True
2026-05-28T15:53:44.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:53:44.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:53:31, diff=13.875039s, valid=True
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:53:44.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:53:44.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:12, diff=-27.121933s, valid=True
2026-05-28T15:53:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:53:44.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:53:44.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:53:44.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909066.878742s, valid=True
2026-05-28T15:53:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:53:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:53:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:53:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:53:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:53:44.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:53:44.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:53:44.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:53:44.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:53:45.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:53:45.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:53:45.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:53:45.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:53:45.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:53:45.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:53:45.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:53:45.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:53:45.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:53:45.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-28T15:53:45.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-28T15:53:46.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:53:46.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:54:16.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:54:16.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:54:16.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:54:16.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:54:16.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:54:16.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:54:16.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-28T15:54:16.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:54:16.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-28T15:54:16.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:54:16.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:54:16.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:54:16.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-28T15:54:19.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-28T15:54:19.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:54:19.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:54:19.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:54:19.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:54:19.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:54:19.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:54:19.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:54:19.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:54:19.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:54:19.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:54:19.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:54:19.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:54:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:54:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:54:19.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:54:19.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:54:19.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:54:19.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:54:19.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:54:19.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:54:19.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:54:19.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:54:19.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:54:19.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:54:10
2026-05-28T15:54:19.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69391, datetime.datetime(2026, 5, 28, 15, 54, 10), datetime.datetime(2026, 5, 28, 15, 54, 9), 'salt', 14.91, 30.75, None, 5.08, 199.93, 17.09, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:54:19.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:54:19.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:54:19.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:09, diff=10.632732s, valid=True
2026-05-28T15:54:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:54:19.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:54:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:12, diff=7.635579s, valid=True
2026-05-28T15:54:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:54:19.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:02, diff=17.642262s, valid=True
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:54:19.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:54:19.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:12, diff=7.645339s, valid=True
2026-05-28T15:54:19.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:54:19.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:54:19.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:54:19.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909101.646006s, valid=True
2026-05-28T15:54:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:54:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:54:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:54:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:54:19.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:54:19.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:54:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:54:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:54:19.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:54:19.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:54:19.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:54:19.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:54:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:54:20.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:54:20.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:54:20.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:54:20.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:54:20.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:54: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-28T15:54:20.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-28T15:54:20.983 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:54:20.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:54:51.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:54:51.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:54:51.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:54:51.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:54:51.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:54:51.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:54:51.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-28T15:54:51.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:54:51.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-28T15:54:51.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:54:51.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:54:51.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:54:51.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-28T15:54:54.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-28T15:54:54.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:54:54.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:54:54.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:54:54.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:54:54.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:54:54.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:54:54.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:54:54.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:54:54.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:54:54.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:54:54.342 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:54:54.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:54:54.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:54:54.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:54:54.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:54:54.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:54:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:54:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:54:54.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:54:54.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:54:54.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:54:54.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:54:54.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:54:54.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:54:40
2026-05-28T15:54:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69392, datetime.datetime(2026, 5, 28, 15, 54, 40), datetime.datetime(2026, 5, 28, 15, 54, 39), 'salt', 14.87, 30.15, None, 6.57, 201.24, 17.34, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:54:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:54:54.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:54:54.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:39, diff=15.679504s, valid=True
2026-05-28T15:54:54.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:54:54.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:54:54.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:12, diff=-17.317581s, valid=True
2026-05-28T15:54:54.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:54:54.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:54:54.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:54:33, diff=21.689923s, valid=True
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:54:54.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:54:54.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:12, diff=-17.306692s, valid=True
2026-05-28T15:54:54.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:54:54.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:54:54.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:54:54.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909136.694002s, valid=True
2026-05-28T15:54:54.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:54:54.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:54:54.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:54:54.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:54:54.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:54:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:54:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:54:54.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:54:54.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:54:54.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:54:54.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:54:54.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:54:54.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:54:55.017 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:54:55.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:54:55.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:54:55.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:54:55.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:54:55.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-28T15:54:55.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-28T15:54:55.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:54:55.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:55:25.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:55:25.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:55:25.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:55:26.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:55:26.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:55:26.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:55:26.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-28T15:55:26.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:55:26.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-28T15:55:26.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:55:26.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:55:26.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:55:26.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-28T15:55:29.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-28T15:55:29.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:55:29.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:55:29.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:55:29.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:55:29.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:55:29.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:55:29.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:55:29.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:55:29.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:55:29.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:55:29.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:55:29.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:55:29.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:55:29.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:55:29.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:55:29.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:55:29.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:55:29.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:55:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:55:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:55:29.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:55:29.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:55:29.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:55:29.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:55:10
2026-05-28T15:55:29.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69393, datetime.datetime(2026, 5, 28, 15, 55, 10), datetime.datetime(2026, 5, 28, 15, 55, 10), 'salt', 14.97, 31.51, None, 7.45, 175.41, 16.76, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:55:29.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:55:29.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:55:29.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:10, diff=19.536743s, valid=True
2026-05-28T15:55:29.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:55:29.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:55:29.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:12, diff=17.539635s, valid=True
2026-05-28T15:55:29.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:55:29.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:04, diff=25.546341s, valid=True
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:55:29.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:55:29.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:12, diff=17.54939s, valid=True
2026-05-28T15:55:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:55:29.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:55:29.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:55:29.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909171.550055s, valid=True
2026-05-28T15:55:29.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:55:29.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:55:29.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:55:29.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:55:29.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:55:29.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:55:29.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:55:29.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:55:29.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:55:29.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:55:29.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:55:29.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:55:29.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:55:29.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:55:30.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:55:30.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:55:30.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:55:30.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:55:30.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-28T15:55:30.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-28T15:55:30.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:55:30.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:56:00.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:56:00.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:56:00.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:56:00.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:56:00.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:56:01.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:56: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-28T15:56:01.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:56: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-28T15:56:01.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:56:01.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:56:01.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:56:01.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:56:03.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-28T15:56:03.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:56:03.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:56:03.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:56:03.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:56:03.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:56:03.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:56:03.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:56:03.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:56:03.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:56:03.639 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:56:03.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:56:03.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:56:03.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:56:03.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:56:03.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:56:03.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:56:03.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:56:03.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:56:03.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:56:03.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:56:03.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:56:03.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:56:03.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:56:03.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:55:40
2026-05-28T15:56:03.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69394, datetime.datetime(2026, 5, 28, 15, 55, 40), datetime.datetime(2026, 5, 28, 15, 55, 40), 'salt', 15.0, 30.68, None, 5.26, 172.34, 17.12, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:56:03.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:56:03.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:56:03.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:40, diff=23.964529s, valid=True
2026-05-28T15:56:03.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:56:03.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:56:03.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:12, diff=-8.032368s, valid=True
2026-05-28T15:56:03.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:56:03.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:55:36, diff=27.974315s, valid=True
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:56:03.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:56:03.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:12, diff=-8.022593s, valid=True
2026-05-28T15:56:03.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:56:03.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:56:03.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:56:03.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909205.978074s, valid=True
2026-05-28T15:56:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:56:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:56:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:56:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:56:03.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:56:04.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:56:04.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:56:04.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:56:04.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:56:04.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:56:04.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:56:04.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:56:04.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:56:04.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:56:04.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:56:04.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:56:05.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:56:05.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:56:05.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-28T15:56:05.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-28T15:56:05.210 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:56:05.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:56:35.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:56:35.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:56:35.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:56:35.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:56:35.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:56:35.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:56:35.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-28T15:56:35.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:56:35.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-28T15:56:35.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:56:35.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:56:35.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:56: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-28T15:56:38.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-28T15:56:38.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:56:38.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:56:38.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:56:38.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:56:38.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:56:38.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:56:38.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:56:38.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:56:38.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:56:38.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:56:38.457 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:56:38.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:56:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:56:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:56:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:56:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:56:38.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:56:38.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:56:38.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:56:38.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:56:38.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:56:38.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:56:38.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:56:38.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:56:10
2026-05-28T15:56:38.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69395, datetime.datetime(2026, 5, 28, 15, 56, 10), datetime.datetime(2026, 5, 28, 15, 56, 10), 'salt', 14.97, 30.02, None, 4.52, 183.47, 17.41, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:56:38.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:56:38.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:56:38.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:10, diff=28.780582s, valid=True
2026-05-28T15:56:38.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:56:38.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:56:38.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:12, diff=26.783458s, valid=True
2026-05-28T15:56:38.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:56:38.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:07, diff=31.79014s, valid=True
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:56:38.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:56:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:56:12, diff=26.79319s, valid=True
2026-05-28T15:56:38.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:56:38.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:56:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:56:38.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909240.793868s, valid=True
2026-05-28T15:56:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:56:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:56:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:56:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:56:38.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:56:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:56:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:56:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:56:38.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:56:38.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:56:38.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:56:39.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:56:39.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:56:39.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:56:39.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:56:39.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:56:39.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:56:39.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:56: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-28T15:56: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-28T15:56:39.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:56:39.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:57:09.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:57:09.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:57:09.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:57:10.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:57:10.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:57:10.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:57:10.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-28T15:57:10.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:57:10.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-28T15:57:10.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:57:10.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:57:10.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:57:10.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T15:57:13.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-28T15:57:13.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:57:13.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:57:13.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:57:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:57:13.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:57:13.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:57:13.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:57:13.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:57:13.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:57:13.138 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:57:13.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:57:13.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:57:13.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:57:13.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:57:13.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:57:13.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:57:13.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:57:13.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:57:13.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:57:13.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:57:13.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:57:13.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:57:13.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:57:13.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:57:11
2026-05-28T15:57:13.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69397, datetime.datetime(2026, 5, 28, 15, 57, 11), datetime.datetime(2026, 5, 28, 15, 57, 11), 'salt', 15.14, 31.61, None, 7.38, 244.86, 16.74, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:57:13.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:57:13.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:57:13.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:11, diff=2.469986s, valid=True
2026-05-28T15:57:13.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:57:13.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:57:13.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:12, diff=1.47286s, valid=True
2026-05-28T15:57:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:57:13.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:10, diff=3.479557s, valid=True
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:57:13.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:57:13.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:57:13.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:12, diff=1.482638s, valid=True
2026-05-28T15:57:13.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:57:13.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:57:13.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:57:13.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909275.483304s, valid=True
2026-05-28T15:57:13.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:57:13.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:57:13.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:57:13.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:57:13.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:57:13.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:57:13.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:57:13.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:57:13.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:57:13.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:57:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:57:13.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:57:13.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:57:13.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:57:14.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:57:14.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:57:14.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:57:14.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:57:14.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-28T15:57:14.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-28T15:57:14.780 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:57:14.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:57:44.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:57:44.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:57:44.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:57:45.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:57:45.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:57:45.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:57:45.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-28T15:57:45.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:57:45.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-28T15:57:45.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:57:45.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:57:45.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:57:45.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-28T15:57:48.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-28T15:57:48.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:57:48.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:57:48.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:57:48.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:57:48.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:57:48.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:57:48.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:57:48.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:57:48.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:57:48.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:57:48.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:57:48.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:57:48.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:57:48.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:57:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:57:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:57:49.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:57:49.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:57:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T15:57:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:57:49.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:57:49.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:57:49.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:57:49.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:57:41
2026-05-28T15:57:49.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69398, datetime.datetime(2026, 5, 28, 15, 57, 41), datetime.datetime(2026, 5, 28, 15, 57, 41), 'salt', 15.07, 31.48, None, 9.0, 221.42, 16.78, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:57:49.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:57:49.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:57:49.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:41, diff=8.107042s, valid=True
2026-05-28T15:57:49.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:57:49.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:57:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:12, diff=-22.89005s, valid=True
2026-05-28T15:57:49.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:57:49.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:57:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:57:34, diff=15.11663s, valid=True
2026-05-28T15:57:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:57:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:57:49.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:57:49.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:57:49.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:57:49.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T15:57:49.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:12, diff=-22.880296s, valid=True
2026-05-28T15:57:49.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:57:49.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:57:49.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:57:49.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909311.120366s, valid=True
2026-05-28T15:57:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:57:49.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:57:49.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:57:49.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:57:49.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:57:49.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:57:49.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:57:49.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:57:49.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:57:49.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:57:49.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:57:49.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:57:49.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:57:49.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:57:49.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:57:50.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:57:50.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:57:50.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:57:50.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-28T15:57:50.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-28T15:57:50.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:57:50.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:58:20.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:58:20.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:58:20.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:58:20.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:58:20.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:58:20.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:58:20.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:58:20.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:58:20.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-28T15:58:20.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:58:20.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:58:20.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:58:20.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-28T15:58: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-28T15:58:23.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:58:23.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:58:23.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:58:23.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:58:23.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:58:23.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:58:23.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:58:23.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:58:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:58:23.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:58:23.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:58:23.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:58:24.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T15:58:24.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:58:24.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T15:58:24.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:58:24.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:58:24.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:58:24.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:58:24.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:58:24.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:58:24.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:58:24.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:58:24.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:58:11
2026-05-28T15:58:24.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69399, datetime.datetime(2026, 5, 28, 15, 58, 11), datetime.datetime(2026, 5, 28, 15, 58, 11), 'salt', 15.27, 31.28, None, 7.59, 221.05, 16.9, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:58:24.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:58:24.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T15:58:24.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:11, diff=13.257934s, valid=True
2026-05-28T15:58:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:58:24.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:58:24.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:12, diff=12.260777s, valid=True
2026-05-28T15:58:24.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:58:24.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:04, diff=20.267498s, valid=True
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:58:24.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:58:24.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:12, diff=12.270598s, valid=True
2026-05-28T15:58:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:58:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:58:24.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:58:24.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909346.271274s, valid=True
2026-05-28T15:58:24.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:58:24.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:58:24.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:58:24.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:58:24.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:58:24.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:58:24.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:58:24.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:58:24.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:58:24.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:58:24.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:58:24.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:58:24.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:58:24.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:58:24.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:58:25.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:58:25.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:58:25.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:58:25.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-28T15:58:25.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-28T15:58:25.548 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:58:25.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:58:55.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:58:55.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:58:55.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:58:55.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:58:55.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:58:56.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:58:56.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T15:58:56.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:58:56.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-28T15:58:56.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:58:56.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:58:56.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:58:56.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-28T15:58:59.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-28T15:58:59.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:58:59.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:58:59.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:58:59.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:58:59.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:58:59.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:58:59.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:58:59.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:58:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:58:59.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:58:59.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:58:59.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:58:59.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:58:59.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:58:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:58:59.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:58:59.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:58:59.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:58:59.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:58:59.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:58:59.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:58:59.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:58:59.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:58:59.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:58:42
2026-05-28T15:58:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69400, datetime.datetime(2026, 5, 28, 15, 58, 42), datetime.datetime(2026, 5, 28, 15, 58, 41), 'salt', 15.27, 29.95, None, 7.77, 248.71, 17.48, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:58:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:58:59.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:58:59.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:41, diff=18.465016s, valid=True
2026-05-28T15:58:59.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:58:59.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:58:59.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:12, diff=-12.53212s, valid=True
2026-05-28T15:58:59.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:58:59.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:58:34, diff=25.474521s, valid=True
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:58:59.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:58:59.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:12, diff=-12.522402s, valid=True
2026-05-28T15:58:59.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:58:59.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:58:59.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:58:59.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909381.478264s, valid=True
2026-05-28T15:58:59.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:58:59.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:58:59.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:58:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:58:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:58:59.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:58:59.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:58:59.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:58:59.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:58:59.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:58:59.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:58:59.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:58:59.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:58:59.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:59:00.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:59:00.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:59:00.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:59:00.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:59:00.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-28T15:59:00.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-28T15:59:00.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:59:00.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T15:59:30.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T15:59:30.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T15:59:30.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T15:59:30.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T15:59:30.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T15:59:31.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T15:59:31.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-28T15:59:31.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T15:59:31.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T15:59:31.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T15:59:31.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T15:59:31.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T15:59:31.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-28T15:59:33.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-28T15:59:33.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T15:59:33.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T15:59:33.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T15:59:33.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T15:59:33.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T15:59:33.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T15:59:33.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T15:59:33.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T15:59:33.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T15:59:33.613 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T15:59:33.613 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T15:59:33.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T15:59:33.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T15:59:33.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T15:59:33.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T15:59:33.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:59:33.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:59:33.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T15:59:33.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T15:59:33.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T15:59:33.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T15:59:33.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T15:59:33.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T15:59:33.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:59:12
2026-05-28T15:59:33.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69401, datetime.datetime(2026, 5, 28, 15, 59, 12), datetime.datetime(2026, 5, 28, 15, 59, 11), 'salt', 15.14, 29.69, None, 5.75, 271.87, 17.59, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T15:59:33.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T15:59:33.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T15:59:33.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:11, diff=22.925739s, valid=True
2026-05-28T15:59:33.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T15:59:33.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:59:33.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:12, diff=21.928593s, valid=True
2026-05-28T15:59:33.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T15:59:33.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:06, diff=27.935287s, valid=True
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T15:59:33.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T15:59:33.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:12, diff=21.938295s, valid=True
2026-05-28T15:59:33.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T15:59:33.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T15:59:33.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T15:59:33.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909415.938957s, valid=True
2026-05-28T15:59:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T15:59:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T15:59:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T15:59:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T15:59:33.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T15:59:33.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T15:59:34.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T15:59:34.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T15:59:34.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T15:59:34.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T15:59:34.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T15:59:34.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T15:59:34.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T15:59:34.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T15:59:34.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:59:34.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T15:59:34.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T15:59:34.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T15:59:34.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-28T15:59:34.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-28T15:59:35.208 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T15:59:35.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:00:05.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:00:05.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:00:05.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:00:05.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:00:05.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:00:05.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:00:05.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:00:05.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:00:05.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-28T16:00:05.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:00:05.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:00:05.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:00:05.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-28T16:00:08.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-28T16:00:08.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:00:08.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:00:08.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:00:08.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:00:08.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:00:08.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:00:08.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:00:08.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:00:08.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:00:08.233 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:00:08.233 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:00:08.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:00:08.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:00:08.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:00:08.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:00:08.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:00:08.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:00:08.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:00:08.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:00:08.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:00:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:00:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:00:08.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:00:08.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 15:59:42
2026-05-28T16:00:08.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69402, datetime.datetime(2026, 5, 28, 15, 59, 42), datetime.datetime(2026, 5, 28, 15, 59, 42), 'salt', 15.04, 29.59, None, 4.7, 262.96, 17.62, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:00:08.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:00:08.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:00:08.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:42, diff=26.550299s, valid=True
2026-05-28T16:00:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:00:08.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:00:08.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:00:12, diff=-3.447012s, valid=True
2026-05-28T16:00:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:00:08.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 15:59:37, diff=31.559209s, valid=True
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:00:08.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:00:08.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:00:12, diff=-3.437937s, valid=True
2026-05-28T16:00:08.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:00:08.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:00:08.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:00:08.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909450.562681s, valid=True
2026-05-28T16:00:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:00:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:00:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:00:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:00:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:00:08.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:00:08.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:00:08.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:00:08.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:00:08.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:00:08.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:00:08.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:00:08.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:00:08.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:00:09.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:00:09.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:00:09.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:00:09.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:00: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-28T16:00: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-28T16:00:09.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:00:09.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:00:39.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:00:39.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:00:39.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:00:39.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:00:39.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:00:40.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:00:40.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-28T16:00:40.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:00:40.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-28T16:00:40.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:00:40.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:00:40.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:00:40.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-28T16:00:43.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-28T16:00:43.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:00:43.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:00:43.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:00:43.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:00:43.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:00:43.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:00:43.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:00:43.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:00:43.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:00:43.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:00:43.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:00:43.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:00:43.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:00:43.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:00:43.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:00:43.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:00:43.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:00:43.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:00:43.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:00:43.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:00:43.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:00:43.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:00:43.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:00:43.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:00:42
2026-05-28T16:00:43.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69404, datetime.datetime(2026, 5, 28, 16, 0, 42), datetime.datetime(2026, 5, 28, 16, 0, 42), 'salt', 15.17, 30.38, None, 7.38, 267.55, 17.28, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:00:43.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:00:43.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:00:43.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:00:42, diff=1.661015s, valid=True
2026-05-28T16:00:43.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:00:43.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:00:43.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:12, diff=-28.336125s, valid=True
2026-05-28T16:00:43.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:00:43.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:00:40, diff=3.670372s, valid=True
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:00:43.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:00:43.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:12, diff=-28.326605s, valid=True
2026-05-28T16:00:43.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:00:43.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:00:43.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:00:43.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909485.674068s, valid=True
2026-05-28T16:00:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:00:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:00:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:00:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:00:43.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:00:43.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:00:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:00:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:00:43.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:00:43.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:00:43.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:00:43.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:00:44.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:00:44.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:00:44.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:00:44.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:00:44.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:00:44.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:00:44.796 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:00:44.796 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:00:44.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:00:44.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:01:14.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:01:14.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:01:14.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:01:15.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:01:15.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:01:15.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:01:15.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-28T16:01:15.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:01:15.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-28T16:01:15.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:01:15.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:01:15.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:01:15.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-28T16:01:17.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-28T16:01:17.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:01:17.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:01:17.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:01:17.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:01:17.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:01:17.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:01:17.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:01:17.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:01:17.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:01:17.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:01:17.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:01:17.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:01:17.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:01:17.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:01:17.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:01:17.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:01:18.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:01:18.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:01:18.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:01:18.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:01:18.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:01:18.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:01:18.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:01:18.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:01:13
2026-05-28T16:01:18.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69405, datetime.datetime(2026, 5, 28, 16, 1, 13), datetime.datetime(2026, 5, 28, 16, 1, 12), 'salt', 15.04, 29.39, None, 6.95, 262.47, 17.71, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:01:18.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:01:18.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:01:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:12, diff=6.122333s, valid=True
2026-05-28T16:01:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:01:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:01:18.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:12, diff=6.125176s, valid=True
2026-05-28T16:01:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:01:18.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:01:18.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:11, diff=7.131831s, valid=True
2026-05-28T16:01:18.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:01:18.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:01:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:01:18.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:01:18.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:01:18.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:01:18.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:12, diff=6.134856s, valid=True
2026-05-28T16:01:18.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:01:18.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:01:18.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:01:18.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909520.13551s, valid=True
2026-05-28T16:01:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:01:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:01:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:01:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:01:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:01:18.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:01:18.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:01:18.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:01:18.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:01:18.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:01:18.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:01:18.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:01:18.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:01:18.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:01:18.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:01:19.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:01:19.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:01:19.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:01:19.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-28T16:01:19.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-28T16:01:19.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:01:19.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:01:49.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:01:49.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:01: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-28T16:01:49.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:01:49.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:01:50.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:01:50.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-28T16:01:50.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:01:50.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:01:50.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:01:50.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:01:50.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:01:50.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-28T16:01:52.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-28T16:01:52.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:01:52.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:01:52.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:01:52.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:01:52.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:01:52.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:01:52.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:01:52.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:01:52.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:01:52.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:01:52.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:01:52.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:01:52.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:01:52.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:01:52.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:01:52.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:01:52.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:01:52.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:01:52.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:01:52.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:01:52.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:01:52.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:01:52.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:01:52.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:01:43
2026-05-28T16:01:52.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69406, datetime.datetime(2026, 5, 28, 16, 1, 43), datetime.datetime(2026, 5, 28, 16, 1, 42), 'salt', 14.97, 29.35, None, 7.09, 233.78, 17.71, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:01:52.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:01:52.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:01:52.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:42, diff=10.903141s, valid=True
2026-05-28T16:01:52.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:01:52.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:01:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:12, diff=-19.09402s, valid=True
2026-05-28T16:01:52.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:01:52.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:01:36, diff=16.912574s, valid=True
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:01:52.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:01:52.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:01:52.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:12, diff=-19.084451s, valid=True
2026-05-28T16:01:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:01:52.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:01:52.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:01:52.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909554.916202s, valid=True
2026-05-28T16:01:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:01:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:01:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:01:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:01:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:01:52.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:01:52.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:01:52.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:01:53.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:01:53.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:01:53.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:01:53.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:01:53.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:01:53.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:01:53.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:01:53.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:01:53.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:01:53.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:01:53.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-28T16:01:53.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-28T16:01:54.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:01:54.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:02:24.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:02:24.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:02:24.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:02:24.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:02:24.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:02:24.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:02:24.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:02:24.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:02:24.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-28T16:02:24.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:02:24.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:02:24.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:02:24.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-28T16:02:27.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:02:27.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:02:27.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:02:27.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:02:27.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:02:27.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:02:27.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:02:27.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:02:27.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:02:27.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:02:27.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:02:27.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:02:27.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:02:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:02:27.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:02:27.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:02:27.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:02:27.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:02:27.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:02:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:02:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:02:27.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:02:27.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:02:27.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:02:27.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:02:13
2026-05-28T16:02:27.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69407, datetime.datetime(2026, 5, 28, 16, 2, 13), datetime.datetime(2026, 5, 28, 16, 2, 13), 'salt', 14.81, 29.79, None, 5.05, 252.55, 17.5, 829.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:02:27.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:02:27.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:02:27.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:13, diff=14.742249s, valid=True
2026-05-28T16:02:27.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:02:27.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:02:27.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:12, diff=15.746949s, valid=True
2026-05-28T16:02:27.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:02:27.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:06, diff=21.758446s, valid=True
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:02:27.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:02:27.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:02:27.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:12, diff=15.763602s, valid=True
2026-05-28T16:02:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:02:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:02:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:02:27.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909589.764844s, valid=True
2026-05-28T16:02:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:02:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:02:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:02:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:02:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:02:27.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:02:27.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:02:27.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:02:27.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:02:27.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:02:27.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:02:28.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:02:28.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:02:28.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:02:28.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:02:28.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:02:28.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:02:28.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:02:28.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-28T16:02:28.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-28T16:02:29.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:02:29.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:02:59.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:02:59.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:02:59.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:02:59.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:02:59.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:02:59.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:02:59.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-28T16:02:59.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:02:59.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-28T16:02:59.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:02:59.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:02:59.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:02:59.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:03:02.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:03:02.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:03:02.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:03:02.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:03:02.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:03:02.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:03:02.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:03:02.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:03:02.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:03:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:03:02.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:03:02.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:03:02.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:03:02.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:03:02.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:03:02.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:03:02.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:03:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:03:02.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:03:02.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:03:02.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:03:02.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:03:02.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:03:02.971 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:03:03.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:02:44
2026-05-28T16:03:03.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69408, datetime.datetime(2026, 5, 28, 16, 2, 44), datetime.datetime(2026, 5, 28, 16, 2, 43), 'salt', 14.87, 29.59, None, 5.79, 232.7, 17.59, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:03:03.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:03:03.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:03:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:43, diff=20.038311s, valid=True
2026-05-28T16:03:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:03:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:03:03.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:12, diff=-8.958867s, valid=True
2026-05-28T16:03:03.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:03:03.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:03:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:02:36, diff=27.047683s, valid=True
2026-05-28T16:03:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:03:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:03:03.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:03:03.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:03:03.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:03:03.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:03:03.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:12, diff=-8.949262s, valid=True
2026-05-28T16:03:03.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:03:03.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:03:03.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:03:03.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909625.051402s, valid=True
2026-05-28T16:03:03.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:03:03.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:03:03.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:03:03.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:03:03.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:03:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:03:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:03:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:03:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:03:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:03:03.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:03:03.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:03:03.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:03:03.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:03:03.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:03:03.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:03:04.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:03:04.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:03:04.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-28T16:03:04.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-28T16:03:04.193 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:03:04.193 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:03:34.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:03:34.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:03:34.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:03:34.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:03:34.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:03:34.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:03:34.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:03:34.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:03:34.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-28T16:03:34.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:03:34.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:03:34.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:03:34.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-28T16:03:37.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-28T16:03:37.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:03:37.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:03:37.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:03:37.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:03:37.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:03:37.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:03:37.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:03:37.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:03:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:03:37.372 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:03:37.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:03:37.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:03:37.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:03:37.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:03:37.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:03:37.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:03:37.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:03:37.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:03:37.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:03:37.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:03:37.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:03:37.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:03:37.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:03:37.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:03:14
2026-05-28T16:03:37.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69409, datetime.datetime(2026, 5, 28, 16, 3, 14), datetime.datetime(2026, 5, 28, 16, 3, 14), 'salt', 14.87, 30.95, None, 5.65, 238.46, 16.99, 829.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:03:37.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:03:37.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:03:37.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:14, diff=23.700286s, valid=True
2026-05-28T16:03:37.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:03:37.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:03:37.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:12, diff=25.703115s, valid=True
2026-05-28T16:03:37.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:03:37.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:03:37.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:07, diff=30.709742s, valid=True
2026-05-28T16:03:37.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:03:37.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:03:37.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:03:37.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:03:37.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:03:37.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:03:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:12, diff=25.714006s, valid=True
2026-05-28T16:03:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:03:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:03:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:03:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909659.714686s, valid=True
2026-05-28T16:03:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:03:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:03:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:03:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:03:37.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:03:37.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:03:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:03:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:03:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:03:37.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:03:37.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:03:37.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:03:38.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:03:38.134 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:03:38.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:03:38.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:03:38.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:03:38.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:03:38.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-28T16:03:38.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-28T16:03:38.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:03:38.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:04:08.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:04:08.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:04:08.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:04:09.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:04:09.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:04:09.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:04:09.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:04:09.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:04:09.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-28T16:04:09.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:04:09.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:04:09.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:04:09.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-28T16:04: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-28T16:04:12.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:04:12.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:04:12.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:04:12.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:04:12.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:04:12.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:04:12.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:04:12.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:04:12.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:04:12.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:04:12.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:04:12.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:04:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:04:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:04:13.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:04:13.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:04:13.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:04:13.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:04:13.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:04:13.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:04:13.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:04:13.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:04:13.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:04:13.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:03:46
2026-05-28T16:04:13.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69410, datetime.datetime(2026, 5, 28, 16, 3, 46), datetime.datetime(2026, 5, 28, 16, 3, 44), 'salt', 14.87, 30.58, None, 8.79, 238.25, 17.15, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:04:13.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:04:13.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:04:13.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:44, diff=29.276785s, valid=True
2026-05-28T16:04:13.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:04:13.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:04:13.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:12, diff=1.279594s, valid=True
2026-05-28T16:04:13.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:04:13.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:03:38, diff=35.286131s, valid=True
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:04:13.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:04:13.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:12, diff=1.289141s, valid=True
2026-05-28T16:04:13.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:04:13.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:04:13.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:04:13.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909695.2898s, valid=True
2026-05-28T16:04:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:04:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:04:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:04:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:04:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:04:13.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:04:13.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:04:13.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:04:13.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:04:13.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:04:13.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:04:13.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:04:13.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:04:13.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:04:13.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:04:14.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:04:14.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:04:14.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:04:14.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-28T16:04:14.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-28T16:04:14.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:04:14.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:04:44.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:04:44.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:04:44.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:04:44.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:04:44.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:04:45.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:04:45.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-28T16:04:45.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:04:45.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-28T16:04:45.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:04:45.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:04:45.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:04:45.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-28T16:04:48.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-28T16:04:48.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:04:48.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:04:48.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:04:48.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:04:48.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:04:48.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:04:48.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:04:48.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:04:48.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:04:48.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:04:48.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:04:48.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:04:48.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:04:48.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:04:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:04:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:04:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:04:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:04:48.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:04:48.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:04:48.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:04:48.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:04:48.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:04:48.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:04:16
2026-05-28T16:04:48.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69411, datetime.datetime(2026, 5, 28, 16, 4, 16), datetime.datetime(2026, 5, 28, 16, 4, 16), 'salt', 14.94, 30.48, None, 6.81, 263.26, 17.2, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:04:48.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:04:48.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:04:48.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:46, diff=2.35257s, valid=True
2026-05-28T16:04:48.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:04:48.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:04:48.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:12, diff=36.355387s, valid=True
2026-05-28T16:04:48.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:04:48.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:41, diff=7.361993s, valid=True
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:04:48.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:04:48.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:04:12, diff=36.364997s, valid=True
2026-05-28T16:04:48.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:04:48.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:04:48.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:04:48.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909730.365654s, valid=True
2026-05-28T16:04:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:04:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:04:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:04:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:04:48.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:04:48.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:04:48.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:04:48.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:04:48.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:04:48.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:04:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:04:48.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:04:48.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:04:48.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:04:48.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:04:49.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:04:49.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:04:49.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:04:49.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-28T16:04:49.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-28T16:04:49.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:04:49.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:05:19.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:05:19.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:05:19.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:05:20.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:05:20.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:05:20.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:05:20.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-28T16:05:20.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:05:20.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-28T16:05:20.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:05:20.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:05:20.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:05:20.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-28T16:05:23.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-28T16:05:23.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:05:23.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:05:23.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:05:23.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:05:23.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:05:23.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:05:23.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:05:23.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:05:23.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:05:23.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:05:23.272 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:05:23.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:05:23.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:05:23.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:05:23.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:05:23.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:05:23.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:05:23.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:05:23.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:05:23.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:05:23.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:05:23.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:05:23.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:05:23.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:05:20
2026-05-28T16:05:23.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69413, datetime.datetime(2026, 5, 28, 16, 5, 20), datetime.datetime(2026, 5, 28, 16, 5, 19), 'salt', 14.84, 29.95, None, 4.98, 323.41, 17.43, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:05:23.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:05:23.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:05:23.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:19, diff=4.586977s, valid=True
2026-05-28T16:05:23.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:05:23.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:05:23.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:12, diff=11.589811s, valid=True
2026-05-28T16:05:23.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:05:23.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:17, diff=6.59652s, valid=True
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:05:23.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:05:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:12, diff=11.599528s, valid=True
2026-05-28T16:05:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:05:23.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:05:23.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:05:23.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909765.600214s, valid=True
2026-05-28T16:05:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:05:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:05:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:05:23.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:05:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:05:23.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:05:23.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:05:23.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:05:23.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:05:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:05:23.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:05:23.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:05:23.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:05:23.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:05:24.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:05:24.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:05:24.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:05:24.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:05:24.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-28T16:05:24.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-28T16:05:26.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:05:26.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:05:56.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:05:56.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:05:56.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:05:56.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:05:56.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:05:57.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:05:57.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-28T16:05:57.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:05:57.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-28T16:05:57.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:05:57.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:05:57.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:05:57.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-28T16:05: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-28T16:05:59.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:05:59.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:05:59.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:05:59.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:05:59.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:05:59.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:05:59.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:05:59.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:05:59.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:05:59.565 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:05:59.565 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:05:59.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:05:59.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:05:59.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:05:59.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:05:59.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:05:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:05:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:05:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:05:59.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:05:59.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:05:59.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:05:59.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:05:59.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:05:52
2026-05-28T16:05:59.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69414, datetime.datetime(2026, 5, 28, 16, 5, 52), datetime.datetime(2026, 5, 28, 16, 5, 50), 'salt', 15.07, 30.38, None, 5.75, 334.4, 17.26, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:05:59.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:05:59.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:05:59.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:50, diff=9.938616s, valid=True
2026-05-28T16:05:59.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:05:59.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:05:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:12, diff=-12.058193s, valid=True
2026-05-28T16:05:59.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:05:59.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:05:47, diff=12.94943s, valid=True
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:05:59.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:05:59.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:12, diff=-12.047407s, valid=True
2026-05-28T16:05:59.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:05:59.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:05:59.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:05:59.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909801.95327s, valid=True
2026-05-28T16:05:59.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:05:59.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:05:59.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:05:59.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:05:59.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:06:00.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:06:00.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:06:00.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:06:00.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:06:00.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:06:00.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:06:00.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:06:00.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:06:00.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:06:00.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:06:00.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:06:01.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:06:01.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:06:01.060 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:06:01.060 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:06:01.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:06:01.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:06:31.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:06:31.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:06:31.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:06:31.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:06:31.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:06:32.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:06:32.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-28T16:06:32.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:06:32.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-28T16:06:32.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:06:32.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:06:32.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:06:32.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-28T16:06:34.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:06:34.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:06:34.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:06:34.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:06:34.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:06:34.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:06:34.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:06:34.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:06:34.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:06:34.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:06:34.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:06:34.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:06:34.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:06:34.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:06:34.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:06:34.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:06:34.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:06:34.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:06:34.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:06:34.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:06:34.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:06:34.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:06:34.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:06:34.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:06:34.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:06:22
2026-05-28T16:06:34.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69415, datetime.datetime(2026, 5, 28, 16, 6, 22), datetime.datetime(2026, 5, 28, 16, 6, 21), 'salt', 15.17, 30.28, None, 4.7, 328.12, 17.32, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:06:34.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:06:34.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:06:34.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:21, diff=13.867352s, valid=True
2026-05-28T16:06:34.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:06:34.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:06:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:12, diff=22.870223s, valid=True
2026-05-28T16:06:34.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:06:34.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:06:34.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:18, diff=16.876928s, valid=True
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:06:34.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:06:34.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:12, diff=22.879927s, valid=True
2026-05-28T16:06:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:06:34.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:06:34.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:06:34.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909836.880572s, valid=True
2026-05-28T16:06:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:06:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:06:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:06:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:06:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:06:34.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:06:34.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:06:34.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:06:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:06:35.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:06:35.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:06:35.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:06:35.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:06:35.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:06:35.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:06:35.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:06:35.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:06:35.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:06:35.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:06:35.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:06:36.056 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:06:36.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:07:06.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:07:06.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:07:06.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:07:06.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:07:06.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:07:06.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:07:06.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-28T16:07:06.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:07:06.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-28T16:07:06.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:07:06.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:07:06.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:07:06.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-28T16:07:09.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:07:09.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:07:09.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:07:09.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:07:09.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:07:09.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:07:09.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:07:09.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:07:09.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:07:09.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:07:09.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:07:09.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:07:09.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:07:09.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:07:09.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:07:09.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:07:09.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:07:09.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:07:09.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:07:09.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:07:09.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:07:09.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:07:09.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:07:09.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:07:09.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:06:54
2026-05-28T16:07:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69416, datetime.datetime(2026, 5, 28, 16, 6, 54), datetime.datetime(2026, 5, 28, 16, 6, 52), 'salt', 15.24, 28.73, None, 2.83, 67.4, 18.05, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:07:09.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:07:09.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:07:09.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:52, diff=17.958562s, valid=True
2026-05-28T16:07:09.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:07:09.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:07:09.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:12, diff=-2.038352s, valid=True
2026-05-28T16:07:09.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:07:09.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:07:09.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:06:48, diff=21.96863s, valid=True
2026-05-28T16:07:09.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:07:09.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:07:09.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:07:09.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:07:09.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:07:09.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:07:09.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:12, diff=-2.028186s, valid=True
2026-05-28T16:07:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:07:09.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:07:09.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:07:09.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909871.972469s, valid=True
2026-05-28T16:07:09.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:07:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:07:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:07:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:07:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:07:10.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:07:10.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:07:10.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:07:10.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:07:10.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:07:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:07:10.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:07:10.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:07:10.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:07:10.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:07:10.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:07:10.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:07:10.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:07:10.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-28T16:07:10.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-28T16:07:11.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:07:11.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:07:41.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:07:41.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:07:41.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:07:41.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:07:41.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:07:41.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:07:41.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:07:41.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:07:41.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:07:41.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:07:41.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:07:41.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:07:41.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:07:44.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-28T16:07:44.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:07:44.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:07:44.462 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:07:44.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:07:44.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:07:44.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:07:44.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:07:44.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:07:44.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:07:44.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:07:44.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:07:44.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:07:44.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:07:44.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:07:44.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:07:44.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:07:44.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:07:44.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:07:44.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:07:44.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:07:44.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:07:44.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:07:44.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:07:44.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:07:24
2026-05-28T16:07:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69417, datetime.datetime(2026, 5, 28, 16, 7, 24), datetime.datetime(2026, 5, 28, 16, 7, 24), 'salt', 15.24, 28.63, None, 3.07, 56.73, 18.09, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:07:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:07:44.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:07:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:24, diff=20.805132s, valid=True
2026-05-28T16:07:44.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:07:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:07:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:12, diff=32.808012s, valid=True
2026-05-28T16:07:44.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:07:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:07:44.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:18, diff=26.814724s, valid=True
2026-05-28T16:07:44.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:07:44.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:07:44.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:07:44.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:07:44.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:07:44.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:07:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:12, diff=32.817731s, valid=True
2026-05-28T16:07:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:07:44.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:07:44.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:07:44.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909906.818388s, valid=True
2026-05-28T16:07:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:07:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:07:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:07:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:07:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:07:44.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:07:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:07:44.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:07:44.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:07:44.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:07:45.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:07:45.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:07:45.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:07:45.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:07:45.415 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:07:45.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:07:45.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:07:45.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:07:45.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-28T16:07:45.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-28T16:07:46.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:07:46.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:08:16.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:08:16.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:08:16.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:08:16.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:08:16.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:08:16.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:08:16.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-28T16:08:16.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:08:16.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-28T16:08:16.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:08:16.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:08:16.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:08:16.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-28T16:08: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-28T16:08:19.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:08:19.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:08:19.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:08:19.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:08:19.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:08:19.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:08:19.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:08:19.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:08:19.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:08:19.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:08:19.131 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:08:19.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:08:19.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:08:19.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:08:19.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:08:19.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:08:19.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:08:19.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:08:19.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:08:19.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:08:19.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:08:19.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:08:19.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:08:19.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:07:55
2026-05-28T16:08:19.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69418, datetime.datetime(2026, 5, 28, 16, 7, 55), datetime.datetime(2026, 5, 28, 16, 7, 54), 'salt', 14.84, 28.99, None, 2.4, 82.94, 17.87, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:08:19.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:08:19.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:08:19.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:54, diff=25.449917s, valid=True
2026-05-28T16:08:19.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:08:19.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:08:19.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:12, diff=7.45285s, valid=True
2026-05-28T16:08:19.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:08:19.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:08:19.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:07:50, diff=29.459674s, valid=True
2026-05-28T16:08:19.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:08:19.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:08:19.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:08:19.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:08:19.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:08:19.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:08:19.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:12, diff=7.462742s, valid=True
2026-05-28T16:08:19.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:08:19.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:08:19.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:08:19.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909941.463396s, valid=True
2026-05-28T16:08:19.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:08:19.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:08:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:08:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:08:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:08:19.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:08:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:08:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:08:19.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:08:19.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:08:19.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:08:19.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:08:19.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:08:19.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:08:20.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:08:20.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:08:20.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:08:20.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:08:20.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-28T16:08:20.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-28T16:08:20.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:08:20.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:08:50.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:08:50.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:08:50.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:08:50.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:08:50.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:08:51.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:08:51.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-28T16:08:51.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:08:51.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-28T16:08:51.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:08:51.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:08:51.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:08:51.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-28T16:08:53.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:08:53.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:08:53.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:08:53.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:08:53.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:08:53.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:08:53.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:08:53.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:08:53.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:08:53.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:08:53.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:08:53.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:08:53.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:08:53.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:08:53.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:08:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:08:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:08:54.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:08:54.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:08:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:08:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:08:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:08:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:08:54.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:08:54.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:08:25
2026-05-28T16:08:54.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69419, datetime.datetime(2026, 5, 28, 16, 8, 25), datetime.datetime(2026, 5, 28, 16, 8, 25), 'salt', 14.84, 29.26, None, 1.41, 92.53, 17.74, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:08:54.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:08:54.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:08:54.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:25, diff=29.122209s, valid=True
2026-05-28T16:08:54.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:08:54.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:08:54.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:12, diff=42.125063s, valid=True
2026-05-28T16:08:54.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:08:54.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:08:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:21, diff=33.131695s, valid=True
2026-05-28T16:08:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:08:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:08:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:08:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:08:54.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:08:54.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:08:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:08:12, diff=42.134755s, valid=True
2026-05-28T16:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:08:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:08:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:08:54.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=909976.135405s, valid=True
2026-05-28T16:08:54.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:08:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:08:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:08:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:08:54.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:08:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:08:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:08:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:08:54.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:08:54.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:08:54.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:08:54.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:08:54.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:08:54.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:08:54.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:08:55.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:08:55.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:08:55.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:08:55.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-28T16:08:55.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-28T16:08:55.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:08:55.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:09:25.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:09:25.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:09:25.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:09:25.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:09:25.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:09:26.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:09:26.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-28T16:09:26.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:09:26.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-28T16:09:26.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:09:26.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:09:26.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:09:26.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-28T16:09:28.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-28T16:09:28.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:09:28.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:09:28.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:09:28.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:09:28.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:09:28.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:09:28.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:09:28.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:09:28.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:09:28.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:09:28.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:09:28.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:09:28.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:09:28.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:09:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:09:28.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:09:28.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:09:28.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:09:28.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:09:28.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:09:28.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:09:28.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:09:28.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:09:28.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:09:26
2026-05-28T16:09:28.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69421, datetime.datetime(2026, 5, 28, 16, 9, 26), datetime.datetime(2026, 5, 28, 16, 9, 26), 'salt', 15.17, 30.48, None, 4.59, 276.37, 17.23, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:09:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:09:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:09:28.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:26, diff=2.959803s, valid=True
2026-05-28T16:09:28.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:09:28.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:09:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:12, diff=16.962566s, valid=True
2026-05-28T16:09:28.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:09:28.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:24, diff=4.969149s, valid=True
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:09:28.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:09:28.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:12, diff=16.972153s, valid=True
2026-05-28T16:09:28.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:09:28.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:09:28.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:09:28.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910010.972817s, valid=True
2026-05-28T16:09:28.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:09:28.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:09:28.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:09:28.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:09:28.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:09:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:09:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:09:29.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:09:29.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:09:29.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:09:29.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:09:29.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:09:29.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:09:29.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:09:29.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:09:29.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:09:30.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:09:30.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:09:30.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:09:30.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:09:30.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:09:30.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:10:00.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:10:00.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:10:00.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:10:00.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:10:00.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:10:00.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:10:00.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-28T16:10:00.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:10:00.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-28T16:10:00.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:10:00.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:10:00.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:10:00.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-28T16:10:03.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-28T16:10:03.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:10:03.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:10:03.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:10:03.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:10:03.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:10:03.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:10:03.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:10:03.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:10:03.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:10:03.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:10:03.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:10:03.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:10:03.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:10:03.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:10:03.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:10:03.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:10:03.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:10:03.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:10:03.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:10:03.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:10:03.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:10:03.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:10:03.514 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:10:03.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:09:57
2026-05-28T16:10:03.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69422, datetime.datetime(2026, 5, 28, 16, 9, 57), datetime.datetime(2026, 5, 28, 16, 9, 56), 'salt', 15.27, 30.95, None, 3.5, 245.33, 17.04, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:10:03.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:10:03.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:10:03.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:56, diff=7.584389s, valid=True
2026-05-28T16:10:03.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:10:03.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:10:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:12, diff=-8.411954s, valid=True
2026-05-28T16:10:03.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:10:03.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:10:03.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:09:56, diff=7.59655s, valid=True
2026-05-28T16:10:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:10:03.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:10:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:10:03.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:10:03.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:10:03.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:10:03.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:12, diff=-8.399329s, valid=True
2026-05-28T16:10:03.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:10:03.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:10:03.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:10:03.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910045.601703s, valid=True
2026-05-28T16:10:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:10:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:10:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:10:03.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:10:03.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:10:03.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:10:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:10:03.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:10:03.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:10:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:10:03.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:10:03.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:10:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:10:04.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:10:04.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:10:04.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:10:04.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:10:04.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:10:04.775 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:10:04.775 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:10:05.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:10:05.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:10:35.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:10:35.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:10:35.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:10:35.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:10:35.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:10:35.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:10:35.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:10:35.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:10:35.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-28T16:10:35.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:10:35.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:10:35.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:10:35.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:10:38.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:10:38.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:10:38.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:10:38.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:10:38.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:10:38.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:10:38.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:10:38.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:10:38.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:10:38.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:10:38.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:10:38.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:10:38.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:10:38.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:10:38.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:10:38.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:10:38.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:10:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:10:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:10:38.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:10:38.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:10:38.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:10:38.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:10:38.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:10:38.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:10:28
2026-05-28T16:10:38.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69423, datetime.datetime(2026, 5, 28, 16, 10, 28), datetime.datetime(2026, 5, 28, 16, 10, 27), 'salt', 15.44, 30.22, None, 3.67, 152.16, 17.39, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:10:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:10:38.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:10:38.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:27, diff=11.711057s, valid=True
2026-05-28T16:10:38.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:10:38.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:10:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:12, diff=26.714033s, valid=True
2026-05-28T16:10:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:10:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:10:38.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:27, diff=11.720909s, valid=True
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:10:38.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:10:38.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:12, diff=26.724192s, valid=True
2026-05-28T16:10:38.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:10:38.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:10:38.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:10:38.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910080.724969s, valid=True
2026-05-28T16:10:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:10:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:10:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:10:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:10:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:10:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:10:38.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:10:38.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:10:38.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:10:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:10:38.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:10:38.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:10:39.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:10:39.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:10:39.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:10:39.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:10:39.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:10:39.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:10:39.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-28T16:10:39.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-28T16:10:39.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:10:39.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:11:09.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:11:09.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:11:09.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:11:10.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:11:10.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:11:10.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:11:10.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-28T16:11:10.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:11:10.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-28T16:11:10.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:11:10.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:11:10.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:11:10.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-28T16:11:13.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:11:13.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:11:13.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:11:13.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:11:13.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:11:13.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:11:13.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:11:13.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:11:13.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:11:13.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:11:13.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:11:13.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:11:13.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:11:13.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:11:13.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:11:13.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:11:13.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:11:13.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:11:13.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:11:13.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:11:13.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:11:13.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:11:13.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:11:13.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:11:13.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:10:58
2026-05-28T16:11:13.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69424, datetime.datetime(2026, 5, 28, 16, 10, 58), datetime.datetime(2026, 5, 28, 16, 10, 58), 'salt', 15.44, 30.32, None, 5.05, 214.39, 17.35, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:11:13.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:11:13.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:11:13.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:58, diff=15.543183s, valid=True
2026-05-28T16:11:13.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:11:13.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:11:13.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:12, diff=1.54604s, valid=True
2026-05-28T16:11:13.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:11:13.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:11:13.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:10:49, diff=24.552682s, valid=True
2026-05-28T16:11:13.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:11:13.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:11:13.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:11:13.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:11:13.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:11:13.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:11:13.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:12, diff=1.555677s, valid=True
2026-05-28T16:11:13.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:11:13.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:11:13.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:11:13.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910115.556317s, valid=True
2026-05-28T16:11:13.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:11:13.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:11:13.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:11:13.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:11:13.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:11:13.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:11:13.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:11:13.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:11:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:11:13.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:11:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:11:13.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:11:13.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:11:13.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:11:14.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:11:14.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:11:14.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:11:14.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:11:14.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-28T16:11: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-28T16:11:14.783 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:11:14.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:11:44.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:11:44.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:11:44.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:11:44.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:11:44.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:11:45.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:11:45.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-28T16:11:45.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:11:45.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-28T16:11:45.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:11:45.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:11:45.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:11:45.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-28T16:11:48.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-28T16:11:48.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:11:48.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:11:48.475 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:11:48.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:11:48.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:11:48.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:11:48.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:11:48.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:11:48.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:11:48.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:11:48.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:11:48.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:11:48.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:11:48.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:11:48.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:11:48.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:11:48.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:11:48.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:11:48.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:11:48.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:11:48.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:11:48.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:11:48.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:11:48.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:11:28
2026-05-28T16:11:48.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69425, datetime.datetime(2026, 5, 28, 16, 11, 28), datetime.datetime(2026, 5, 28, 16, 11, 28), 'salt', 15.37, 30.65, None, 8.89, 198.47, 17.19, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:11:48.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:11:48.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:11:48.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:28, diff=20.812559s, valid=True
2026-05-28T16:11:48.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:11:48.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:11:48.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:12, diff=36.815401s, valid=True
2026-05-28T16:11:48.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:11:48.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:20, diff=28.822043s, valid=True
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:11:48.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:11:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:12, diff=36.825043s, valid=True
2026-05-28T16:11:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:11:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:11:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:11:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910150.825695s, valid=True
2026-05-28T16:11:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:11:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:11:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:11:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:11:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:11:48.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:11:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:11:48.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:11:48.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:11:48.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:11:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:11:49.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:11:49.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:11:49.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:11:49.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:11:49.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:11:49.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:11:49.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:11:49.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-28T16:11:49.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-28T16:11:49.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:11:49.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:12:19.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:12:19.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:12:19.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:12:20.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:12:20.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:12:20.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:12:20.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-28T16:12:20.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:12:20.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:12:20.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:12:20.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:12:20.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:12:20.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-28T16:12:22.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-28T16:12:22.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:12:22.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:12:22.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:12:22.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:12:22.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:12:22.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:12:22.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:12:22.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:12:22.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:12:22.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:12:22.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:12:22.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:12:22.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:12:22.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:12:22.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:12:22.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:12:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:12:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:12:23.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:12:23.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:12:23.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:12:23.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:12:23.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:12:23.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:11:59
2026-05-28T16:12:23.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69426, datetime.datetime(2026, 5, 28, 16, 11, 59), datetime.datetime(2026, 5, 28, 16, 11, 58), 'salt', 15.34, 29.09, None, 8.15, 203.09, 17.89, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:12:23.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:12:23.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:12:23.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:58, diff=25.120154s, valid=True
2026-05-28T16:12:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:12:23.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:12:23.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:12, diff=11.122977s, valid=True
2026-05-28T16:12:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:12:23.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:11:51, diff=32.129578s, valid=True
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:12:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:12:23.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:12:23.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:12, diff=11.132555s, valid=True
2026-05-28T16:12:23.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:12:23.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:12:23.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:12:23.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910185.133208s, valid=True
2026-05-28T16:12:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:12:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:12:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:12:23.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:12:23.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:12:23.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:12:23.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:12:23.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:12:23.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:12:23.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:12:23.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:12:23.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:12:23.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:12:23.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:12:23.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:12:24.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:12:24.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:12:24.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:12:24.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-28T16:12:24.123 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:12:26.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:12:26.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:12:56.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:12:56.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:12:56.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:12:56.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:12:56.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:12:56.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:12:56.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-28T16:12:56.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:12:56.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:12:56.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:12:56.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:12:56.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:12:56.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-28T16:12:59.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-28T16:12:59.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:12:59.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:12:59.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:12:59.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:12:59.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:12:59.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:12:59.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:12:59.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:12:59.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:12:59.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:12:59.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:12:59.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:12:59.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T16:12:59.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:12:59.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T16:12:59.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:13:00.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:13:00.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:13:00.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:13:00.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:13:00.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:13:00.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:13:00.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:13:00.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:12:29
2026-05-28T16:13:00.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69427, datetime.datetime(2026, 5, 28, 16, 12, 29), datetime.datetime(2026, 5, 28, 16, 12, 29), 'salt', 15.2, 29.45, None, 3.64, 216.83, 17.7, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:13:00.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:13:00.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T16:13:00.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:59, diff=1.117016s, valid=True
2026-05-28T16:13:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:13:00.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:13:00.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:12, diff=48.120026s, valid=True
2026-05-28T16:13:00.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:13:00.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:54, diff=6.128017s, valid=True
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:13:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:13:00.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:12:12, diff=48.131184s, valid=True
2026-05-28T16:13:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:13:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:13:00.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:13:00.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910222.131877s, valid=True
2026-05-28T16:13:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:13:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:13:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:13:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:13:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:13:00.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:13:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:13:00.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:13:00.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:13:00.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:13:00.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:13:00.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:13:00.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:13:00.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:13:00.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:13:01.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:13:01.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:13:01.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:13:01.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-28T16:13:01.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:13:01.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:13:01.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:13:31.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:13:31.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:13:31.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:13:31.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:13:31.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:13:31.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:13:31.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-28T16:13:31.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:13:31.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-28T16:13:31.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:13:31.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:13:31.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:13:31.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-28T16:13:34.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-28T16:13:34.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:13:34.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:13:34.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:13:34.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:13:34.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:13:34.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:13:34.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:13:34.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:13:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:13:34.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:13:34.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:13:34.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:13:34.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:13:34.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:13:34.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:13:34.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:13:34.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:13:34.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:13:34.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:13:34.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:13:34.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:13:34.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:13:34.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:13:34.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:13:31
2026-05-28T16:13:34.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69429, datetime.datetime(2026, 5, 28, 16, 13, 31), datetime.datetime(2026, 5, 28, 16, 13, 31), 'salt', 15.3, 29.52, None, 6.07, 210.62, 17.68, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:13:34.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:13:34.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:13:34.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:13:31, diff=3.68403s, valid=True
2026-05-28T16:13:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:13:34.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:13:34.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:13:12, diff=22.686821s, valid=True
2026-05-28T16:13:34.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:13:34.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:13:31, diff=3.693447s, valid=True
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:13:34.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:13:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:13:12, diff=22.696444s, valid=True
2026-05-28T16:13:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:13:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:13:34.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:13:34.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910256.697105s, valid=True
2026-05-28T16:13:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:13:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:13:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:13:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:13:34.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:13:34.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:13:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:13:34.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:13:34.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:13:34.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:13:34.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:13:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:13:34.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:13:35.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:13:35.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:13:35.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:13:35.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:13:35.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:13:35.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-28T16:13:35.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-28T16:13:35.853 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:13:35.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:14:05.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:14:05.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:14:05.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:14:06.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:14:06.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:14:06.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:14:06.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-28T16:14:06.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:14:06.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-28T16:14:06.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:14:06.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:14:06.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:14:06.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-28T16:14:08.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-28T16:14:08.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:14:08.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:14:08.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:14:08.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:14:08.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:14:08.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:14:08.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:14:08.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:14:08.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:14:08.804 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:14:08.804 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:14:08.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:14:08.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:14:08.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:14:08.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:14:08.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:14:09.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:14:09.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:14:09.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:14:09.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:14:09.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:14:09.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:14:09.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:14:09.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:14:01
2026-05-28T16:14:09.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69430, datetime.datetime(2026, 5, 28, 16, 14, 1), datetime.datetime(2026, 5, 28, 16, 14, 1), 'salt', 15.2, 29.42, None, 8.51, 208.3, 17.71, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:14:09.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:14:09.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:14:09.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:01, diff=8.12601s, valid=True
2026-05-28T16:14:09.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:14:09.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:14:09.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=-2.871088s, valid=True
2026-05-28T16:14:09.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:14:09.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:01, diff=8.135566s, valid=True
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:14:09.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:14:09.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:14:09.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=-2.861372s, valid=True
2026-05-28T16:14:09.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:14:09.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:14:09.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:14:09.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910291.139274s, valid=True
2026-05-28T16:14:09.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:14:09.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:14:09.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:14:09.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:14:09.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:14:09.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:14:09.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:14:09.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:14:09.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:14:09.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:14:09.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:14:09.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:14:09.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:14:09.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:14:09.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:14:10.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:14:10.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:14:10.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:14:10.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-28T16:14:10.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-28T16:14:10.478 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:14:10.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:14:40.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:14:40.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:14:40.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:14:41.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:14:41.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:14:41.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:14:41.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-28T16:14:41.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:14:41.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-28T16:14:41.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:14:41.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:14:41.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:14:41.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-28T16:14:43.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-28T16:14:43.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:14:43.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:14:43.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:14:43.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:14:43.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:14:43.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:14:43.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:14:43.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:14:43.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:14:43.763 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:14:43.763 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:14:43.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:14:43.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:14:43.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:14:43.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:14:43.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:14:43.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:14:43.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:14:44.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:14:44.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:14:44.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:14:44.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:14:44.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:14:44.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:14:32
2026-05-28T16:14:44.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69431, datetime.datetime(2026, 5, 28, 16, 14, 32), datetime.datetime(2026, 5, 28, 16, 14, 31), 'salt', 15.24, 29.62, None, 6.99, 195.87, 17.63, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:14:44.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:14:44.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:14:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:31, diff=13.08631s, valid=True
2026-05-28T16:14:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:14:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:14:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=32.089171s, valid=True
2026-05-28T16:14:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:14:44.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:14:44.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:28, diff=16.095853s, valid=True
2026-05-28T16:14:44.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:14:44.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:14:44.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:14:44.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:14:44.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:14:44.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:14:44.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=32.098918s, valid=True
2026-05-28T16:14:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:14:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:14:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:14:44.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910326.099577s, valid=True
2026-05-28T16:14:44.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:14:44.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:14:44.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:14:44.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:14:44.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:14:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:14:44.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:14:44.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:14:44.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:14:44.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:14:44.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:14:44.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:14:44.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:14:44.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:14:44.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:14:44.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:14:45.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:14:45.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:14:45.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-28T16:14:45.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-28T16:14:45.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:14:45.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:15:15.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:15:15.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:15:15.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:15:15.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:15:15.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:15:15.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:15:15.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-28T16:15:15.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:15:15.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:15:15.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:15:15.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:15:15.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:15:15.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-28T16:15:18.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-28T16:15:18.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:15:18.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:15:18.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:15:18.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:15:18.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:15:18.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:15:18.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:15:18.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:15:18.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:15:18.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:15:18.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:15:18.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:15:18.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:15:18.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:15:18.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:15:18.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:15:18.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:15:18.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:15:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:15:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:15:18.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:15:18.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:15:18.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:15:18.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:15:02
2026-05-28T16:15:18.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69432, datetime.datetime(2026, 5, 28, 16, 15, 2), datetime.datetime(2026, 5, 28, 16, 15, 2), 'salt', 15.14, 29.52, None, 8.96, 197.72, 17.66, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:15:18.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:15:18.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:15:18.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:15:02, diff=16.65237s, valid=True
2026-05-28T16:15:18.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:15:18.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:15:18.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=66.655222s, valid=True
2026-05-28T16:15:18.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:15:18.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:15:18.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:59, diff=19.661905s, valid=True
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:15:18.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:15:18.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=66.66495s, valid=True
2026-05-28T16:15:18.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:15:18.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:15:18.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:15:18.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910360.665611s, valid=True
2026-05-28T16:15:18.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:15:18.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:15:18.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:15:18.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:15:18.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:15:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:15:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:15:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:15:18.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:15:18.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:15:18.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:15:18.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:15:19.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:15:19.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:15:19.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:15:19.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:15:19.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:15:19.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:15:19.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-28T16:15:19.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-28T16:15:19.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:15:19.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:15:49.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:15:49.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:15:49.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:15:50.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:15:50.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:15:50.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:15:50.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-28T16:15:50.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:15:50.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-28T16:15:50.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:15:50.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:15:50.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:15:50.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:15:52.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-28T16:15:52.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:15:52.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:15:52.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:15:52.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:15:52.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:15:52.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:15:52.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:15:52.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:15:52.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:15:52.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:15:52.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:15:52.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:15:53.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:15:53.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:15:53.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:15:53.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:15:53.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:15:53.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:15:53.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:15:53.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:15:53.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:15:53.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:15:53.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:15:53.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:15:33
2026-05-28T16:15:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69433, datetime.datetime(2026, 5, 28, 16, 15, 33), datetime.datetime(2026, 5, 28, 16, 15, 32), 'salt', 15.1, 31.08, None, 8.58, 182.02, 16.96, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:15:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:15:53.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:15:53.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:15:32, diff=21.255182s, valid=True
2026-05-28T16:15:53.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:15:53.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:15:53.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=101.258076s, valid=True
2026-05-28T16:15:53.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:15:53.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:15:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:15:31, diff=22.264733s, valid=True
2026-05-28T16:15:53.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:15:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:15:53.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:15:53.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:15:53.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:15:53.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:15:53.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=101.267775s, valid=True
2026-05-28T16:15:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:15:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:15:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:15:53.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910395.268435s, valid=True
2026-05-28T16:15:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:15:53.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:15:53.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:15:53.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:15:53.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:15:53.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:15:53.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:15:53.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:15:53.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:15:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:15:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:15:53.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:15:53.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:15:53.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:15:53.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:15:54.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:15:54.251 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:15:54.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:15:54.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-28T16:15:54.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-28T16:15:54.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:15:54.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:16:24.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:16:24.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:16:24.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:16:24.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:16:24.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:16:25.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:16:25.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-28T16:16:25.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:16:25.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-28T16:16:25.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:16:25.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:16:25.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:16:25.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-28T16:16:27.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-28T16:16:27.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:16:27.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:16:27.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:16:27.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:16:27.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:16:27.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:16:27.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:16:27.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:16:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:16:27.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:16:27.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:16:27.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:16:28.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:16:28.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:16:28.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:16:28.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:16:28.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:16:28.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:16:28.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:16:28.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:16:28.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:16:28.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:16:28.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:16:28.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:16:04
2026-05-28T16:16:28.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69434, datetime.datetime(2026, 5, 28, 16, 16, 4), datetime.datetime(2026, 5, 28, 16, 16, 2), 'salt', 15.14, 30.38, None, 7.73, 197.91, 17.28, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:16:28.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:16:28.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:16:28.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:16:02, diff=26.254374s, valid=True
2026-05-28T16:16:28.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:16:28.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:16:28.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=136.257263s, valid=True
2026-05-28T16:16:28.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:16:28.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:16:02, diff=26.26405s, valid=True
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:16:28.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:16:28.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:14:12, diff=136.267095s, valid=True
2026-05-28T16:16:28.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:16:28.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:16:28.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:16:28.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910430.267783s, valid=True
2026-05-28T16:16:28.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:16:28.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:16:28.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:16:28.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:16:28.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:16:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:16:28.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:16:28.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:16:28.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:16:28.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:16:28.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:16:28.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:16:28.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:16:28.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:16:28.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:16:29.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:16:29.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:16:29.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:16:29.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-28T16:16:29.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-28T16:16:29.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:16:29.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:16:59.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:16:59.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:16:59.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:16:59.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:16:59.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:16:59.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:16:59.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-28T16:16:59.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:16:59.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-28T16:16:59.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:16:59.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:16:59.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:16:59.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:17:02.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:17:02.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:17:02.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:17:02.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:17:02.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:17:02.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:17:02.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:17:02.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:17:02.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:17:02.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:17:02.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:17:02.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:17:02.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:17:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:17:02.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:17:02.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:17:02.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:17:02.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:17:02.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:17:02.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:17:02.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:17:02.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:17:02.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:17:02.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:17:02.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:16:35
2026-05-28T16:17:02.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69435, datetime.datetime(2026, 5, 28, 16, 16, 35), datetime.datetime(2026, 5, 28, 16, 16, 34), 'salt', 15.1, 30.61, None, 6.78, 186.68, 17.16, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:17:02.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:17:02.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:17:02.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:16:34, diff=28.704197s, valid=True
2026-05-28T16:17:02.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:17:02.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:17:02.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:17:12, diff=-9.292594s, valid=True
2026-05-28T16:17:02.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:17:02.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:16:34, diff=28.715129s, valid=True
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:17:02.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:17:02.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:17:12, diff=-9.281475s, valid=True
2026-05-28T16:17:02.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:17:02.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:17:02.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:17:02.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910464.719267s, valid=True
2026-05-28T16:17:02.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:17:02.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:17:02.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:17:02.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:17:02.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:17:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:17:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:17:02.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:17:02.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:17:02.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:17:02.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:17:02.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:17:03.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:17:03.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:17:03.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:17:03.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:17:03.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:17:03.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:17:03.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:17:03.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:17:03.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:17:03.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:17:33.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:17:33.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:17:33.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:17:34.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:17:34.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:17:34.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:17:34.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-28T16:17:34.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:17:34.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-28T16:17:34.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:17:34.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:17:34.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:17:34.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-28T16:17:37.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-28T16:17:37.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:17:37.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:17:37.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:17:37.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:17:37.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:17:37.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:17:37.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:17:37.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:17:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:17:37.355 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:17:37.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:17:37.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:17:37.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:17:37.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:17:37.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:17:37.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:17:37.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:17:37.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:17:37.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:17:37.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:17:37.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:17:37.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:17:37.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:17:37.662 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:17:35
2026-05-28T16:17:37.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69437, datetime.datetime(2026, 5, 28, 16, 17, 35), datetime.datetime(2026, 5, 28, 16, 17, 35), 'salt', 15.07, 29.82, None, 4.55, 174.33, 17.52, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:17:37.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:17:37.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:17:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:17:35, diff=2.668812s, valid=True
2026-05-28T16:17:37.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:17:37.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:17:37.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:12, diff=-34.328389s, valid=True
2026-05-28T16:17:37.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:17:37.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:17:34, diff=3.678095s, valid=True
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:17:37.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:17:37.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:12, diff=-34.318913s, valid=True
2026-05-28T16:17:37.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:17:37.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:17:37.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:17:37.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910499.681736s, valid=True
2026-05-28T16:17:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:17:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:17:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:17:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:17:37.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:17:37.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:17:37.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:17:37.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:17:37.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:17:37.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:17:37.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:17:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:17:37.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:17:38.000 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:17:38.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:17:38.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:17:38.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:17:38.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:17: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-28T16:17:38.666 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:17:38.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:17:38.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:18:08.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:18:08.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:18:08.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:18:09.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:18:09.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:18:09.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:18:09.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-28T16:18:09.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:18:09.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-28T16:18:09.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:18:09.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:18:09.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:18:09.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-28T16:18:12.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-28T16:18:12.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:18:12.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:18:12.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:18:12.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:18:12.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:18:12.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:18:12.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:18:12.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:18:12.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:18:12.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:18:12.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:18:12.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:18:12.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:18:12.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:18:12.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:18:12.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:18:12.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:18:12.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:18:12.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:18:12.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:18:12.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:18:12.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:18:12.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:18:12.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:18:05
2026-05-28T16:18:12.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69438, datetime.datetime(2026, 5, 28, 16, 18, 5), datetime.datetime(2026, 5, 28, 16, 18, 5), 'salt', 14.97, 28.99, None, 3.85, 169.83, 17.88, 829.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:18:12.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:18:12.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:18:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:05, diff=7.383546s, valid=True
2026-05-28T16:18:12.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:18:12.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:18:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:12, diff=0.387035s, valid=True
2026-05-28T16:18:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:18:12.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:18:12.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:04, diff=8.393716s, valid=True
2026-05-28T16:18:12.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:18:12.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:18:12.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:18:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:18:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:18:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:18:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:12, diff=0.397352s, valid=True
2026-05-28T16:18:12.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:18:12.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:18:12.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:18:12.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910534.398021s, valid=True
2026-05-28T16:18:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:18:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:18:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:18:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:18:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:18:12.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:18:12.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:18:12.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:18:12.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:18:12.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:18:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:18:12.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:18:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:18:12.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:18:12.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:18:13.387 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:18:13.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:18:13.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:18:13.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-28T16:18:13.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-28T16:18:13.566 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:18:13.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:18:43.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:18:43.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:18:43.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:18:43.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:18:43.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:18:44.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:18:44.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-28T16:18:44.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:18:44.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-28T16:18:44.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:18:44.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:18:44.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:18:44.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-28T16:18:46.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-28T16:18:46.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:18:46.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:18:46.559 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:18:46.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:18:46.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:18:46.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:18:46.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:18:46.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:18:46.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:18:46.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:18:46.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:18:46.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:18:46.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:18:46.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:18:46.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:18:46.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:18:46.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:18:46.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:18:46.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:18:46.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:18:46.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:18:46.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:18:46.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:18:46.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:18:35
2026-05-28T16:18:46.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69439, datetime.datetime(2026, 5, 28, 16, 18, 35), datetime.datetime(2026, 5, 28, 16, 18, 35), 'salt', 15.2, 29.98, None, 1.41, 188.16, 17.46, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:18:46.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:18:46.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:18:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:35, diff=11.905742s, valid=True
2026-05-28T16:18:46.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:18:46.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:18:46.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:12, diff=-25.09141s, valid=True
2026-05-28T16:18:46.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:18:46.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:18:34, diff=12.916577s, valid=True
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:18:46.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:18:46.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:18:46.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:12, diff=-25.080335s, valid=True
2026-05-28T16:18:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:18:46.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:18:46.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:18:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910568.920332s, valid=True
2026-05-28T16:18:46.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:18:46.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:18:46.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:18:46.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:18:46.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:18:46.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:18:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:18:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:18:47.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:18:47.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:18:47.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:18:47.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:18:47.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:18:47.260 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:18:47.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:18:47.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:18:47.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:18:47.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:18:47.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-28T16:18:47.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-28T16:18:48.221 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:18:48.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:19:18.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:19:18.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:19:18.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:19:18.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:19:18.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:19:18.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:19:18.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-28T16:19:18.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:19:18.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-28T16:19:18.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:19:18.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:19:18.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:19:18.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-28T16:19:21.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:19:21.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:19:21.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:19:21.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:19:21.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:19:21.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:19:21.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:19:21.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:19:21.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:19:21.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:19:21.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:19:21.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:19:21.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:19:21.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:19:21.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:19:21.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:19:21.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:19:21.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:19:21.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:19:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:19:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:19:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:19:21.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:19:21.274 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:19:21.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:19:06
2026-05-28T16:19:21.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69440, datetime.datetime(2026, 5, 28, 16, 19, 6), datetime.datetime(2026, 5, 28, 16, 19, 5), 'salt', 15.27, 30.28, None, 3.28, 138.14, 17.33, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:19:21.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:19:21.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:19:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:05, diff=16.338184s, valid=True
2026-05-28T16:19:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:19:21.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:19:21.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:12, diff=9.341106s, valid=True
2026-05-28T16:19:21.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:19:21.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:19:21.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:04, diff=17.347791s, valid=True
2026-05-28T16:19:21.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:19:21.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:19:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:19:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:19:21.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:19:21.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:19:21.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:12, diff=9.350802s, valid=True
2026-05-28T16:19:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:19:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:19:21.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:19:21.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910603.351459s, valid=True
2026-05-28T16:19:21.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:19:21.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:19:21.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:19:21.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:19:21.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:19:21.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:19:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:19:21.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:19:21.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:19:21.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:19:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:19:21.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:19:21.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:19:21.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:19:21.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:19:22.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:19:22.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:19:22.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:19:22.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-28T16:19:22.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-28T16:19:22.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:19:22.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:19:52.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:19:52.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:19:52.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:19:52.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:19:52.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:19:53.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:19:53.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-28T16:19:53.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:19:53.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-28T16:19:53.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:19:53.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:19:53.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:19: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-28T16:19:55.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-28T16:19:55.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:19:55.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:19:55.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:19:55.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:19:55.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:19:55.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:19:55.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:19:55.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:19:55.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:19:55.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:19:55.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:19:55.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:19:55.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:19:55.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:19:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:19:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:19:55.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:19:55.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:19:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:19:55.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:19:55.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:19:55.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:19:55.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:19:55.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:19:36
2026-05-28T16:19:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69441, datetime.datetime(2026, 5, 28, 16, 19, 36), datetime.datetime(2026, 5, 28, 16, 19, 35), 'salt', 15.1, 30.02, None, 4.98, 150.8, 17.43, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:19:55.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:19:55.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:19:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:35, diff=20.889357s, valid=True
2026-05-28T16:19:55.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:19:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:19:55.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:12, diff=-16.107802s, valid=True
2026-05-28T16:19:55.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:19:55.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:19:55.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:19:35, diff=20.898733s, valid=True
2026-05-28T16:19:55.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:19:55.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:19:55.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:19:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:19:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:19:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:19:55.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:12, diff=-16.09822s, valid=True
2026-05-28T16:19:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:19:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:19:55.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:19:55.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910637.902435s, valid=True
2026-05-28T16:19:55.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:19:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:19:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:19:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:19:55.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:19:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:19:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:19:55.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:19:55.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:19:56.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:19:56.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:19:56.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:19:56.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:19:56.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:19:56.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:19:56.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:19:56.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:19:56.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:19:56.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-28T16:19:56.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-28T16:19:56.963 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:19:56.963 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:20:26.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:20:26.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:20:26.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:20:27.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:20:27.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:20:27.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:20:27.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-28T16:20:27.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:20:27.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-28T16:20:27.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:20:27.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:20:27.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:20:27.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:20:29.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:20:29.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:20:29.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:20:29.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:20:29.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:20:29.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:20:29.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:20:29.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:20:29.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:20:29.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:20:29.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:20:29.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:20:29.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:20:30.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:20:30.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:20:30.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:20:30.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:20:30.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:20:30.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:20:30.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:20:30.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:20:30.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:20:30.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:20:30.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:20:30.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:20:06
2026-05-28T16:20:30.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69442, datetime.datetime(2026, 5, 28, 16, 20, 6), datetime.datetime(2026, 5, 28, 16, 20, 6), 'salt', 15.17, 30.61, None, 5.65, 156.99, 17.17, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:20:30.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:20:30.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:20:30.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:06, diff=24.293935s, valid=True
2026-05-28T16:20:30.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:20:30.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:20:30.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:12, diff=18.296864s, valid=True
2026-05-28T16:20:30.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:20:30.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:05, diff=25.303523s, valid=True
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:20:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:20:30.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:20:30.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:12, diff=18.306616s, valid=True
2026-05-28T16:20:30.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:20:30.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:20:30.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:20:30.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910672.307284s, valid=True
2026-05-28T16:20:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:20:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:20:30.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:20:30.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:20:30.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:20:30.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:20:30.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:20:30.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:20:30.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:20:30.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:20:30.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:20:30.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:20:30.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:20:30.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:20:30.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:20:31.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:20:31.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:20:31.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:20:31.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-28T16:20:31.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-28T16:20:31.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:20:31.531 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:21:01.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:21:01.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:21:01.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:21:02.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:21:02.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:21:02.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:21:02.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-28T16:21:02.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:21:02.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-28T16:21:02.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:21:02.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:21:02.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:21:02.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-28T16:21:04.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-28T16:21:04.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:21:04.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:21:04.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:21:04.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:21:04.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:21:04.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:21:04.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:21:04.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:21:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:21:04.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:21:04.735 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:21:04.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:21:04.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:21:04.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:21:04.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:21:04.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:21:04.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:21:04.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:21:04.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:21:04.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:21:04.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:21:04.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:21:04.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:21:05.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:20:36
2026-05-28T16:21:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69443, datetime.datetime(2026, 5, 28, 16, 20, 36), datetime.datetime(2026, 5, 28, 16, 20, 36), 'salt', 15.0, 29.95, None, 4.17, 151.83, 17.44, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:21:05.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:21:05.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:21:05.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:36, diff=29.051667s, valid=True
2026-05-28T16:21:05.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:21:05.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:21:05.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:21:12, diff=-6.945453s, valid=True
2026-05-28T16:21:05.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:21:05.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:20:36, diff=29.061321s, valid=True
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:21:05.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:21:05.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:21:12, diff=-6.935631s, valid=True
2026-05-28T16:21:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:21:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:21:05.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:21:05.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910707.065059s, valid=True
2026-05-28T16:21:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:21:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:21:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:21:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:21:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:21:05.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:21:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:21:05.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:21:05.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:21:05.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:21:05.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:21:05.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:21:05.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:21:05.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:21:05.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:21:05.946 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:21:06.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:21:06.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:21:06.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-28T16:21:06.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-28T16:21:06.294 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:21:06.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:21:36.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:21:36.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:21:36.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:21:36.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:21:36.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:21:37.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:21:37.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-28T16:21:37.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:21:37.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-28T16:21:37.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:21:37.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:21:37.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:21:37.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-28T16:21:39.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-28T16:21:39.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:21:39.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:21:39.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:21:39.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:21:39.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:21:39.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:21:39.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:21:39.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:21:39.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:21:39.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:21:39.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:21:39.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:21:39.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:21:39.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:21:39.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:21:39.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:21:39.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:21:39.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:21:39.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:21:39.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:21:39.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:21:39.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:21:39.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:21:40.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:21:39
2026-05-28T16:21:40.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69445, datetime.datetime(2026, 5, 28, 16, 21, 39), datetime.datetime(2026, 5, 28, 16, 21, 38), 'salt', 15.17, 29.88, None, 4.48, 215.56, 17.5, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:21:40.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:21:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:21:40.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:21:38, diff=2.070474s, valid=True
2026-05-28T16:21:40.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:21:40.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:21:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:12, diff=-31.926535s, valid=True
2026-05-28T16:21:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:21:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:21:40.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:21:38, diff=2.080747s, valid=True
2026-05-28T16:21:40.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:21:40.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:21:40.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:21:40.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:21:40.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:21:40.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:21:40.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:12, diff=-31.9161s, valid=True
2026-05-28T16:21:40.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:21:40.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:21:40.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:21:40.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910742.084563s, valid=True
2026-05-28T16:21:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:21:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:21:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:21:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:21:40.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:21:40.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:21:40.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:21:40.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:21:40.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:21:40.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:21:40.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:21:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:21:40.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:21:40.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:21:40.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:21:41.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:21:41.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:21:41.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:21:41.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-28T16:21:41.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-28T16:21:41.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:21:41.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:22:11.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:22:11.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:22:11.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:22:11.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:22:11.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:22:11.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:22:11.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-28T16:22:11.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:22:11.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-28T16:22:11.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:22:11.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:22:11.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:22:11.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-28T16:22:14.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-28T16:22:14.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:22:14.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:22:14.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:22:14.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:22:14.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:22:14.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:22:14.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:22:14.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:22:14.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:22:14.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:22:14.533 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:22:14.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:22:14.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:22:14.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:22:14.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:22:14.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:22:14.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:22:14.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:22:14.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:22:14.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:22:14.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:22:14.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:22:14.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:22:14.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:22:09
2026-05-28T16:22:14.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69446, datetime.datetime(2026, 5, 28, 16, 22, 9), datetime.datetime(2026, 5, 28, 16, 22, 9), 'salt', 15.27, 29.95, None, 3.46, 158.84, 17.48, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:22:14.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:22:14.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:22:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:09, diff=5.85917s, valid=True
2026-05-28T16:22:14.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:22:14.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:22:14.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:12, diff=2.861999s, valid=True
2026-05-28T16:22:14.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:22:14.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:06, diff=8.868607s, valid=True
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:22:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:22:14.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:22:14.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:12, diff=2.871552s, valid=True
2026-05-28T16:22:14.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:22:14.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:22:14.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:22:14.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910776.872212s, valid=True
2026-05-28T16:22:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:22:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:22:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:22:14.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:22:14.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:22:14.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:22:14.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:22:14.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:22:14.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:22:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:22:15.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:22:15.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:22:15.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:22:15.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:22:15.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:22:15.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:22:15.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:22:15.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:22:15.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-28T16:22:15.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-28T16:22:16.116 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:22:16.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:22:46.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:22:46.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:22:46.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:22:46.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:22:46.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:22:46.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:22:46.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-28T16:22:46.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:22:46.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:22:46.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:22:46.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:22:46.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:22:46.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-28T16:22:49.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-28T16:22:49.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:22:49.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:22:49.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:22:49.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:22:49.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:22:49.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:22:49.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:22:49.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:22:49.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:22:49.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:22:49.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:22:49.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:22:49.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:22:49.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:22:49.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:22:49.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:22:49.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:22:49.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:22:49.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:22:49.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:22:49.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:22:49.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:22:49.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:22:49.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:22:39
2026-05-28T16:22:49.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69447, datetime.datetime(2026, 5, 28, 16, 22, 39), datetime.datetime(2026, 5, 28, 16, 22, 39), 'salt', 15.24, 29.79, None, 1.59, 202.76, 17.56, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:22:49.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:22:49.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:22:49.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:39, diff=10.449571s, valid=True
2026-05-28T16:22:49.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:22:49.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:22:49.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:12, diff=-22.547629s, valid=True
2026-05-28T16:22:49.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:22:49.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:22:49.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:22:36, diff=13.45895s, valid=True
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:22:49.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:22:49.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:12, diff=-22.538037s, valid=True
2026-05-28T16:22:49.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:22:49.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:22:49.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:22:49.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910811.462608s, valid=True
2026-05-28T16:22:49.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:22:49.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:22:49.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:22:49.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:22:49.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:22:49.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:22:49.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:22:49.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:22:49.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:22:49.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:22:49.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:22:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:22:49.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:22:49.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:22:50.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:22:50.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:22:50.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:22:50.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:22:50.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-28T16:22:50.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-28T16:22:50.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:22:50.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:23:20.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:23:20.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:23:20.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:23:20.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:23:20.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:23:21.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:23:21.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-28T16:23:21.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:23:21.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-28T16:23:21.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:23:21.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:23:21.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:23:21.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-28T16:23:23.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-28T16:23:23.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:23:23.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:23:23.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:23:23.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:23:23.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:23:23.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:23:23.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:23:23.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:23:23.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:23:23.497 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:23:23.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:23:23.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:23:23.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:23:23.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:23:23.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:23:23.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:23:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:23:23.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:23:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:23:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:23:23.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:23:23.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:23:23.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:23:23.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:23:09
2026-05-28T16:23:23.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69448, datetime.datetime(2026, 5, 28, 16, 23, 9), datetime.datetime(2026, 5, 28, 16, 23, 8), 'salt', 15.4, 28.86, None, 1.41, 262.53, 18.0, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:23:23.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:23:23.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:23:23.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:08, diff=15.824411s, valid=True
2026-05-28T16:23:23.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:23:23.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:23:23.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:12, diff=11.827235s, valid=True
2026-05-28T16:23:23.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:23:23.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:23:23.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:06, diff=17.833966s, valid=True
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:23:23.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:23:23.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:12, diff=11.83694s, valid=True
2026-05-28T16:23:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:23:23.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:23:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:23:23.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910845.837609s, valid=True
2026-05-28T16:23:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:23:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:23:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:23:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:23:23.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:23:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:23:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:23:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:23:23.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:23:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:23:24.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:23:24.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:23:24.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:23:24.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:23:24.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:23:24.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:23:24.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:23:24.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:23:24.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-28T16:23:24.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-28T16:23:25.056 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:23:25.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:23:55.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:23:55.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:23:55.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:23:55.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:23:55.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:23:55.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:23:55.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-28T16:23:55.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:23:55.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-28T16:23:55.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:23:55.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:23:55.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:23:55.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-28T16:23:57.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-28T16:23:57.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:23:57.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:23:57.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:23:57.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:23:57.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:23:57.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:23:57.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:23:57.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:23:57.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:23:57.967 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:23:57.967 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:23:57.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:23:58.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:23:58.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:23:58.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:23:58.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:23:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:23:58.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:23:58.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:23:58.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:23:58.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:23:58.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:23:58.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:23:58.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:23:40
2026-05-28T16:23:58.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69449, datetime.datetime(2026, 5, 28, 16, 23, 40), datetime.datetime(2026, 5, 28, 16, 23, 39), 'salt', 15.37, 28.03, None, 3.74, 261.39, 18.39, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:23:58.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:23:58.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:23:58.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:39, diff=19.292011s, valid=True
2026-05-28T16:23:58.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:23:58.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:23:58.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:12, diff=-13.705145s, valid=True
2026-05-28T16:23:58.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:23:58.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:23:58.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:23:37, diff=21.301525s, valid=True
2026-05-28T16:23:58.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:23:58.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:23:58.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:23:58.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:23:58.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:23:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:23:58.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:12, diff=-13.693961s, valid=True
2026-05-28T16:23:58.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:23:58.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:23:58.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:23:58.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910880.307211s, valid=True
2026-05-28T16:23:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:23:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:23:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:23:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:23:58.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:23:58.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:23:58.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:23:58.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:23:58.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:23:58.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:23:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:23:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:23:58.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:23:58.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:23:58.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:23:59.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:23:59.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:23:59.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:23:59.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-28T16:23:59.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-28T16:23:59.394 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:23:59.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:24:29.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:24:29.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:24:29.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:24:29.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:24:29.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:24:29.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:24:29.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-28T16:24:29.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:24:29.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-28T16:24:29.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:24:29.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:24:29.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:24:29.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-28T16:24:32.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-28T16:24:32.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:24:32.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:24:32.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:24:32.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:24:32.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:24:32.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:24:32.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:24:32.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:24:32.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:24:32.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:24:32.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:24:32.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:24:32.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:24:32.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:24:32.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:24:32.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:24:32.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:24:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:24:32.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:24:32.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:24:32.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:24:32.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:24:32.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:24:32.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:24:10
2026-05-28T16:24:32.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69450, datetime.datetime(2026, 5, 28, 16, 24, 10), datetime.datetime(2026, 5, 28, 16, 24, 9), 'salt', 15.47, 29.09, None, 2.76, 251.73, 17.9, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:24:32.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:24:32.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:24:32.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:09, diff=23.528214s, valid=True
2026-05-28T16:24:32.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:24:32.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:24:32.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:12, diff=20.531135s, valid=True
2026-05-28T16:24:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:24:32.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:07, diff=25.538321s, valid=True
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:24:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:24:32.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:12, diff=20.541826s, valid=True
2026-05-28T16:24:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:24:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:24:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:24:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910914.542486s, valid=True
2026-05-28T16:24:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:24:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:24:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:24:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:24:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:24:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:24:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:24:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:24:32.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:24:32.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:24:32.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:24:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:24:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:24:32.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:24:33.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:24:33.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:24:33.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:24:33.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:24:33.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-28T16:24:33.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-28T16:24:33.820 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:24:33.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:25:03.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:25:03.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:25:03.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:25:03.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:25:03.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:25:04.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:25:04.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-28T16:25:04.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:25:04.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-28T16:25:04.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:25:04.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:25:04.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:25:04.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-28T16:25:06.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-28T16:25:06.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:25:06.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:25:06.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:25:06.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:25:06.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:25:06.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:25:06.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:25:06.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:25:06.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:25:06.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:25:06.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:25:06.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:25:06.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:25:06.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:25:06.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:25:06.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:25:07.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:25:07.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:25:07.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:25:07.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:25:07.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:25:07.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:25:07.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:25:07.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:24:40
2026-05-28T16:25:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69451, datetime.datetime(2026, 5, 28, 16, 24, 40), datetime.datetime(2026, 5, 28, 16, 24, 40), 'salt', 15.37, 29.12, None, 1.77, 157.2, 17.88, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:25:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:25:07.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:25:07.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:40, diff=27.122925s, valid=True
2026-05-28T16:25:07.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:25:07.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:25:07.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:25:12, diff=-4.874248s, valid=True
2026-05-28T16:25:07.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:25:07.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:24:37, diff=30.132399s, valid=True
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:25:07.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:25:07.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:25:12, diff=-4.864613s, valid=True
2026-05-28T16:25:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:25:07.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:25:07.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:25:07.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910949.136044s, valid=True
2026-05-28T16:25:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:25:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:25:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:25:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:25:07.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:25:07.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:25:07.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:25:07.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:25:07.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:25:07.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:25:07.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:25:07.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:25:07.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:25:07.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:25:07.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:25:08.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:25:08.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:25:08.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:25:08.142 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:25:08.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-28T16:25:08.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:25:08.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:25:38.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:25:38.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:25:38.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:25:39.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:25:39.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:25:39.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:25:39.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-28T16:25:39.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:25:39.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-28T16:25:39.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:25:39.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:25:39.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:25:39.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-28T16:25:41.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-28T16:25:41.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:25:41.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:25:41.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:25:41.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:25:41.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:25:41.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:25:41.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:25:41.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:25:41.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:25:41.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:25:41.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:25:41.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:25:41.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:25:41.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:25:41.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:25:42.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:25:42.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:25:42.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:25:42.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:25:42.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:25:42.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:25:42.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:25:42.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:25:42.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:25:41
2026-05-28T16:25:42.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69453, datetime.datetime(2026, 5, 28, 16, 25, 41), datetime.datetime(2026, 5, 28, 16, 25, 40), 'salt', 15.5, 28.26, None, 4.03, 155.81, 18.3, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:25:42.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:25:42.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:25:42.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:25:40, diff=2.153095s, valid=True
2026-05-28T16:25:42.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:25:42.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:25:42.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:12, diff=-29.844064s, valid=True
2026-05-28T16:25:42.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:25:42.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:25:42.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:25:40, diff=2.163917s, valid=True
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:25:42.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:25:42.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:12, diff=-29.833013s, valid=True
2026-05-28T16:25:42.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:25:42.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:25:42.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:25:42.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=910984.167656s, valid=True
2026-05-28T16:25:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:25:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:25:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:25:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:25:42.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:25:42.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:25:42.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:25:42.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:25:42.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:25:42.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:25:42.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:25:42.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:25:42.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:25:42.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:25:42.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:25:43.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:25:43.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:25:43.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:25:43.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-28T16:25:43.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-28T16:25:43.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:25:43.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:26:13.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:26:13.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:26:13.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:26:13.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:26:13.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:26:14.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:26:14.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-28T16:26:14.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:26:14.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-28T16:26:14.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:26:14.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:26:14.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:26:14.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-28T16:26:17.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-28T16:26:17.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:26:17.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:26:17.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:26:17.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:26:17.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:26:17.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:26:17.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:26:17.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:26:17.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:26:17.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:26:17.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:26:17.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:26:17.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:26:17.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:26:17.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:26:17.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:26:17.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:26:17.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:26:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:26:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:26:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:26:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:26:17.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:26:17.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:26:11
2026-05-28T16:26:17.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69454, datetime.datetime(2026, 5, 28, 16, 26, 11), datetime.datetime(2026, 5, 28, 16, 26, 11), 'salt', 15.53, 28.96, None, 5.01, 157.31, 17.97, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:26:17.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:26:17.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:26:17.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:11, diff=6.539505s, valid=True
2026-05-28T16:26:17.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:26:17.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:26:17.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:12, diff=5.54232s, valid=True
2026-05-28T16:26:17.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:26:17.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:26:17.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:08, diff=9.548954s, valid=True
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:26:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:26:17.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:12, diff=5.551979s, valid=True
2026-05-28T16:26:17.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:26:17.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:26:17.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:26:17.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911019.552648s, valid=True
2026-05-28T16:26:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:26:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:26:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:26:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:26:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:26:17.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:26:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:26:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:26:17.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:26:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:26:17.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:26:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:26:17.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:26:17.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:26:18.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:26:18.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:26:18.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:26:18.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:26:18.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-28T16:26:18.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-28T16:26:18.862 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:26:18.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:26:48.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:26:48.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:26:48.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:26:49.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:26:49.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:26:49.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:26:49.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-28T16:26:49.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:26:49.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-28T16:26:49.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:26:49.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:26:49.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:26:49.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-28T16:26:51.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-28T16:26:51.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:26:51.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:26:51.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:26:51.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:26:51.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:26:51.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:26:51.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:26:51.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:26:51.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:26:51.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:26:51.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:26:51.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:26:51.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:26:51.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:26:51.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:26:51.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:26:51.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:26:51.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:26:52.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:26:52.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:26:52.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:26:52.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:26:52.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:26:52.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:26:41
2026-05-28T16:26:52.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69455, datetime.datetime(2026, 5, 28, 16, 26, 41), datetime.datetime(2026, 5, 28, 16, 26, 41), 'salt', 15.44, 28.96, None, 4.34, 168.28, 17.97, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:26:52.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:26:52.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:26:52.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:41, diff=11.092105s, valid=True
2026-05-28T16:26:52.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:26:52.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:26:52.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:12, diff=-19.905043s, valid=True
2026-05-28T16:26:52.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:26:52.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:26:38, diff=14.10154s, valid=True
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:26:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:26:52.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:26:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:12, diff=-19.895447s, valid=True
2026-05-28T16:26:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:26:52.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:26:52.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:26:52.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911054.105222s, valid=True
2026-05-28T16:26:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:26:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:26:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:26:52.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:26:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:26:52.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:26:52.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:26:52.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:26:52.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:26:52.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:26:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:26:52.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:26:52.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:26:52.428 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:26:52.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:26:53.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:26:53.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:26:53.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:26:53.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-28T16:26:53.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-28T16:26:53.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:26:53.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:27:23.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:27:23.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:27:23.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:27:23.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:27:23.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:27:23.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:27:23.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-28T16:27:23.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:27:23.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-28T16:27:23.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:27:23.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:27:23.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:27:23.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:27:26.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:27:26.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:27:26.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:27:26.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:27:26.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:27:26.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:27:26.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:27:26.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:27:26.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:27:26.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:27:26.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:27:26.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:27:26.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:27:26.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:27:26.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:27:26.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:27:26.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:27:26.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:27:26.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:27:26.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:27:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:27:26.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:27:26.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:27:26.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:27:26.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:27:11
2026-05-28T16:27:26.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69456, datetime.datetime(2026, 5, 28, 16, 27, 11), datetime.datetime(2026, 5, 28, 16, 27, 11), 'salt', 15.37, 30.18, None, 5.26, 151.5, 17.39, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:27:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:27:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:27:26.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:11, diff=15.710038s, valid=True
2026-05-28T16:27:26.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:27:26.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:27:26.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:12, diff=14.713741s, valid=True
2026-05-28T16:27:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:27:26.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:27:26.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:08, diff=18.720879s, valid=True
2026-05-28T16:27:26.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:27:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:27:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:27:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:27:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:27:26.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:27:26.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:12, diff=14.723956s, valid=True
2026-05-28T16:27:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:27:26.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:27:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:27:26.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911088.724609s, valid=True
2026-05-28T16:27:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:27:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:27:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:27:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:27:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:27:26.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:27:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:27:26.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:27:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:27:26.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:27:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:27:26.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:27:27.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:27:27.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:27:27.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:27:27.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:27:27.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:27:27.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:27:27.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-28T16:27:27.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-28T16:27:27.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:27:27.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:27:58.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:27:58.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:27:58.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:27:58.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:27:58.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:27:58.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:27:58.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-28T16:27:58.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:27:58.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-28T16:27:58.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:27:58.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:27:58.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:27:58.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:28:00.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-28T16:28:00.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:28:00.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:28:00.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:28:00.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:28:00.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:28:00.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:28:00.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:28:00.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:28:00.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:28:00.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:28:00.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:28:00.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:28:01.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:28:01.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:28:01.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:28:01.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:28:01.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:28:01.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:28:01.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:28:01.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:28:01.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:28:01.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:28:01.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:28:01.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:27:42
2026-05-28T16:28:01.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69457, datetime.datetime(2026, 5, 28, 16, 27, 42), datetime.datetime(2026, 5, 28, 16, 27, 41), 'salt', 15.37, 31.24, None, 4.38, 175.36, 16.92, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:28:01.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:28:01.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:28:01.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:41, diff=20.308936s, valid=True
2026-05-28T16:28:01.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:28:01.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:28:01.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:12, diff=-10.688137s, valid=True
2026-05-28T16:28:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:28:01.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:27:39, diff=22.318611s, valid=True
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:28:01.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:28:01.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:28:01.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:12, diff=-10.678295s, valid=True
2026-05-28T16:28:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:28:01.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:28:01.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:28:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911123.322363s, valid=True
2026-05-28T16:28:01.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:28:01.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:28:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:28:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:28:01.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:28:01.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:28:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:28:01.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:28:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:28:01.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:28:01.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:28:01.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:28:01.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:28:01.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:28:01.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:28:02.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:28:02.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:28:02.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:28:02.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-28T16:28:02.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-28T16:28:02.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:28:02.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:28:32.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:28:32.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:28:32.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:28:32.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:28:32.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:28:32.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:28:32.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-28T16:28:32.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:28:32.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-28T16:28:32.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:28:32.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:28:32.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:28:32.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-28T16:28:35.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-28T16:28:35.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:28:35.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:28:35.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:28:35.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:28:35.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:28:35.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:28:35.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:28:35.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:28:35.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:28:35.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:28:35.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:28:35.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:28:35.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:28:35.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:28:35.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:28:35.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:28:35.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:28:35.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:28:35.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:28:35.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:28:35.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:28:35.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:28:35.593 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:28:35.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:28:12
2026-05-28T16:28:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69458, datetime.datetime(2026, 5, 28, 16, 28, 12), datetime.datetime(2026, 5, 28, 16, 28, 11), 'salt', 15.2, 28.69, None, 5.23, 184.5, 18.05, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:28:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:28:35.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:28:35.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:11, diff=24.65561s, valid=True
2026-05-28T16:28:35.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:28:35.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:28:35.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:12, diff=23.658477s, valid=True
2026-05-28T16:28:35.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:28:35.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:09, diff=26.665085s, valid=True
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:28:35.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:28:35.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:12, diff=23.668043s, valid=True
2026-05-28T16:28:35.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:28:35.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:28:35.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:28:35.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911157.668701s, valid=True
2026-05-28T16:28:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:28:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:28:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:28:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:28:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:28:35.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:28:35.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:28:35.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:28:35.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:28:35.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:28:35.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:28:35.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:28:36.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:28:36.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:28:36.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:28:36.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:28:36.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:28:36.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:28:36.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-28T16:28:36.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-28T16:28:36.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:28:36.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:29:06.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:29:06.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:29:06.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:29:06.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:29:06.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:29:07.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:29:07.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-28T16:29:07.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:29:07.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-28T16:29:07.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:29:07.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:29:07.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:29:07.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:29:09.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-28T16:29:09.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:29:09.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:29:09.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:29:09.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:29:09.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:29:09.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:29:09.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:29:09.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:29:09.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:29:09.567 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:29:09.567 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:29:09.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:29:09.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:29:09.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:29:09.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:29:09.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:29:09.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:29:09.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:29:09.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:29:09.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:29:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:29:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:29:09.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:29:09.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:28:42
2026-05-28T16:29:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69459, datetime.datetime(2026, 5, 28, 16, 28, 42), datetime.datetime(2026, 5, 28, 16, 28, 42), 'salt', 15.27, 29.92, None, 6.81, 147.51, 17.5, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:29:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:29:09.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:29:09.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:42, diff=27.8824s, valid=True
2026-05-28T16:29:09.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:29:09.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:29:09.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:29:12, diff=-2.114547s, valid=True
2026-05-28T16:29:09.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:29:09.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:29:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:28:39, diff=30.893747s, valid=True
2026-05-28T16:29:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:29:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:29:09.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:29:09.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:29:09.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:29:09.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:29:09.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:29:12, diff=-2.103101s, valid=True
2026-05-28T16:29:09.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:29:09.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:29:09.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:29:09.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911191.897561s, valid=True
2026-05-28T16:29:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:29:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:29:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:29:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:29:09.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:29:09.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:29:09.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:29:09.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:29:09.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:29:10.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:29:10.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:29:10.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:29:10.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:29:10.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:29:10.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:29:10.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:29:10.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:29:10.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:29:10.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-28T16:29:10.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-28T16:29:11.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:29:11.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:29:41.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:29:41.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:29:41.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:29:41.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:29:41.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:29:41.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:29:41.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-28T16:29:41.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:29:41.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:29:41.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:29:41.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:29:41.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:29:41.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:29:44.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:29:44.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:29:44.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:29:44.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:29:44.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:29:44.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:29:44.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:29:44.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:29:44.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:29:44.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:29:44.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:29:44.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:29:44.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:29:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:29:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:29:44.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:29:44.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:29:44.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:29:44.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:29:44.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:29:44.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:29:44.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:29:44.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:29:44.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:29:44.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:29:43
2026-05-28T16:29:44.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69461, datetime.datetime(2026, 5, 28, 16, 29, 43), datetime.datetime(2026, 5, 28, 16, 29, 42), 'salt', 15.3, 31.94, None, 4.27, 154.78, 16.61, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:29:44.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:29:44.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:29:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:29:42, diff=2.809843s, valid=True
2026-05-28T16:29:44.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:29:44.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:29:44.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=-27.187323s, valid=True
2026-05-28T16:29:44.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:29:44.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:29:41, diff=3.819216s, valid=True
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:29:44.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:29:44.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=-27.177805s, valid=True
2026-05-28T16:29:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:29:44.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:29:44.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:29:44.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911226.822851s, valid=True
2026-05-28T16:29:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:29:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:29:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:29:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:29:44.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:29:44.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:29:44.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:29:44.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:29:44.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:29:44.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:29:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:29:45.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:29:45.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:29:45.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:29:45.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:29:45.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:29:45.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:29:45.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:29:45.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-28T16:29:45.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-28T16:29:45.976 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:29:45.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:30:16.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:30:16.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:30:16.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:30:16.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:30:16.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:30:16.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:30:16.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-28T16:30:16.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:30:16.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-28T16:30:16.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:30:16.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:30:16.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:30:16.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-28T16:30:18.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:30:18.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:30:18.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:30:18.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:30:18.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:30:18.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:30:18.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:30:18.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:30:18.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:30:18.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:30:18.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:30:18.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:30:18.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:30:19.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:30:19.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:30:19.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:30:19.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:30:19.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:30:19.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:30:19.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T16:30:19.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:30:19.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:30:19.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:30:19.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:30:19.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:30:13
2026-05-28T16:30:19.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69462, datetime.datetime(2026, 5, 28, 16, 30, 13), datetime.datetime(2026, 5, 28, 16, 30, 12), 'salt', 15.27, 29.49, None, 5.01, 153.61, 17.69, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:30:19.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:30:19.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:30:19.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=7.267417s, valid=True
2026-05-28T16:30:19.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:30:19.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:30:19.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=7.27023s, valid=True
2026-05-28T16:30:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:30:19.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:30:19.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=7.276861s, valid=True
2026-05-28T16:30:19.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:30:19.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:30:19.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:30:19.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:30:19.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:30:19.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T16:30:19.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:12, diff=7.279848s, valid=True
2026-05-28T16:30:19.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:30:19.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:30:19.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:30:19.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911261.280496s, valid=True
2026-05-28T16:30:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:30:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:30:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:30:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:30:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:30:19.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:30:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:30:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:30:19.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:30:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:30:19.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:30:19.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:30:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:30:19.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:30:19.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:30:20.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:30:20.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:30:20.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:30:20.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-28T16:30:20.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-28T16:30:20.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:30:20.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:30:50.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:30:50.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:30:50.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:30:51.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:30:51.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:30:51.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:30:51.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-28T16:30:51.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:30:51.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:30:51.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:30:51.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:30:51.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:30:51.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-28T16:30:55.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-28T16:30:55.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:30:55.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:30:55.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:30:55.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:30:55.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:30:55.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:30:55.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:30:55.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:30:55.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:30:55.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:30:55.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:30:55.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:30:55.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:30:55.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:30:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:30:55.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:30:55.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:30:55.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:30:55.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:30:55.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:30:55.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:30:55.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:30:55.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:30:55.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:30:43
2026-05-28T16:30:55.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69463, datetime.datetime(2026, 5, 28, 16, 30, 43), datetime.datetime(2026, 5, 28, 16, 30, 43), 'salt', 14.91, 30.78, None, 5.54, 170.3, 17.07, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:30:55.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:30:55.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:30:55.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:43, diff=12.490023s, valid=True
2026-05-28T16:30:55.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:30:55.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:30:55.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:12, diff=-16.507162s, valid=True
2026-05-28T16:30:55.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:30:55.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:30:40, diff=15.499526s, valid=True
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:30:55.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:30:55.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:12, diff=-16.497497s, valid=True
2026-05-28T16:30:55.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:30:55.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:30:55.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:30:55.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911297.503161s, valid=True
2026-05-28T16:30:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:30:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:30:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:30:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:30:55.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:30:55.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:30:55.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:30:55.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:30:55.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:30:55.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:30:55.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:30:55.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:30:55.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:30:55.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:30:56.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:30:56.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:30:56.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:30:56.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:30:56.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-28T16:30:56.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-28T16:30:56.683 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:30:56.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:31:26.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:31:26.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:31:26.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:31:26.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:31:26.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:31:27.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:31:27.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-28T16:31:27.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:31:27.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-28T16:31:27.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:31:27.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:31:27.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:31:27.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-28T16:31:29.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:31:29.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:31:29.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:31:29.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:31:29.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:31:29.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:31:29.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:31:29.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:31:29.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:31:29.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:31:29.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:31:29.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:31:29.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:31:30.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:31:30.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:31:30.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:31:30.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:31:30.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:31:30.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:31:30.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T16:31:30.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:31:30.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:31:30.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:31:30.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:31:30.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:31:13
2026-05-28T16:31:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69464, datetime.datetime(2026, 5, 28, 16, 31, 13), datetime.datetime(2026, 5, 28, 16, 31, 13), 'salt', 15.2, 29.35, None, 6.74, 143.55, 17.74, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:31:30.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:31:30.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:31:30.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:13, diff=17.334734s, valid=True
2026-05-28T16:31:30.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:31:30.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:31:30.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:12, diff=18.33788s, valid=True
2026-05-28T16:31:30.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:31:30.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:10, diff=20.345167s, valid=True
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:31:30.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T16:31:30.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:12, diff=18.348487s, valid=True
2026-05-28T16:31:30.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:31:30.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:31:30.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:31:30.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911332.349239s, valid=True
2026-05-28T16:31:30.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:31:30.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:31:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:31:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:31:30.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:31:30.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:31:30.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:31:30.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:31:30.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:31:30.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:31:30.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:31:30.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:31:30.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:31:30.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:31:30.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:31:31.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:31:31.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:31:31.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:31:31.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-28T16:31:31.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-28T16:31:31.654 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:31:31.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:32:01.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:32:01.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:32:01.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:32:02.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:32:02.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:32:02.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:32:02.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-28T16:32:02.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:32:02.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-28T16:32:02.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:32:02.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:32:02.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:32:02.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-28T16:32:05.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-28T16:32:05.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:32:05.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:32:05.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:32:05.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:32:05.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:32:05.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:32:05.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:32:05.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:32:05.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:32:05.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:32:05.036 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:32:05.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:32:05.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:32:05.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:32:05.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:32:05.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:32:05.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:32:05.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:32:05.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:32:05.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:32:05.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:32:05.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:32:05.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:32:05.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:31:44
2026-05-28T16:32:05.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69465, datetime.datetime(2026, 5, 28, 16, 31, 44), datetime.datetime(2026, 5, 28, 16, 31, 43), 'salt', 15.1, 29.82, None, 5.3, 139.97, 17.52, 829.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:32:05.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:32:05.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:32:05.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:43, diff=22.35139s, valid=True
2026-05-28T16:32:05.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:32:05.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:32:05.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:12, diff=-6.645667s, valid=True
2026-05-28T16:32:05.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:32:05.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:31:41, diff=24.361032s, valid=True
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:32:05.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:32:05.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:12, diff=-6.635894s, valid=True
2026-05-28T16:32:05.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:32:05.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:32:05.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:32:05.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911367.364793s, valid=True
2026-05-28T16:32:05.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:32:05.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:32:05.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:32:05.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:32:05.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:32:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:32:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:32:05.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:32:05.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:32:05.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:32:05.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:32:05.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:32:05.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:32:05.686 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:32:05.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:32:06.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:32:06.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:32:06.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:32:06.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-28T16:32:06.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-28T16:32:06.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:32:06.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:32:36.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:32:36.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:32:36.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:32:37.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:32:37.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:32:37.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:32:37.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-28T16:32:37.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:32:37.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-28T16:32:37.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:32:37.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:32:37.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:32: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-28T16:32:39.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-28T16:32:39.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:32:39.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:32:39.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:32:39.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:32:39.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:32:39.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:32:39.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:32:39.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:32:39.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:32:39.819 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:32:39.819 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:32:39.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:32:39.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:32:39.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:32:40.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:32:40.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:32:40.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:32:40.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:32:40.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T16:32:40.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:32:40.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:32:40.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:32:40.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:32:40.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:32:14
2026-05-28T16:32:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69466, datetime.datetime(2026, 5, 28, 16, 32, 14), datetime.datetime(2026, 5, 28, 16, 32, 13), 'salt', 14.97, 29.92, None, 5.68, 159.28, 17.46, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:32:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:32:40.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:32:40.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:13, diff=27.168201s, valid=True
2026-05-28T16:32:40.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:32:40.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:32:40.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:12, diff=28.171167s, valid=True
2026-05-28T16:32:40.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:32:40.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:32:40.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:11, diff=29.177929s, valid=True
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:32:40.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T16:32:40.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:32:12, diff=28.181037s, valid=True
2026-05-28T16:32:40.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:32:40.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:32:40.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:32:40.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911402.181703s, valid=True
2026-05-28T16:32:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:32:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:32:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:32:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:32:40.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:32:40.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:32:40.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:32:40.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:32:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:32:40.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:32:40.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:32:40.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:32:40.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:32:40.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:32:40.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:32:41.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:32:41.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:32:41.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:32:41.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-28T16:32:41.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-28T16:32:41.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:32:41.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:33:11.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:33:11.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:33:11.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:33:11.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:33:11.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:33:12.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:33:12.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-28T16:33:12.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:33:12.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-28T16:33:12.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:33:12.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:33:12.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:33:12.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-28T16:33:14.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-28T16:33:14.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:33:14.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:33:14.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:33:14.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:33:14.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:33:14.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:33:14.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:33:14.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:33:14.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:33:14.460 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:33:14.460 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:33:14.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:33:14.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:33:14.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:33:14.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:33:14.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:33:14.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:33:14.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:33:14.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T16:33:14.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:33:14.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:33:14.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:33:14.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:33:14.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:33:14
2026-05-28T16:33:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69468, datetime.datetime(2026, 5, 28, 16, 33, 14), datetime.datetime(2026, 5, 28, 16, 33, 14), 'salt', 14.87, 30.12, None, 3.85, 175.15, 17.35, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:33:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:33:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:33:14.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:14, diff=0.792568s, valid=True
2026-05-28T16:33:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:33:14.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:33:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:12, diff=2.795372s, valid=True
2026-05-28T16:33:14.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:33:14.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:12, diff=2.802001s, valid=True
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:33:14.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T16:33:14.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:12, diff=2.805029s, valid=True
2026-05-28T16:33:14.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:33:14.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:33:14.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:33:14.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911436.805692s, valid=True
2026-05-28T16:33:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:33:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:33:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:33:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:33:14.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:33:14.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:33:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:33:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:33:14.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:33:14.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:33:15.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:33:15.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:33:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:33:15.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:33:15.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:33:15.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:33:15.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:33:15.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:33:15.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-28T16:33:15.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-28T16:33:15.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:33:15.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:33:46.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:33:46.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:33:46.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:33:46.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:33:46.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:33:46.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:33:46.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:33:46.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:33:46.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:33:46.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:33:46.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:33:46.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:33:46.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-28T16:33:48.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-28T16:33:48.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:33:48.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:33:48.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:33:48.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:33:48.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:33:48.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:33:48.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:33:48.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:33:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:33:48.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:33:48.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:33:48.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:33:48.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:33:48.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:33:48.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:33:48.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:33:48.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:33:48.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:33:49.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:33:49.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:33:49.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:33:49.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:33:49.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:33:49.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:33:44
2026-05-28T16:33:49.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69469, datetime.datetime(2026, 5, 28, 16, 33, 44), datetime.datetime(2026, 5, 28, 16, 33, 44), 'salt', 14.84, 29.72, None, 4.31, 183.47, 17.53, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:33:49.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:33:49.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:33:49.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:44, diff=5.096646s, valid=True
2026-05-28T16:33:49.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:33:49.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:33:49.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:12, diff=-22.900462s, valid=True
2026-05-28T16:33:49.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:33:49.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:33:43, diff=6.106262s, valid=True
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:33:49.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:33:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:12, diff=-22.89072s, valid=True
2026-05-28T16:33:49.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:33:49.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:33:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:33:49.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911471.109938s, valid=True
2026-05-28T16:33:49.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:33:49.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:33:49.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:33:49.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:33:49.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:33:49.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:33:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:33:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:33:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:33:49.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:33:49.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:33:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:33:49.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:33:49.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:33:49.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:33:50.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:33:50.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:33:50.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:33:50.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-28T16:33:50.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-28T16:33:50.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:33:50.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:34:20.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:34:20.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:34:20.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:34:20.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:34:20.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:34:20.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:34:20.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-28T16:34:20.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:34:20.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-28T16:34:20.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:34:20.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:34:21.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:34:21.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-28T16:34:23.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-28T16:34:23.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:34:23.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:34:23.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:34:23.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:34:23.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:34:23.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:34:23.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:34:23.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:34:23.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:34:23.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:34:23.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:34:23.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:34:23.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:34:23.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:34:23.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:34:23.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:34:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:34:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:34:23.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:34:23.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:34:23.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:34:23.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:34:23.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:34:23.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:34:15
2026-05-28T16:34:23.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69470, datetime.datetime(2026, 5, 28, 16, 34, 15), datetime.datetime(2026, 5, 28, 16, 34, 14), 'salt', 14.91, 30.15, None, 6.07, 221.33, 17.35, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:34:23.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:34:23.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:34:23.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:14, diff=9.695089s, valid=True
2026-05-28T16:34:23.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:34:23.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:34:23.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:12, diff=11.69795s, valid=True
2026-05-28T16:34:23.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:34:23.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:14, diff=9.704559s, valid=True
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:34:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:34:23.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:34:23.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:12, diff=11.707561s, valid=True
2026-05-28T16:34:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:34:23.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:34:23.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:34:23.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911505.7083s, valid=True
2026-05-28T16:34:23.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:34:23.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:34:23.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:34:23.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:34:23.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:34:23.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:34:23.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:34:23.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:34:23.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:34:23.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:34:23.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:34:23.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:34:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:34:24.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:34:24.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:34:24.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:34:24.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:34:24.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:34:24.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-28T16:34:24.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-28T16:34:24.966 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:34:24.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:34:54.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:34:54.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:34:54.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:34:55.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:34:55.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:34:55.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:34:55.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-28T16:34:55.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:34:55.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-28T16:34:55.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:34:55.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:34:55.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:34:55.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:34:58.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-28T16:34:58.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:34:58.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:34:58.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:34:58.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:34:58.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:34:58.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:34:58.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:34:58.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:34:58.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:34:58.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:34:58.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:34:58.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:34:58.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:34:58.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:34:58.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:34:58.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:34:58.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:34:58.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:34:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:34:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:34:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:34:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:34:58.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:34:58.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:34:45
2026-05-28T16:34:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69471, datetime.datetime(2026, 5, 28, 16, 34, 45), datetime.datetime(2026, 5, 28, 16, 34, 44), 'salt', 15.0, 30.98, None, 5.72, 212.63, 16.99, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:34:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:34:58.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:34:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:44, diff=14.616226s, valid=True
2026-05-28T16:34:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:34:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:34:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:12, diff=-13.380951s, valid=True
2026-05-28T16:34:58.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:34:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:34:43, diff=15.625567s, valid=True
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:34:58.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:34:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:34:58.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:12, diff=-13.371489s, valid=True
2026-05-28T16:34:58.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:34:58.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:34:58.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:34:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911540.629156s, valid=True
2026-05-28T16:34:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:34:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:34:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:34:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:34:58.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:34:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:34:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:34:58.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:34:58.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:34:58.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:34:58.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:34:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:34:58.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:34:58.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:34:59.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:34:59.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:34:59.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:34:59.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:34:59.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-28T16:34:59.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-28T16:34:59.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:34:59.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:35:29.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:35:29.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:35: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-28T16:35:30.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:35:30.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:35:30.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:35:30.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-28T16:35:30.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:35:30.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-28T16:35:30.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:35:30.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:35:30.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:35:30.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-28T16:35:32.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:35:32.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:35:32.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:35:32.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:35:32.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:35:32.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:35:32.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:35:32.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:35:32.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:35:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:35:32.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:35:32.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:35:32.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:35:32.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:35:32.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:35:32.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:35:32.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:35:32.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:35:32.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:35:32.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:35:32.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:35:32.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:35:32.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:35:32.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:35:33.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:35:15
2026-05-28T16:35:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69472, datetime.datetime(2026, 5, 28, 16, 35, 15), datetime.datetime(2026, 5, 28, 16, 35, 15), 'salt', 14.97, 32.1, None, 3.92, 250.16, 16.5, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:35:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:35:33.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:35:33.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:15, diff=18.053633s, valid=True
2026-05-28T16:35:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:35:33.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:35:33.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:12, diff=21.056401s, valid=True
2026-05-28T16:35:33.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:35:33.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:13, diff=20.062983s, valid=True
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:35:33.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:35:33.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:12, diff=21.065977s, valid=True
2026-05-28T16:35:33.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:35:33.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:35:33.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:35:33.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911575.066628s, valid=True
2026-05-28T16:35:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:35:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:35:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:35:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:35:33.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:35:33.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:35:33.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:35:33.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:35:33.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:35:33.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:35:33.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:35:33.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:35:33.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:35:33.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:35:33.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:35:34.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:35:34.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:35:34.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:35: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-28T16:35: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-28T16:35:34.389 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:35:34.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:36:04.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:36:04.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:36:04.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:36:05.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:36:05.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:36:05.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:36:05.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-28T16:36:05.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:36:05.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-28T16:36:05.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:36:05.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:36:05.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:36:05.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-28T16:36:07.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-28T16:36:07.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:36:07.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:36:07.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:36:07.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:36:07.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:36:07.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:36:07.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:36:07.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:36:07.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:36:07.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:36:07.937 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:36:07.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:36:08.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:36:08.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:36:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:36:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:36:08.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:36:08.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:36:08.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:36:08.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:36:08.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:36:08.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:36:08.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:36:08.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:35:45
2026-05-28T16:36:08.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69473, datetime.datetime(2026, 5, 28, 16, 35, 45), datetime.datetime(2026, 5, 28, 16, 35, 45), 'salt', 15.14, 30.71, None, 6.04, 241.91, 17.13, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:36:08.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:36:08.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:36:08.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:45, diff=23.271855s, valid=True
2026-05-28T16:36:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:36:08.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:36:08.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:12, diff=-3.725266s, valid=True
2026-05-28T16:36:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:36:08.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:35:43, diff=25.281414s, valid=True
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:36:08.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:36:08.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:12, diff=-3.715521s, valid=True
2026-05-28T16:36:08.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:36:08.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:36:08.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:36:08.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911610.285143s, valid=True
2026-05-28T16:36:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:36:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:36:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:36:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:36:08.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:36:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:36:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:36:08.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:36:08.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:36:08.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:36:08.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:36:08.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:36:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:36:08.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:36:08.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:36:09.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:36:09.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:36:09.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:36:09.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-28T16:36:09.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-28T16:36:09.494 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:36:09.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:36:39.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:36:39.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:36:39.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:36:39.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:36:39.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:36:39.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:36:39.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:36:39.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:36:39.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-28T16:36:39.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:36:39.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:36:39.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:36:39.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:36:42.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-28T16:36:42.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:36:42.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:36:42.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:36:42.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:36:42.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:36:42.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:36:42.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:36:42.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:36:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:36:42.394 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:36:42.394 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:36:42.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:36:42.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:36:42.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:36:42.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:36:42.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:36:42.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:36:42.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:36:42.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:36:42.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:36:42.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:36:42.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:36:42.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:36:42.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:36:16
2026-05-28T16:36:42.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69474, datetime.datetime(2026, 5, 28, 16, 36, 16), datetime.datetime(2026, 5, 28, 16, 36, 15), 'salt', 15.2, 30.75, None, 5.75, 242.75, 17.12, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:36:42.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:36:42.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:36:42.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:15, diff=27.709498s, valid=True
2026-05-28T16:36:42.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:36:42.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:36:42.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:12, diff=30.712362s, valid=True
2026-05-28T16:36:42.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:36:42.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:36:42.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:14, diff=28.718917s, valid=True
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:36:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:36:42.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:36:12, diff=30.721952s, valid=True
2026-05-28T16:36:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:36:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:36:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:36:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911644.722616s, valid=True
2026-05-28T16:36:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:36:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:36:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:36:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:36:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:36:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:36:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:36:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:36:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:36:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:36:42.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:36:42.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:36:43.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:36:43.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:36:43.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:36:43.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:36:43.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:36:43.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:36:43.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-28T16:36:43.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-28T16:36:43.853 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:36:43.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:37:13.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:37:13.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:37:13.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:37:14.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:37:14.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:37:14.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:37:14.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-28T16:37:14.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:37:14.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-28T16:37:14.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:37:14.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:37:14.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:37:14.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-28T16:37:17.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-28T16:37:17.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:37:17.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:37:17.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:37:17.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:37:17.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:37:17.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:37:17.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:37:17.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:37:17.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:37:17.249 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:37:17.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:37:17.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:37:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:37:17.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:37:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:37:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:37:17.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:37:17.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:37:17.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:37:17.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:37:17.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:37:17.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:37:17.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:37:17.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:37:16
2026-05-28T16:37:17.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69476, datetime.datetime(2026, 5, 28, 16, 37, 16), datetime.datetime(2026, 5, 28, 16, 37, 16), 'salt', 15.24, 31.34, None, 6.32, 223.93, 16.87, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:37:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:37:17.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:37:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:16, diff=1.624642s, valid=True
2026-05-28T16:37:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:37:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:37:17.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:12, diff=5.627506s, valid=True
2026-05-28T16:37:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:37:17.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:14, diff=3.634228s, valid=True
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:37:17.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:37:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:12, diff=5.6373s, valid=True
2026-05-28T16:37:17.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:37:17.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:37:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:37:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911679.637971s, valid=True
2026-05-28T16:37:17.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:37:17.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:37:17.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:37:17.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:37:17.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:37:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:37:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:37:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:37:17.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:37:17.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:37:17.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:37:17.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:37:17.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:37:17.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:37:18.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:37:18.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:37:18.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:37:18.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:37:18.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-28T16:37:18.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-28T16:37:18.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:37:18.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:37:48.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:37:48.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:37:48.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:37:49.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:37:49.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:37:49.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:37:49.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:37:49.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:37:49.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-28T16:37:49.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:37:49.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:37:49.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:37:49.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-28T16:37:52.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-28T16:37:52.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:37:52.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:37:52.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:37:52.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:37:52.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:37:52.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:37:52.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:37:52.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:37:52.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:37:52.130 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:37:52.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:37:52.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:37:52.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:37:52.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:37:52.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:37:52.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:37:52.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:37:52.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:37:52.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:37:52.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:37:52.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:37:52.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:37:52.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:37:52.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:37:46
2026-05-28T16:37:52.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69477, datetime.datetime(2026, 5, 28, 16, 37, 46), datetime.datetime(2026, 5, 28, 16, 37, 46), 'salt', 15.24, 31.14, None, 7.09, 223.53, 16.95, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:37:52.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:37:52.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:37:52.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:46, diff=6.441911s, valid=True
2026-05-28T16:37:52.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:37:52.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:37:52.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:12, diff=-19.555171s, valid=True
2026-05-28T16:37:52.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:37:52.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:37:44, diff=8.451479s, valid=True
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:37:52.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:37:52.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:12, diff=-19.545481s, valid=True
2026-05-28T16:37:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:37:52.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:37:52.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:37:52.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911714.455186s, valid=True
2026-05-28T16:37:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:37:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:37:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:37:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:37:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:37:52.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:37:52.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:37:52.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:37:52.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:37:52.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:37:52.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:37:52.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:37:52.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:37:52.842 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:37:53.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:37:53.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:37:53.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:37:53.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:37:53.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-28T16:37:53.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-28T16:37:53.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:37:53.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:38:23.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:38:23.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:38:23.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:38:23.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:38:23.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:38:24.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:38:24.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-28T16:38:24.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:38:24.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-28T16:38:24.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:38:24.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:38:24.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:38:24.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-28T16:38:26.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:38:26.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:38:26.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:38:26.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:38:26.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:38:26.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:38:26.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:38:26.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:38:26.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:38:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:38:26.692 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:38:26.692 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:38:26.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:38:26.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:38:26.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:38:26.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:38:26.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:38:26.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:38:26.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:38:26.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:38:26.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:38:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:38:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:38:26.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:38:27.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:38:16
2026-05-28T16:38:27.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69478, datetime.datetime(2026, 5, 28, 16, 38, 16), datetime.datetime(2026, 5, 28, 16, 38, 16), 'salt', 15.24, 30.85, None, 7.27, 220.97, 17.08, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:38:27.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:38:27.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:38:27.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:16, diff=11.008625s, valid=True
2026-05-28T16:38:27.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:38:27.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:38:27.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:12, diff=15.011596s, valid=True
2026-05-28T16:38:27.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:38:27.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:15, diff=12.022017s, valid=True
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:38:27.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:38:27.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:12, diff=15.025154s, valid=True
2026-05-28T16:38:27.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:38:27.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:38:27.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:38:27.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911749.025831s, valid=True
2026-05-28T16:38:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:38:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:38:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:38:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:38:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:38:27.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:38:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:38:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:38:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:38:27.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:38:27.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:38:27.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:38:27.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:38:27.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:38:27.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:38:27.899 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:38:27.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:38:27.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:38:27.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-28T16:38:27.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-28T16:38:28.237 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:38:28.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:38:58.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:38:58.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:38:58.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:38:58.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:38:58.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:38:58.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:38:58.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-28T16:38:58.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:38:58.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:38:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:38:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:38:58.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:38:58.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-28T16:39:01.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:39:01.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:39:01.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:39:01.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:39:01.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:39:01.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:39:01.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:39:01.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:39:01.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:39:01.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:39:01.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:39:01.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:39:01.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:39:01.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:39:01.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:39:01.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:39:01.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:39:01.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:39:01.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:39:01.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:39:01.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:39:01.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:39:01.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:39:01.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:39:01.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:38:47
2026-05-28T16:39:01.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69479, datetime.datetime(2026, 5, 28, 16, 38, 47), datetime.datetime(2026, 5, 28, 16, 38, 46), 'salt', 15.04, 29.45, None, 5.75, 240.71, 17.68, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:39:01.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:39:01.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:39:01.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:46, diff=15.588164s, valid=True
2026-05-28T16:39:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:39:01.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:39:01.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:12, diff=-10.40898s, valid=True
2026-05-28T16:39:01.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:39:01.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:39:01.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:38:45, diff=16.59776s, valid=True
2026-05-28T16:39:01.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:39:01.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:39:01.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:39:01.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:39:01.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:39:01.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:39:01.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:12, diff=-10.399184s, valid=True
2026-05-28T16:39:01.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:39:01.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:39:01.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:39:01.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911783.601475s, valid=True
2026-05-28T16:39:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:39:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:39:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:39:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:39:01.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:39:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:39:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:39:01.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:39:01.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:39:01.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:39:01.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:39:01.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:39:01.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:39:01.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:39:02.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:39:02.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:39:02.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:39:02.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:39:02.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-28T16:39:02.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-28T16:39:02.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:39:02.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:39:32.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:39:32.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:39:32.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:39:33.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:39:33.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:39:33.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:39:33.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:39:33.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:39:33.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-28T16:39:33.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:39:33.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:39:33.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:39:33.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-28T16:39:35.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-28T16:39:35.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:39:35.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:39:35.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:39:35.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:39:35.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:39:35.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:39:35.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:39:35.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:39:35.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:39:35.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:39:35.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:39:35.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:39:36.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:39:36.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:39:36.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:39:36.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:39:36.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:39:36.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:39:36.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:39:36.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:39:36.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:39:36.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:39:36.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:39:36.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:39:17
2026-05-28T16:39:36.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69480, datetime.datetime(2026, 5, 28, 16, 39, 17), datetime.datetime(2026, 5, 28, 16, 39, 16), 'salt', 15.07, 29.65, None, 6.67, 249.1, 17.59, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:39:36.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:39:36.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:39:36.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:16, diff=20.241375s, valid=True
2026-05-28T16:39:36.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:39:36.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:39:36.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:12, diff=24.24411s, valid=True
2026-05-28T16:39:36.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:39:36.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:39:36.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:15, diff=21.25076s, valid=True
2026-05-28T16:39:36.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:39:36.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:39:36.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:39:36.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:39:36.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:39:36.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:39:36.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:12, diff=24.253741s, valid=True
2026-05-28T16:39:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:39:36.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:39:36.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:39:36.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911818.254397s, valid=True
2026-05-28T16:39:36.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:39:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:39:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:39:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:39:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:39:36.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:39:36.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:39:36.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:39:36.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:39:36.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:39:36.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:39:36.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:39:36.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:39:36.573 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:39:36.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:39:37.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:39:37.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:39:37.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:39:37.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-28T16:39:37.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-28T16:39:37.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:39:37.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:40:07.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:40:07.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:40:07.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:40:07.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:40:07.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:40:08.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:40:08.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-28T16:40:08.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:40:08.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-28T16:40:08.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:40:08.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:40:08.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:40:08.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-28T16:40:10.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:40:10.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:40:10.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:40:10.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:40:10.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:40:10.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:40:10.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:40:10.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:40:10.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:40:10.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:40:10.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:40:10.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:40:10.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:40:10.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:40:10.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:40:10.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:40:10.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:40:10.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:40:10.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:40:10.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:40:10.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:40:10.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:40:10.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:40:10.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:40:10.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:39:47
2026-05-28T16:40:10.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69481, datetime.datetime(2026, 5, 28, 16, 39, 47), datetime.datetime(2026, 5, 28, 16, 39, 47), 'salt', 14.97, 31.28, None, 8.33, 234.1, 16.86, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:40:10.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:40:10.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:40:10.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:47, diff=23.830399s, valid=True
2026-05-28T16:40:10.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:40:10.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:40:10.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:12, diff=-1.166715s, valid=True
2026-05-28T16:40:10.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:40:10.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:40:10.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:39:45, diff=25.839866s, valid=True
2026-05-28T16:40:10.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:40:10.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:40:10.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:40:10.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:40:10.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:40:10.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:40:10.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:12, diff=-1.157102s, valid=True
2026-05-28T16:40:10.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:40:10.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:40:10.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:40:10.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911852.843555s, valid=True
2026-05-28T16:40:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:40:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:40:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:40:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:40:10.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:40:10.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:40:10.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:40:10.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:40:10.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:40:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:40:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:40:11.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:40:11.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:40:11.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:40:11.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:40:11.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:40:11.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:40:11.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:40:11.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:40:11.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:40:12.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:40:12.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:40:42.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:40:42.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:40:42.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:40:42.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:40:42.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:40:42.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:40: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-28T16:40:42.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:40:42.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-28T16:40:42.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:40:42.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:40:42.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:40:42.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-28T16:40:45.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-28T16:40:45.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:40:45.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:40:45.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:40:45.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:40:45.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:40:45.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:40:45.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:40:45.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:40:45.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:40:45.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:40:45.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:40:45.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:40:45.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T16:40:45.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:40:45.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T16:40:45.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:40:45.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:40:45.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:40:45.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:40:45.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:40:45.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:40:45.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:40:45.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:40:45.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:40:17
2026-05-28T16:40:45.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69482, datetime.datetime(2026, 5, 28, 16, 40, 17), datetime.datetime(2026, 5, 28, 16, 40, 17), 'salt', 15.07, 30.98, None, 9.14, 246.36, 17.0, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:40:45.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:40:45.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T16:40:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:17, diff=28.764884s, valid=True
2026-05-28T16:40:45.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:40:45.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:40:45.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:12, diff=33.767795s, valid=True
2026-05-28T16:40:45.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:40:45.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:15, diff=30.7745s, valid=True
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:40:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:40:45.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:40:12, diff=33.777562s, valid=True
2026-05-28T16:40:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:40:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:40:45.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:40:45.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911887.778224s, valid=True
2026-05-28T16:40:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:40:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:40:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:40:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:40:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:40:45.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:40:45.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:40:45.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:40:45.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:40:45.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:40:45.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:40:46.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:40:46.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:40:46.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:40:46.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:40:46.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:40:46.842 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:40:46.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:40:46.842 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:40:46.842 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:40:47.058 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:40:47.058 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:41:17.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:41:17.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:41:17.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:41:17.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:41:17.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:41:17.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:41:17.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-28T16:41:17.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:41:17.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-28T16:41:17.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:41:17.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:41:17.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:41:17.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:41:20.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-28T16:41:20.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:41:20.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:41:20.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:41:20.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:41:20.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:41:20.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:41:20.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:41:20.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:41:20.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:41:20.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:41:20.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:41:20.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:41:20.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:41:20.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:41:20.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:41:20.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:41:20.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:41:20.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:41:20.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:41:20.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:41:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:41:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:41:20.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:41:20.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:41:18
2026-05-28T16:41:20.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69484, datetime.datetime(2026, 5, 28, 16, 41, 18), datetime.datetime(2026, 5, 28, 16, 41, 17), 'salt', 15.0, 31.64, None, 8.05, 271.88, 16.7, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:41:20.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:41:20.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:41:20.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:17, diff=3.891931s, valid=True
2026-05-28T16:41:20.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:41:20.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:41:20.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:12, diff=8.894755s, valid=True
2026-05-28T16:41:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:41:20.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:16, diff=4.901279s, valid=True
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:41:20.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:41:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:12, diff=8.905029s, valid=True
2026-05-28T16:41:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:41:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:41:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:41:20.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911922.90571s, valid=True
2026-05-28T16:41:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:41:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:41:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:41:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:41:20.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:41:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:41:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:41:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:41:20.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:41:21.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:41:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:41:21.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:41:21.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:41:21.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:41:21.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:41:21.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:41:21.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:41:21.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:41:21.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-28T16:41:21.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-28T16:41:22.162 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:41:22.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:41:52.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:41:52.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:41:52.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:41:52.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:41:52.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:41:52.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:41:52.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-28T16:41:52.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:41:52.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-28T16:41:52.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:41:52.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:41:52.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:41:52.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-28T16:41:55.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-28T16:41:55.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:41:55.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:41:55.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:41:55.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:41:55.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:41:55.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:41:55.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:41:55.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:41:55.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:41:55.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:41:55.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:41:55.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:41:55.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:41:55.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:41:55.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:41:55.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:41:55.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:41:55.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:41:55.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:41:55.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:41:55.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:41:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:41:55.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:41:55.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:41:48
2026-05-28T16:41:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69485, datetime.datetime(2026, 5, 28, 16, 41, 48), datetime.datetime(2026, 5, 28, 16, 41, 47), 'salt', 14.91, 29.65, None, 6.95, 240.0, 17.57, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:41:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:41:55.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:41:55.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:47, diff=8.346557s, valid=True
2026-05-28T16:41:55.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:41:55.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:41:55.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:12, diff=-16.650541s, valid=True
2026-05-28T16:41:55.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:41:55.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:41:46, diff=9.356092s, valid=True
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:41:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:41:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:12, diff=-16.640915s, valid=True
2026-05-28T16:41:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:41:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:41:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:41:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911957.359756s, valid=True
2026-05-28T16:41:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:41:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:41:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:41:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:41:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:41:55.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:41:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:41:55.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:41:55.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:41:55.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:41:55.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:41:55.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:41:55.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:41:55.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:41:55.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:41:56.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:41:56.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:41:56.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:41:56.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-28T16:41:56.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-28T16:41:56.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:41:56.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:42:26.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:42:26.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:42:26.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:42:27.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:42:27.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:42:27.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:42:27.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-28T16:42:27.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:42:27.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-28T16:42:27.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:42:27.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:42:27.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:42:27.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-28T16:42:29.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-28T16:42:29.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:42:29.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:42:29.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:42:29.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:42:29.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:42:29.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:42:29.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:42:29.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:42:29.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:42:29.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:42:29.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:42:29.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:42:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:42:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:42:29.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:42:29.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:42:30.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:42:30.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:42:30.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:42:30.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:42:30.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:42:30.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:42:30.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:42:30.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:42:18
2026-05-28T16:42:30.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69486, datetime.datetime(2026, 5, 28, 16, 42, 18), datetime.datetime(2026, 5, 28, 16, 42, 18), 'salt', 14.87, 31.18, None, 6.85, 237.97, 16.89, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:42:30.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:42:30.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:42:30.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:18, diff=12.134047s, valid=True
2026-05-28T16:42:30.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:42:30.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:42:30.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:12, diff=18.138697s, valid=True
2026-05-28T16:42:30.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:42:30.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:16, diff=14.147241s, valid=True
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:42:30.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:42:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:12, diff=18.150539s, valid=True
2026-05-28T16:42:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:42:30.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:42:30.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:42:30.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=911992.151222s, valid=True
2026-05-28T16:42:30.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:42:30.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:42:30.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:42:30.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:42:30.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:42:30.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:42:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:42:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:42:30.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:42:30.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:42:30.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:42:30.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:42:30.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:42:30.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:42:30.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:42:31.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:42:31.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:42:31.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:42:31.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:42:31.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:42:31.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:42:31.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:43:01.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:43:01.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:43:01.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:43:01.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:43:01.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:43:01.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:43:01.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-28T16:43:01.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:43:01.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:43:02.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:43:02.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:43:02.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:43:02.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-28T16:43: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-28T16:43:04.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:43:04.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:43:04.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:43:04.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:43:04.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:43:04.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:43:04.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:43:04.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:43:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:43:04.381 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:43:04.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:43:04.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:43:04.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:43:04.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:43:04.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:43:04.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:43:04.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:43:04.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:43:04.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:43:04.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:43:04.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:43:04.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:43:04.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:43:04.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:42:48
2026-05-28T16:43:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69487, datetime.datetime(2026, 5, 28, 16, 42, 48), datetime.datetime(2026, 5, 28, 16, 42, 48), 'salt', 14.84, 31.14, None, 7.98, 254.19, 16.9, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:43:04.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:43:04.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:43:04.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:48, diff=16.704029s, valid=True
2026-05-28T16:43:04.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:43:04.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:43:04.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:12, diff=-7.293077s, valid=True
2026-05-28T16:43:04.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:43:04.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:42:48, diff=16.713568s, valid=True
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:43:04.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:43:04.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:43:04.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:12, diff=-7.283346s, valid=True
2026-05-28T16:43:04.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:43:04.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:43:04.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:43:04.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912026.717307s, valid=True
2026-05-28T16:43:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:43:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:43:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:43:04.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:43:04.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:43:04.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:43:04.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:43:04.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:43:04.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:43:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:43:04.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:43:05.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:43:05.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:43:05.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:43:05.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:43:05.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:43:05.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:43:05.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:43:05.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-28T16:43:05.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-28T16:43:05.897 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:43:05.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:43:35.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:43:35.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:43:35.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:43:36.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:43:36.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:43:36.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:43:36.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-28T16:43:36.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:43:36.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-28T16:43:36.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:43:36.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:43:36.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:43:36.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-28T16:43:38.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-28T16:43:38.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:43:38.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:43:38.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:43:38.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:43:38.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:43:38.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:43:38.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:43:38.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:43:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:43:38.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:43:38.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:43:38.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:43:38.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:43:38.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:43:38.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:43:38.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:43:38.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:43:38.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:43:39.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:43:39.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:43:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:43:39.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:43:39.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:43:39.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:43:18
2026-05-28T16:43:39.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69488, datetime.datetime(2026, 5, 28, 16, 43, 18), datetime.datetime(2026, 5, 28, 16, 43, 18), 'salt', 14.81, 30.41, None, 7.17, 242.16, 17.22, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:43:39.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:43:39.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:43:39.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:18, diff=21.102956s, valid=True
2026-05-28T16:43:39.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:43:39.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:43:39.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:12, diff=27.105801s, valid=True
2026-05-28T16:43:39.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:43:39.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:17, diff=22.112434s, valid=True
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:43:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:43:39.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:12, diff=27.115489s, valid=True
2026-05-28T16:43:39.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:43:39.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:43:39.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:43:39.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912061.116163s, valid=True
2026-05-28T16:43:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:43:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:43:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:43:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:43:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:43:39.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:43:39.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:43:39.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:43:39.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:43:39.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:43:39.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:43:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:43:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:43:39.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:43:39.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:43:40.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:43:40.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:43:40.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:43:40.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-28T16:43:40.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-28T16:43:40.189 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:43:40.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:44:10.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:44:10.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:44:10.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:44:10.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:44:10.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:44:10.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:44:10.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-28T16:44:10.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:44:10.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-28T16:44:10.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:44:10.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:44:10.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:44:10.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-28T16:44:13.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-28T16:44:13.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:44:13.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:44:13.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:44:13.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:44:13.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:44:13.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:44:13.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:44:13.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:44:13.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:44:13.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:44:13.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:44:13.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:44:13.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:44:13.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:44:13.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:44:13.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:44:13.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:44:13.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:44:13.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:44:13.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:44:13.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:44:13.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:44:13.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:44:13.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:43:49
2026-05-28T16:44:13.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69489, datetime.datetime(2026, 5, 28, 16, 43, 49), datetime.datetime(2026, 5, 28, 16, 43, 48), 'salt', 14.77, 32.17, None, 6.18, 280.18, 16.45, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:44:13.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:44:13.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:44:13.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:48, diff=25.485903s, valid=True
2026-05-28T16:44:13.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:44:13.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:44:13.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:12, diff=1.488959s, valid=True
2026-05-28T16:44:13.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:44:13.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:44:13.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:43:47, diff=26.495817s, valid=True
2026-05-28T16:44:13.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:44:13.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:44:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:44:13.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:44:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:44:13.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:44:13.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:12, diff=1.498985s, valid=True
2026-05-28T16:44:13.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:44:13.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:44:13.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:44:13.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912095.499665s, valid=True
2026-05-28T16:44:13.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:44:13.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:44:13.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:44:13.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:44:13.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:44:13.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:44:13.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:44:13.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:44:13.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:44:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:44:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:44:13.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:44:13.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:44:13.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:44:14.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:44:14.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:44:14.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:44:14.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:44:14.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-28T16:44:14.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-28T16:44:14.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:44:14.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:44:44.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:44:44.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:44:44.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:44:45.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:44:45.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:44:45.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:44: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-28T16:44:45.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:44:45.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:44:45.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:44:45.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:44:45.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:44: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-28T16:44:47.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-28T16:44:47.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:44:47.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:44:47.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:44:47.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:44:47.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:44:47.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:44:47.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:44:47.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:44:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:44:47.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:44:47.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:44:47.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:44:47.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T16:44:47.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:44:47.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T16:44:47.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:44:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:44:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:44:48.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T16:44:48.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:44:48.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:44:48.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:44:48.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:44:48.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:44:19
2026-05-28T16:44:48.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69490, datetime.datetime(2026, 5, 28, 16, 44, 19), datetime.datetime(2026, 5, 28, 16, 44, 19), 'salt', 14.87, 31.18, None, 6.18, 295.39, 16.89, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:44:48.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:44:48.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T16:44:48.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:19, diff=29.10011s, valid=True
2026-05-28T16:44:48.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:44:48.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:44:48.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:12, diff=36.10309s, valid=True
2026-05-28T16:44:48.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:44:48.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T16:44:48.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:17, diff=31.109967s, valid=True
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:44:48.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T16:44:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:44:12, diff=36.113098s, valid=True
2026-05-28T16:44:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:44:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:44:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:44:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912130.113767s, valid=True
2026-05-28T16:44:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:44:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:44:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:44:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:44:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:44:48.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:44:48.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:44:48.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:44:48.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:44:48.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:44:48.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:44:48.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:44:48.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:44:48.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:44:48.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:44:49.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:44:49.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:44:49.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:44:49.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-28T16:44:49.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-28T16:44:49.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:44:49.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:45:19.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:45:19.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:45:19.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:45:19.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:45:19.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:45:19.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:45:19.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:45:19.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:45:19.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-28T16:45:19.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:45:19.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:45:19.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:45:19.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-28T16:45:22.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-28T16:45:22.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:45:22.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:45:22.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:45:22.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:45:22.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:45:22.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:45:22.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:45:22.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:45:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:45:22.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:45:22.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:45:22.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:45:22.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:45:22.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:45:22.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:45:22.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:45:22.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:45:22.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:45:22.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:45:22.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:45:22.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:45:22.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:45:22.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:45:22.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:45:19
2026-05-28T16:45:22.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69492, datetime.datetime(2026, 5, 28, 16, 45, 19), datetime.datetime(2026, 5, 28, 16, 45, 19), 'salt', 14.87, 30.38, None, 5.08, 251.0, 17.24, 829.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:45:22.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:45:22.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:45:22.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:19, diff=3.559145s, valid=True
2026-05-28T16:45:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:45:22.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:45:22.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:12, diff=10.562007s, valid=True
2026-05-28T16:45:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:45:22.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:45:22.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:18, diff=4.568641s, valid=True
2026-05-28T16:45:22.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:45:22.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:45:22.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:45:22.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:45:22.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:45:22.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:45:22.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:12, diff=10.571708s, valid=True
2026-05-28T16:45:22.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:45:22.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:45:22.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:45:22.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912164.572355s, valid=True
2026-05-28T16:45:22.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:45:22.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:45:22.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:45:22.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:45:22.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:45:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:45:22.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:45:22.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:45:22.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:45:22.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:45:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:45:22.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:45:22.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:45:22.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:45:23.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:45:23.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:45:23.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:45:23.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:45:23.564 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:45:23.564 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:45:23.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:45:23.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:45:53.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:45:53.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:45:53.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:45:53.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:45:53.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:45:54.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:45:54.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-28T16:45:54.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:45:54.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-28T16:45:54.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:45:54.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:45:54.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:45:54.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-28T16:45:56.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-28T16:45:56.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:45:56.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:45:56.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:45:56.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:45:56.853 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:45:56.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:45:56.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:45:56.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:45:56.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:45:56.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:45:56.865 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:45:56.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:45:56.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:45:56.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:45:57.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:45:57.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:45:57.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:45:57.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:45:57.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:45:57.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:45:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:45:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:45:57.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:45:57.201 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:45:50
2026-05-28T16:45:57.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69493, datetime.datetime(2026, 5, 28, 16, 45, 50), datetime.datetime(2026, 5, 28, 16, 45, 49), 'salt', 14.84, 29.95, None, 5.37, 258.29, 17.43, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:45:57.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:45:57.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:45:57.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:49, diff=8.2073s, valid=True
2026-05-28T16:45:57.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:45:57.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:45:57.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:12, diff=-14.789516s, valid=True
2026-05-28T16:45:57.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:45:57.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:45:48, diff=9.226338s, valid=True
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:45:57.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:45:57.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:45:57.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:12, diff=-14.767861s, valid=True
2026-05-28T16:45:57.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:45:57.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:45:57.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:45:57.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912199.232875s, valid=True
2026-05-28T16:45:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:45:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:45:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:45:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:45:57.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:45:57.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:45:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:45:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:45:57.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:45:57.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:45:57.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:45:57.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:45:57.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:45:57.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:45:57.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:45:58.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:45:58.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:45:58.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:45:58.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-28T16:45:58.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-28T16:45:58.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:45:58.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:46:28.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:46:28.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:46:28.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:46:28.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:46:28.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:46:28.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:46:28.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-28T16:46:28.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:46:28.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-28T16:46:28.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:46:28.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:46:28.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:46:28.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-28T16:46:31.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-28T16:46:31.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:46:31.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:46:31.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:46:31.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:46:31.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:46:31.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:46:31.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:46:31.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:46:31.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:46:31.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:46:31.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:46:31.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:46:31.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:46:31.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:46:31.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:46:31.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:46:31.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:46:31.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:46:31.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:46:31.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:46:31.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:46:31.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:46:31.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:46:31.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:46:20
2026-05-28T16:46:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69494, datetime.datetime(2026, 5, 28, 16, 46, 20), datetime.datetime(2026, 5, 28, 16, 46, 19), 'salt', 14.74, 30.28, None, 5.68, 277.93, 17.27, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:46:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:46:31.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:46:31.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:19, diff=12.574729s, valid=True
2026-05-28T16:46:31.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:46:31.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:46:31.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:12, diff=19.577547s, valid=True
2026-05-28T16:46:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:46:31.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:18, diff=13.585407s, valid=True
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:46:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:46:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:12, diff=19.58848s, valid=True
2026-05-28T16:46:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:46:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:46:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:46:31.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912233.589151s, valid=True
2026-05-28T16:46:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:46:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:46:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:46:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:46:31.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:46:31.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:46:31.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:46:31.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:46:31.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:46:31.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:46:31.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:46:31.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:46:31.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:46:31.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:46:32.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:46:32.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:46:32.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:46:32.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:46:32.555 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:46:32.555 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:46:32.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:46:32.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:47:02.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:47:02.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:47:02.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:47:03.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:47:03.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:47:03.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:47:03.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-28T16:47:03.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:47:03.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-28T16:47:03.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:47:03.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:47:03.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:47:03.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-28T16:47:05.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-28T16:47:05.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:47:05.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:47:05.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:47:05.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:47:05.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:47:05.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:47:05.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:47:05.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:47:05.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:47:05.870 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:47:05.870 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:47:05.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:47:05.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:47:05.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:47:06.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:47:06.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:47:06.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:47:06.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:47:06.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:47:06.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:47:06.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:47:06.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:47:06.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:47:06.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:46:50
2026-05-28T16:47:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69495, datetime.datetime(2026, 5, 28, 16, 46, 50), datetime.datetime(2026, 5, 28, 16, 46, 49), 'salt', 14.77, 29.69, None, 4.31, 226.83, 17.53, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:47:06.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:47:06.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:47:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:49, diff=17.183673s, valid=True
2026-05-28T16:47:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:47:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:47:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:12, diff=-5.813476s, valid=True
2026-05-28T16:47:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:47:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:46:49, diff=17.193078s, valid=True
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:47:06.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:47:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:12, diff=-5.803928s, valid=True
2026-05-28T16:47:06.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:47:06.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:47:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:47:06.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912268.196725s, valid=True
2026-05-28T16:47:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:47:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:47:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:47:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:47:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:47:06.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:47:06.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:47:06.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:47:06.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:47:06.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:47:06.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:47:06.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:47:06.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:47:06.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:47:06.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:47:07.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:47:07.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:47:07.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:47:07.269 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:47:07.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-28T16:47:09.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:47:09.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:47:39.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:47:39.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:47:39.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:47:39.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:47:39.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:47:40.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:47:40.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-28T16:47:40.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:47:40.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-28T16:47:40.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:47:40.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:47:40.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:47:40.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:47:42.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-28T16:47:42.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:47:42.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:47:42.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:47:42.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:47:42.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:47:42.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:47:42.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:47:42.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:47:42.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:47:42.532 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:47:42.532 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:47:42.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:47:42.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:47:42.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:47:42.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:47:42.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:47:42.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:47:42.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:47:42.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:47:42.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:47:42.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:47:42.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:47:42.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:47:42.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:47:20
2026-05-28T16:47:42.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69496, datetime.datetime(2026, 5, 28, 16, 47, 20), datetime.datetime(2026, 5, 28, 16, 47, 20), 'salt', 14.71, 29.98, None, 4.91, 261.62, 17.4, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:47:42.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:47:42.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:47:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:20, diff=22.853549s, valid=True
2026-05-28T16:47:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:47:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:47:42.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:12, diff=30.856442s, valid=True
2026-05-28T16:47:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:47:42.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:19, diff=23.863131s, valid=True
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:47:42.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:47:42.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:12, diff=30.866175s, valid=True
2026-05-28T16:47:42.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:47:42.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:47:42.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:47:42.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912304.866847s, valid=True
2026-05-28T16:47:42.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:47:42.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:47:42.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:47:42.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:47:42.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:47:42.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:47:42.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:47:42.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:47:42.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:47:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:47:43.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:47:43.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:47:43.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:47:43.211 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:47:43.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:47:43.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:47:43.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:47:43.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:47:43.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-28T16:47:43.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-28T16:47:44.102 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:47:44.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:48:14.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:48:14.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:48:14.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:48:14.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:48:14.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:48:14.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:48:14.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-28T16:48:14.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:48:14.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-28T16:48:14.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:48:14.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:48:14.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:48:14.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-28T16:48:17.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:48:17.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:48:17.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:48:17.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:48:17.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:48:17.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:48:17.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:48:17.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:48:17.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:48:17.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:48:17.217 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:48:17.218 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:48:17.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:48:17.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:48:17.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:48:17.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:48:17.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:48:17.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:48:17.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:48:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:48:17.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:48:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:48:17.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:48:17.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:48:17.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:47:50
2026-05-28T16:48:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69497, datetime.datetime(2026, 5, 28, 16, 47, 50), datetime.datetime(2026, 5, 28, 16, 47, 50), 'salt', 14.81, 31.08, None, 5.93, 198.73, 16.93, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:48:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:48:17.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:48:17.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:50, diff=27.534933s, valid=True
2026-05-28T16:48:17.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:48:17.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:48:17.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:48:12, diff=5.537844s, valid=True
2026-05-28T16:48:17.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:48:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:47:49, diff=28.545389s, valid=True
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:48:17.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:48:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:48:12, diff=5.549155s, valid=True
2026-05-28T16:48:17.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:48:17.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:48:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:48:17.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912339.549839s, valid=True
2026-05-28T16:48:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:48:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:48:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:48:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:48:17.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:48:17.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:48:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:48:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:48:17.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:48:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:48:17.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:48:17.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:48:17.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:48:17.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:48:18.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:48:18.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:48:18.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:48:18.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:48:18.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-28T16:48:18.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-28T16:48:18.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:48:18.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:48:48.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:48:48.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:48:48.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:48:48.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:48:48.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:48:49.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:48:49.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-28T16:48:49.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:48:49.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-28T16:48:49.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:48:49.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:48:49.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:48:49.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:48:52.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-28T16:48:52.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:48:52.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:48:52.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:48:52.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:48:52.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:48:52.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:48:52.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:48:52.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:48:52.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:48:52.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:48:52.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:48:52.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:48:52.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:48:52.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:48:52.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:48:52.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:48:52.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:48:52.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:48:52.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:48:52.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:48:52.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:48:52.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:48:52.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:48:52.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:48:51
2026-05-28T16:48:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69499, datetime.datetime(2026, 5, 28, 16, 48, 51), datetime.datetime(2026, 5, 28, 16, 48, 50), 'salt', 14.87, 31.04, None, 6.81, 231.48, 16.94, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:48:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:48:52.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:48:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:48:50, diff=2.548245s, valid=True
2026-05-28T16:48:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:48:52.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:48:52.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:12, diff=-19.4489s, valid=True
2026-05-28T16:48:52.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:48:52.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:48:52.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:48:50, diff=2.557771s, valid=True
2026-05-28T16:48:52.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:48:52.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:48:52.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:48:52.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:48:52.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:48:52.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:48:52.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:12, diff=-19.439208s, valid=True
2026-05-28T16:48:52.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:48:52.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:48:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:48:52.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912374.561445s, valid=True
2026-05-28T16:48:52.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:48:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:48:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:48:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:48:52.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:48:52.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:48:52.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:48:52.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:48:52.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:48:52.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:48:52.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:48:52.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:48:52.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:48:52.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:48:53.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:48:53.468 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:48:53.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:48:53.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:48:53.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-28T16:48:53.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-28T16:48:53.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:48:53.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:49:23.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:49:23.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:49:23.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:49:24.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:49:24.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:49:24.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:49:24.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-28T16:49:24.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:49:24.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-28T16:49:24.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:49:24.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:49:24.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:49:24.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-28T16:49:26.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-28T16:49:26.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:49:26.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:49:26.627 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:49:26.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:49:26.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:49:26.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:49:26.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:49:26.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:49:26.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:49:26.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:49:26.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:49:26.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:49:26.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:49:26.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:49:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:49:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:49:26.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:49:26.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:49:26.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:49:26.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:49:26.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:49:26.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:49:26.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:49:26.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:49:21
2026-05-28T16:49:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69500, datetime.datetime(2026, 5, 28, 16, 49, 21), datetime.datetime(2026, 5, 28, 16, 49, 21), 'salt', 14.87, 31.14, None, 8.61, 252.52, 16.9, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:49:26.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:49:26.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:49:26.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:21, diff=5.961535s, valid=True
2026-05-28T16:49:26.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:49:26.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:49:26.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:12, diff=14.964343s, valid=True
2026-05-28T16:49:26.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:49:26.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:49:26.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:20, diff=6.970928s, valid=True
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:49:26.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:49:26.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:12, diff=14.97394s, valid=True
2026-05-28T16:49:26.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:49:26.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:49:26.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:49:26.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912408.974593s, valid=True
2026-05-28T16:49:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:49:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:49:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:49:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:49:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:49:27.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:49:27.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:49:27.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:49:27.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:49:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:49:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:49:27.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:49:27.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:49:27.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:49:27.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:49:27.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:49:28.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:49:28.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:49:28.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-28T16:49:28.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-28T16:49:28.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:49:28.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:49:58.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:49:58.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:49:58.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:49:58.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:49:58.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:49:58.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:49:58.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-28T16:49:58.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:49:58.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-28T16:49:58.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:49:58.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:49:58.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:49:58.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-28T16:50:00.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-28T16:50:00.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:50:00.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:50:00.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:50:00.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:50:00.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:50:00.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:50:00.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:50:00.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:50:00.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:50:00.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:50:00.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:50:00.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:50:01.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:50:01.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:50:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:50:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:50:01.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:50:01.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:50:01.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:50:01.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:50:01.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:50:01.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:50:01.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:50:01.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:49:51
2026-05-28T16:50:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69501, datetime.datetime(2026, 5, 28, 16, 49, 51), datetime.datetime(2026, 5, 28, 16, 49, 51), 'salt', 14.84, 30.32, None, 8.12, 246.78, 17.26, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:50:01.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:50:01.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:50:01.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:51, diff=10.236947s, valid=True
2026-05-28T16:50:01.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:50:01.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:50:01.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:12, diff=-10.76015s, valid=True
2026-05-28T16:50:01.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:50:01.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:49:50, diff=11.246555s, valid=True
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:50:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:50:01.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:50:01.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:12, diff=-10.750419s, valid=True
2026-05-28T16:50:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:50:01.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:50:01.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:50:01.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912443.250257s, valid=True
2026-05-28T16:50:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:50:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:50:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:50:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:50:01.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:50:01.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:50:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:50:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:50:01.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:50:01.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:50:01.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:50:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:50:01.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:50:01.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:50:01.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:50:02.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:50:02.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:50:02.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:50:02.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-28T16:50:02.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-28T16:50:02.428 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:50:02.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:50:32.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:50:32.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:50:32.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:50:32.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:50:32.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:50:33.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:50:33.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:50:33.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:50:33.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-28T16:50:33.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:50:33.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:50:33.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:50:33.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-28T16:50:35.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-28T16:50:35.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:50:35.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:50:35.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:50:35.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:50:35.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:50:35.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:50:35.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:50:35.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:50:35.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:50:35.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:50:35.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:50:35.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:50:35.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:50:35.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:50:35.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:50:35.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:50:35.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:50:35.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:50:35.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:50:35.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:50:35.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:50:35.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:50:35.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:50:35.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:50:21
2026-05-28T16:50:35.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69502, datetime.datetime(2026, 5, 28, 16, 50, 21), datetime.datetime(2026, 5, 28, 16, 50, 21), 'salt', 14.64, 30.25, None, 7.2, 237.55, 17.27, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:50:35.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:50:35.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:50:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:21, diff=14.834409s, valid=True
2026-05-28T16:50:35.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:50:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:50:35.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:12, diff=23.837311s, valid=True
2026-05-28T16:50:35.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:50:35.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:50:35.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:20, diff=15.843901s, valid=True
2026-05-28T16:50:35.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:50:35.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:50:35.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:50:35.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:50:35.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:50:35.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:50:35.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:12, diff=23.846927s, valid=True
2026-05-28T16:50:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:50:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:50:35.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:50:35.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912477.847579s, valid=True
2026-05-28T16:50:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:50:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:50:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:50:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:50:35.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:50:35.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:50:35.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:50:35.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:50:35.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:50:36.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:50:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:50:36.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:50:36.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:50:36.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:50:36.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:50:36.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:50:36.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:50:36.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:50:36.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-28T16:50:36.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-28T16:50:36.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:50:36.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:51:06.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:51:06.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:51:06.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:51:07.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:51:07.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:51:07.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:51:07.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-28T16:51:07.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:51:07.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-28T16:51:07.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:51:07.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:51:07.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:51:07.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-28T16:51:10.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-28T16:51:10.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:51:10.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:51:10.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:51:10.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:51:10.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:51:10.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:51:10.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:51:10.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:51:10.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:51:10.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:51:10.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:51:10.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:51:10.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:51:10.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:51:10.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:51:10.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:51:10.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:51:10.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:51:10.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:51:10.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:51:10.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:51:10.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:51:10.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:51:10.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:50:52
2026-05-28T16:51:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69503, datetime.datetime(2026, 5, 28, 16, 50, 52), datetime.datetime(2026, 5, 28, 16, 50, 51), 'salt', 14.57, 30.75, None, 8.33, 259.49, 17.03, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:51:10.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:51:10.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:51:10.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:51, diff=19.749412s, valid=True
2026-05-28T16:51:10.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:51:10.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:51:10.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:12, diff=-1.24767s, valid=True
2026-05-28T16:51:10.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:51:10.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:50:51, diff=19.759113s, valid=True
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:51:10.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:51:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:12, diff=-1.237803s, valid=True
2026-05-28T16:51:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:51:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:51:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:51:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912512.762869s, valid=True
2026-05-28T16:51:10.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:51:10.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:51:10.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:51:10.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:51:10.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:51:10.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:51:10.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:51:10.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:51:10.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:51:10.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:51:10.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:51:10.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:51:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:51:11.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:51:11.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:51:11.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:51:11.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:51:11.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:51:11.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-28T16:51:11.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-28T16:51:11.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:51:11.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:51:41.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:51:41.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:51:41.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:51:42.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:51:42.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:51:42.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:51:42.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-28T16:51:42.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:51:42.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-28T16:51:42.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:51:42.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:51:42.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:51:42.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-28T16:51:44.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-28T16:51:44.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:51:44.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:51:44.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:51:44.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:51:44.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:51:44.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:51:44.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:51:44.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:51:44.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:51:44.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:51:44.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:51:44.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:51:44.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:51:44.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:51:45.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:51:45.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:51:45.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:51:45.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:51:45.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:51:45.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:51:45.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:51:45.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:51:45.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:51:45.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:51:22
2026-05-28T16:51:45.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69504, datetime.datetime(2026, 5, 28, 16, 51, 22), datetime.datetime(2026, 5, 28, 16, 51, 22), 'salt', 14.61, 30.25, None, 7.94, 266.73, 17.27, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:51:45.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:51:45.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:51:45.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:22, diff=23.159318s, valid=True
2026-05-28T16:51:45.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:51:45.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:51:45.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:12, diff=33.162185s, valid=True
2026-05-28T16:51:45.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:51:45.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:51:45.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:21, diff=24.168771s, valid=True
2026-05-28T16:51:45.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:51:45.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:51:45.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:51:45.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:51:45.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:51:45.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:51:45.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:12, diff=33.171782s, valid=True
2026-05-28T16:51:45.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:51:45.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:51:45.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:51:45.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912547.172423s, valid=True
2026-05-28T16:51:45.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:51:45.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:51:45.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:51:45.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:51:45.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:51:45.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:51:45.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:51:45.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:51:45.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:51:45.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:51:45.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:51:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:51:45.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:51:45.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:51:45.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:51:46.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:51:46.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:51:46.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:51:46.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-28T16:51:46.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-28T16:51:46.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:51:46.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:52:16.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:52:16.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:52:16.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:52:16.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:52:16.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:52:16.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:52:16.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-28T16:52:16.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:52:16.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-28T16:52:16.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:52:16.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:52:16.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:52:16.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-28T16:52:19.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-28T16:52:19.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:52:19.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:52:19.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:52:19.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:52:19.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:52:19.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:52:19.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:52:19.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:52:19.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:52:19.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:52:19.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:52:19.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:52:19.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:52:19.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:52:19.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:52:19.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:52:19.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:52:19.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:52:19.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:52:19.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:52:19.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:52:19.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:52:19.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:52:19.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:51:52
2026-05-28T16:52:19.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69505, datetime.datetime(2026, 5, 28, 16, 51, 52), datetime.datetime(2026, 5, 28, 16, 51, 51), 'salt', 14.54, 30.61, None, 10.73, 257.17, 17.09, 829.83, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:52:19.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:52:19.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:52:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:51, diff=28.694221s, valid=True
2026-05-28T16:52:19.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:52:19.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:52:19.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:52:12, diff=7.697124s, valid=True
2026-05-28T16:52:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:52:19.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:52:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:51:51, diff=28.703658s, valid=True
2026-05-28T16:52:19.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:52:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:52:19.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:52:19.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:52:19.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:52:19.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:52:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:52:12, diff=7.70668s, valid=True
2026-05-28T16:52:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:52:19.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:52:19.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:52:19.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912581.707342s, valid=True
2026-05-28T16:52:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:52:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:52:19.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:52:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:52:19.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:52:19.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:52:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:52:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:52:19.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:52:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:52:19.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:52:19.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:52:20.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:52:20.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:52:20.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:52:20.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:52:20.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:52:20.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:52:20.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-28T16:52:20.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-28T16:52:20.991 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:52:20.991 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:52:51.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:52:51.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:52:51.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:52:51.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:52:51.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:52:51.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:52:51.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-28T16:52:51.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:52:51.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-28T16:52:51.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:52:51.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:52:51.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:52:51.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-28T16:52:53.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:52:53.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:52:53.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:52:53.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:52:53.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:52:53.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:52:53.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:52:53.855 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:52:53.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:52:53.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:52:53.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:52:53.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:52:53.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:52:53.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:52:53.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:52:54.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:52:54.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:52:54.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:52:54.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:52:54.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:52:54.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:52:54.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:52:54.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:52:54.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:52:54.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:52:53
2026-05-28T16:52:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69507, datetime.datetime(2026, 5, 28, 16, 52, 53), datetime.datetime(2026, 5, 28, 16, 52, 52), 'salt', 14.41, 31.08, None, 7.31, 272.85, 16.88, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:52:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:52:54.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:52:54.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:52:52, diff=2.179047s, valid=True
2026-05-28T16:52:54.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:52:54.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:52:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:12, diff=-17.81635s, valid=True
2026-05-28T16:52:54.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:52:54.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:52:52, diff=2.195423s, valid=True
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:52:54.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:52:54.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:12, diff=-17.801598s, valid=True
2026-05-28T16:52:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:52:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:52:54.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:52:54.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912616.199057s, valid=True
2026-05-28T16:52:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:52:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:52:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:52:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:52:54.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:52:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:52:54.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:52:54.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:52:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:52:54.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:52:54.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:52:54.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:52:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:52:54.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:52:54.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:52:55.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:52:55.219 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:52:55.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:52:55.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-28T16:52:55.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-28T16:52:55.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:52:55.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:53:25.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:53:25.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:53:25.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:53:25.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:53:25.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:53:25.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:53:25.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-28T16:53:25.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:53:25.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-28T16:53:25.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:53:25.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:53:25.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:53: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-28T16:53:28.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-28T16:53:28.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:53:28.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:53:28.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:53:28.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:53:28.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:53:28.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:53:28.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:53:28.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:53:28.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:53:28.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:53:28.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:53:28.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:53:28.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:53:28.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:53:28.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:53:28.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:53:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:53:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:53:28.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:53:28.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:53:28.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:53:28.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:53:28.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:53:28.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:53:23
2026-05-28T16:53:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69508, datetime.datetime(2026, 5, 28, 16, 53, 23), datetime.datetime(2026, 5, 28, 16, 53, 22), 'salt', 14.47, 32.1, None, 7.98, 265.14, 16.44, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:53:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:53:28.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:53:28.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:22, diff=6.571698s, valid=True
2026-05-28T16:53:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:53:28.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:53:28.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:12, diff=16.574484s, valid=True
2026-05-28T16:53:28.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:53:28.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:53:28.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:22, diff=6.581742s, valid=True
2026-05-28T16:53:28.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:53:28.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:53:28.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:53:28.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:53:28.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:53:28.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:53:28.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:12, diff=16.584857s, valid=True
2026-05-28T16:53:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:53:28.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:53:28.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:53:28.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912650.585516s, valid=True
2026-05-28T16:53:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:53:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:53:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:53:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:53:28.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:53:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:53:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:53:28.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:53:28.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:53:28.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:53:28.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:53:28.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:53:28.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:53:28.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:53:29.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:53:29.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:53:29.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:53:29.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:53:29.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-28T16:53:29.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-28T16:53:29.952 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:53:29.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:53:59.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:53:59.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:53:59.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:54:00.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:54:00.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:54:00.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:54:00.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-28T16:54:00.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:54:00.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-28T16:54:00.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:54:00.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:54:00.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:54:00.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-28T16:54:03.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-28T16:54:03.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:54:03.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:54:03.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:54:03.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:54:03.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:54:03.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:54:03.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:54:03.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:54:03.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:54:03.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:54:03.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:54:03.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:54:03.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:54:03.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:54:03.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:54:03.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:54:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:54:03.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:54:03.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:54:03.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:54:03.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:54:03.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:54:03.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:54:03.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:53:53
2026-05-28T16:54:03.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69509, datetime.datetime(2026, 5, 28, 16, 53, 53), datetime.datetime(2026, 5, 28, 16, 53, 53), 'salt', 14.47, 30.18, None, 7.27, 271.4, 17.27, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:54:03.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:54:03.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:54:03.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:53, diff=10.458327s, valid=True
2026-05-28T16:54:03.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:54:03.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:54:03.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:12, diff=-8.538564s, valid=True
2026-05-28T16:54:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:54:03.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:54:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:53:52, diff=11.468785s, valid=True
2026-05-28T16:54:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:54:03.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:54:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:54:03.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:54:03.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:54:03.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:54:03.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:12, diff=-8.527863s, valid=True
2026-05-28T16:54:03.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:54:03.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:54:03.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:54:03.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912685.472892s, valid=True
2026-05-28T16:54:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:54:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:54:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:54:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:54:03.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:54:03.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:54:03.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:54:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:54:03.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:54:03.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:54:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:54:03.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:54:03.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:54:03.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:54:04.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:54:04.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:54:04.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:54:04.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:54:04.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-28T16:54:04.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-28T16:54:04.994 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:54:04.994 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:54:35.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:54:35.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:54:35.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:54:35.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:54:35.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:54:35.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:54:35.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-28T16:54:35.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:54:35.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-28T16:54:35.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:54:35.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:54:35.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:54:35.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-28T16:54:37.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-28T16:54:37.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:54:37.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:54:37.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:54:37.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:54:37.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:54:37.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:54:37.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:54:37.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:54:37.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:54:37.925 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:54:37.925 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:54:37.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:54:38.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:54:38.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:54:38.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:54:38.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:54:38.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:54:38.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:54:38.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:54:38.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:54:38.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:54:38.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:54:38.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:54:38.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:54:23
2026-05-28T16:54:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69510, datetime.datetime(2026, 5, 28, 16, 54, 23), datetime.datetime(2026, 5, 28, 16, 54, 23), 'salt', 14.37, 30.28, None, 6.85, 257.14, 17.21, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:54:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:54:38.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:54:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:23, diff=15.243005s, valid=True
2026-05-28T16:54:38.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:54:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:54:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:12, diff=26.245985s, valid=True
2026-05-28T16:54:38.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:54:38.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:54:38.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:23, diff=15.252842s, valid=True
2026-05-28T16:54:38.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:54:38.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:54:38.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:54:38.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:54:38.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:54:38.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:54:38.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:12, diff=26.256012s, valid=True
2026-05-28T16:54:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:54:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:54:38.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:54:38.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912720.256708s, valid=True
2026-05-28T16:54:38.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:54:38.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:54:38.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:54:38.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:54:38.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:54:38.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:54:38.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:54:38.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:54:38.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:54:38.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:54:38.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:54:38.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:54:38.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:54:38.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:54:38.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:54:39.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:54:39.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:54:39.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:54:39.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-28T16:54:39.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-28T16:54:39.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:54:39.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:55:09.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:55:09.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:55:09.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:55:09.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:55:09.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:55:09.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:55:09.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:55:09.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:55:09.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-28T16:55:09.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:55:09.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:55:09.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:55:09.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T16:55:12.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:55:12.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:55:12.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:55:12.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:55:12.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:55:12.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:55:12.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:55:12.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:55:12.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:55:12.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:55:12.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:55:12.418 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:55:12.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:55:12.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:55:12.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:55:12.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:55:12.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:55:12.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:55:12.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:55:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:55:12.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:55:12.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:55:12.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:55:12.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:55:12.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:54:53
2026-05-28T16:55:12.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69511, datetime.datetime(2026, 5, 28, 16, 54, 53), datetime.datetime(2026, 5, 28, 16, 54, 53), 'salt', 14.47, 30.48, None, 5.47, 260.66, 17.14, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:55:12.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:55:12.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:55:12.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:53, diff=19.760549s, valid=True
2026-05-28T16:55:12.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:55:12.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:55:12.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:12, diff=0.763551s, valid=True
2026-05-28T16:55:12.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:55:12.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:54:53, diff=19.770293s, valid=True
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:55:12.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:55:12.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:12, diff=0.773326s, valid=True
2026-05-28T16:55:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:55:12.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:55:12.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:55:12.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912754.773998s, valid=True
2026-05-28T16:55:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:55:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:55:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:55:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:55:12.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:55:12.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:55:12.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:55:12.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:55:12.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:55:12.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:55:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:55:13.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:55:13.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:55:13.102 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:55:13.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:55:13.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:55:13.798 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:55:13.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:55:13.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-28T16:55:13.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-28T16:55:13.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:55:13.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:55:43.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:55:43.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:55:43.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:55:44.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:55:44.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:55:44.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:55:44.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-28T16:55:44.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:55:44.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-28T16:55:44.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:55:44.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:55:44.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:55:44.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-28T16:55:46.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-28T16:55:46.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:55:46.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:55:46.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:55:46.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:55:46.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:55:46.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:55:46.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:55:46.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:55:46.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:55:46.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:55:46.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:55:46.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:55:46.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:55:46.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:55:46.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:55:46.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:55:46.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:55:46.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:55:46.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:55:46.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:55:46.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:55:46.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:55:46.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:55:47.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:55:24
2026-05-28T16:55:47.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69512, datetime.datetime(2026, 5, 28, 16, 55, 24), datetime.datetime(2026, 5, 28, 16, 55, 23), 'salt', 14.44, 30.15, None, 4.94, 254.43, 17.28, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:55:47.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:55:47.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:55:47.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:23, diff=24.041361s, valid=True
2026-05-28T16:55:47.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:55:47.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:55:47.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:12, diff=35.044263s, valid=True
2026-05-28T16:55:47.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:55:47.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:23, diff=24.051015s, valid=True
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:55:47.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:55:47.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:12, diff=35.054109s, valid=True
2026-05-28T16:55:47.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:55:47.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:55:47.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:55:47.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912789.054776s, valid=True
2026-05-28T16:55:47.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:55:47.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:55:47.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:55:47.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:55:47.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:55:47.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:55:47.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:55:47.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:55:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:55:47.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:55:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:55:47.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:55:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:55:47.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:55:47.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:55:48.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:55:48.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:55:48.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:55:48.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-28T16:55:48.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-28T16:55:48.349 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:55:48.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:56:18.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:56:18.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:56:18.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:56:18.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:56:18.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:56:18.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:56:18.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T16:56:18.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:56:18.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:56:18.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:56:18.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:56:18.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:56:18.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-28T16:56:21.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-28T16:56:21.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:56:21.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:56:21.905 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:56:21.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:56:21.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:56:21.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:56:21.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:56:21.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:56:21.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:56:21.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:56:21.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:56:21.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:56:22.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:56:22.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:56:22.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:56:22.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:56:22.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:56:22.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:56:22.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:56:22.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:56:22.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:56:22.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:56:22.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:56:22.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:55:54
2026-05-28T16:56:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69513, datetime.datetime(2026, 5, 28, 16, 55, 54), datetime.datetime(2026, 5, 28, 16, 55, 54), 'salt', 14.44, 29.82, None, 4.73, 225.31, 17.43, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:56:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:56:22.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:56:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:54, diff=28.242679s, valid=True
2026-05-28T16:56:22.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:56:22.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:56:22.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:56:12, diff=10.245519s, valid=True
2026-05-28T16:56:22.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:56:22.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:55:54, diff=28.252137s, valid=True
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:56:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:56:22.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:56:12, diff=10.255176s, valid=True
2026-05-28T16:56:22.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:56:22.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:56:22.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:56:22.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912824.255847s, valid=True
2026-05-28T16:56:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:56:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:56:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:56:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:56:22.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:56:22.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:56:22.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:56:22.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:56:22.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:56:22.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:56:22.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:56:22.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:56:22.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:56:22.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:56:22.828 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:56:23.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:56:23.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:56:23.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:56:23.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-28T16:56:23.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-28T16:56:23.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:56:23.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:56:53.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:56:53.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:56:53.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:56:53.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:56:53.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:56:54.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:56:54.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-28T16:56:54.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:56:54.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-28T16:56:54.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:56:54.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:56:54.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:56:54.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-28T16:56: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-28T16:56:56.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:56:56.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:56:56.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:56:56.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:56:56.563 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:56:56.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:56:56.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:56:56.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:56:56.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:56:56.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:56:56.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:56:56.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:56:56.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:56:56.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:56:56.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:56:56.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:56:56.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:56:56.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:56:56.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:56:56.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:56:56.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:56:56.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:56:56.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:56:56.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:56:54
2026-05-28T16:56:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69515, datetime.datetime(2026, 5, 28, 16, 56, 54), datetime.datetime(2026, 5, 28, 16, 56, 54), 'salt', 14.57, 30.78, None, 4.24, 214.41, 17.02, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:56:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:56:56.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:56:56.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:56:54, diff=2.888119s, valid=True
2026-05-28T16:56:56.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:56:56.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:56:56.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:12, diff=-15.108947s, valid=True
2026-05-28T16:56:56.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:56:56.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:56:56.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:56:54, diff=2.897793s, valid=True
2026-05-28T16:56:56.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:56:56.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:56:56.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:56:56.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:56:56.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:56:56.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:56:56.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:12, diff=-15.099143s, valid=True
2026-05-28T16:56:56.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:56:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:56:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:56:56.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912858.901519s, valid=True
2026-05-28T16:56:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:56:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:56:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:56:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:56:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:56:56.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:56:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:56:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:56:56.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:56:57.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:56:57.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:56:57.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:56:57.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:56:57.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:56:57.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:56:57.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:56:57.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:56:57.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:56:57.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-28T16:56:57.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-28T16:56:58.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:56:58.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:57:28.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:57:28.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:57:28.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:57:28.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:57:28.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:57:28.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:57:28.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-28T16:57:28.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:57:28.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-28T16:57:28.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:57:28.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:57:28.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:57:28.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-28T16:57:31.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-28T16:57:31.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:57:31.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:57:31.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:57:31.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:57:31.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:57:31.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:57:31.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:57:31.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:57:31.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:57:31.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:57:31.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:57:31.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:57:31.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:57:31.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:57:31.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:57:31.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:57:31.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:57:31.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:57:31.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:57:31.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:57:31.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:57:31.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:57:31.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:57:31.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:57:24
2026-05-28T16:57:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69516, datetime.datetime(2026, 5, 28, 16, 57, 24), datetime.datetime(2026, 5, 28, 16, 57, 24), 'salt', 14.61, 30.65, None, 4.94, 234.53, 17.09, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:57:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:57:31.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:57:31.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:24, diff=7.381836s, valid=True
2026-05-28T16:57:31.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:57:31.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:57:31.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:12, diff=19.384786s, valid=True
2026-05-28T16:57:31.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:57:31.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:24, diff=7.391531s, valid=True
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:57:31.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:57:31.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:12, diff=19.394603s, valid=True
2026-05-28T16:57:31.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:57:31.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:57:31.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:57:31.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912893.395272s, valid=True
2026-05-28T16:57:31.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:57:31.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:57:31.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:57:31.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:57:31.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:57:31.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:57:31.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:57:31.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:57:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:57:31.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:57:31.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:57:31.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:57:31.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:57:31.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:57:31.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:57:32.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:57:32.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:57:32.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:57:32.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-28T16:57:32.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-28T16:57:32.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:57:32.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:58:02.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:58:02.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:58:02.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:58:03.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:58:03.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:58:03.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:58:03.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-28T16:58:03.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:58:03.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-28T16:58:03.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:58:03.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:58:03.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:58:03.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-28T16:58:05.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-28T16:58:05.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:58:05.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:58:05.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:58:05.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:58:05.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:58:05.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:58:05.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:58:05.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:58:05.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:58:05.726 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:58:05.726 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:58:05.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:58:05.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:58:05.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:58:05.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:58:05.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:58:05.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:58:05.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:58:05.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:58:05.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:58:05.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:58:05.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:58:05.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:58:06.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:57:55
2026-05-28T16:58:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69517, datetime.datetime(2026, 5, 28, 16, 57, 55), datetime.datetime(2026, 5, 28, 16, 57, 54), 'salt', 14.64, 30.91, None, 7.06, 253.35, 16.97, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:58:06.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:58:06.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:58:06.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:54, diff=12.041029s, valid=True
2026-05-28T16:58:06.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:58:06.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:58:06.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:12, diff=-5.956152s, valid=True
2026-05-28T16:58:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:58:06.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:57:54, diff=12.050478s, valid=True
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:58:06.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:58:06.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:12, diff=-5.946545s, valid=True
2026-05-28T16:58:06.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:58:06.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:58:06.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:58:06.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912928.054109s, valid=True
2026-05-28T16:58:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:58:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:58:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:58:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:58:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:58:06.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:58:06.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:58:06.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:58:06.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:58:06.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:58:06.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:58:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:58:06.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:58:06.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:58:06.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:58:06.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:58:07.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:58:07.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:58:07.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-28T16:58:07.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-28T16:58:07.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:58:07.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:58:37.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:58:37.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:58:37.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:58:37.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:58:37.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:58:37.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:58:37.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-28T16:58:37.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:58:37.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-28T16:58:37.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:58:37.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:58:37.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:58: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-28T16:58:40.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-28T16:58:40.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:58:40.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:58:40.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:58:40.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:58:40.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:58:40.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:58:40.152 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:58:40.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:58:40.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:58:40.152 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:58:40.152 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:58:40.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:58:40.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:58:40.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:58:40.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:58:40.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:58:40.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:58:40.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:58:40.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:58:40.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:58:40.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:58:40.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:58:40.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:58:40.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:58:25
2026-05-28T16:58:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69518, datetime.datetime(2026, 5, 28, 16, 58, 25), datetime.datetime(2026, 5, 28, 16, 58, 25), 'salt', 14.61, 31.97, None, 8.47, 251.75, 16.52, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:58:40.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:58:40.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:58:40.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:25, diff=15.467624s, valid=True
2026-05-28T16:58:40.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:58:40.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:58:40.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:12, diff=28.47048s, valid=True
2026-05-28T16:58:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:58:40.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:25, diff=15.477101s, valid=True
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:58:40.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:58:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:12, diff=28.480168s, valid=True
2026-05-28T16:58:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:58:40.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:58:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:58:40.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912962.48083s, valid=True
2026-05-28T16:58:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:58:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:58:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:58:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:58:40.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:58:40.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:58:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:58:40.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:58:40.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:58:40.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:58:40.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:58:40.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:58:40.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:58:40.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:58:41.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:58:41.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:58:41.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:58:41.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:58:41.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-28T16:58:41.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-28T16:58:41.635 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:58:41.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:59:11.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:59:11.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:59:11.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:59:12.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:59:12.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:59:12.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:59:12.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-28T16:59:12.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:59:12.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-28T16:59:12.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:59:12.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:59:12.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:59:12.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-28T16:59:14.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T16:59:14.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:59:14.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:59:14.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:59:14.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:59:14.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:59:14.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:59:14.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:59:14.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:59:14.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:59:14.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:59:14.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:59:14.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:59:14.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:59:14.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:59:14.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:59:14.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:59:14.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:59:14.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:59:14.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:59:14.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:59:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:59:14.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:59:14.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:59:15.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:58:56
2026-05-28T16:59:15.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69519, datetime.datetime(2026, 5, 28, 16, 58, 56), datetime.datetime(2026, 5, 28, 16, 58, 56), 'salt', 14.54, 32.17, None, 6.53, 262.42, 16.42, 829.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:59:15.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:59:15.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:59:15.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:56, diff=19.021329s, valid=True
2026-05-28T16:59:15.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:59:15.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:59:15.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:12, diff=3.024193s, valid=True
2026-05-28T16:59:15.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:59:15.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:59:15.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:58:55, diff=20.030768s, valid=True
2026-05-28T16:59:15.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:59:15.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:59:15.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:59:15.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:59:15.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:59:15.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:59:15.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:12, diff=3.033784s, valid=True
2026-05-28T16:59:15.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:59:15.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:59:15.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:59:15.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=912997.034428s, valid=True
2026-05-28T16:59:15.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:59:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:59:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:59:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:59:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:59:15.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:59:15.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:59:15.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:59:15.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:59:15.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:59:15.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:59:15.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:59:15.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:59:15.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:59:15.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:59:15.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:59:16.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:59:16.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:59:16.033 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T16:59:16.033 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:59:16.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:59:16.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T16:59:46.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T16:59:46.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T16:59:46.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T16:59:46.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T16:59:46.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T16:59:46.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T16:59:46.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-28T16:59:46.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T16:59:46.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T16:59:46.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T16:59:46.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T16:59:46.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T16:59:46.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-28T16:59:49.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-28T16:59:49.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T16:59:49.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T16:59:49.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T16:59:49.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T16:59:49.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T16:59:49.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T16:59:49.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T16:59:49.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T16:59:49.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T16:59:49.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T16:59:49.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T16:59:49.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T16:59:49.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T16:59:49.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T16:59:49.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T16:59:49.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:59:49.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:59:49.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T16:59:49.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T16:59:49.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T16:59:49.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T16:59:49.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T16:59:49.431 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T16:59:49.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:59:26
2026-05-28T16:59:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69520, datetime.datetime(2026, 5, 28, 16, 59, 26), datetime.datetime(2026, 5, 28, 16, 59, 26), 'salt', 14.57, 32.6, None, 8.93, 270.18, 16.24, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T16:59:49.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T16:59:49.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T16:59:49.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:26, diff=23.494319s, valid=True
2026-05-28T16:59:49.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T16:59:49.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:59:49.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:12, diff=37.497432s, valid=True
2026-05-28T16:59:49.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T16:59:49.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:25, diff=24.504294s, valid=True
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T16:59:49.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T16:59:49.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:12, diff=37.507427s, valid=True
2026-05-28T16:59:49.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T16:59:49.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T16:59:49.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T16:59:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913031.508126s, valid=True
2026-05-28T16:59:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T16:59:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T16:59:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T16:59:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T16:59:49.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T16:59:49.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T16:59:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T16:59:49.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T16:59:49.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T16:59:49.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T16:59:49.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T16:59:49.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T16:59:49.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T16:59:49.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T16:59:50.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:59:50.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T16:59:50.600 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T16:59:50.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T16:59:50.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-28T16:59:50.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T16:59:50.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T16:59:50.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:00:20.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:00:20.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:00:20.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:00:20.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:00:20.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:00:21.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:00: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-28T17:00:21.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:00: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-28T17:00:21.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:00:21.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:00:21.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:00: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-28T17:00:23.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-28T17:00:23.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:00:23.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:00:23.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:00:23.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:00:23.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:00:23.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:00:23.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:00:23.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:00:23.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:00:23.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:00:23.614 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:00:23.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:00:23.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:00:23.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:00:23.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:00:23.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:00:23.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:00:23.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:00:23.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:00:23.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:00:23.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:00:23.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:00:23.866 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:00:23.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 16:59:57
2026-05-28T17:00:23.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69521, datetime.datetime(2026, 5, 28, 16, 59, 57), datetime.datetime(2026, 5, 28, 16, 59, 56), 'salt', 14.54, 31.91, None, 8.4, 290.66, 16.53, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:00:23.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:00:23.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:00:23.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:56, diff=27.928849s, valid=True
2026-05-28T17:00:23.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:00:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:00:23.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:00:12, diff=11.93169s, valid=True
2026-05-28T17:00:23.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:00:23.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 16:59:56, diff=27.938197s, valid=True
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:00:23.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:00:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:00:12, diff=11.941229s, valid=True
2026-05-28T17:00:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:00:23.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:00:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:00:23.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913065.941891s, valid=True
2026-05-28T17:00:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:00:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:00:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:00:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:00:23.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:00:24.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:00:24.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:00:24.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:00:24.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:00:24.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:00:24.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:00:24.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:00:24.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:00:24.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:00:24.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:00:24.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:00:24.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:00:24.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:00:24.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-28T17:00:24.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:00:25.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:00:25.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:00:55.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:00:55.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:00:55.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:00:55.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:00:55.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:00:55.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:00:55.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-28T17:00:55.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:00:55.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-28T17:00:55.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:00:55.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:00:55.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:00:55.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-28T17:00:58.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:00:58.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:00:58.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:00:58.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:00:58.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:00:58.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:00:58.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:00:58.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:00:58.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:00:58.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:00:58.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:00:58.220 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:00:58.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:00:58.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:00:58.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:00:58.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:00:58.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:00:58.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:00:58.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:00:58.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:00:58.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:00:58.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:00:58.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:00:58.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:00:58.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:00:57
2026-05-28T17:00:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69523, datetime.datetime(2026, 5, 28, 17, 0, 57), datetime.datetime(2026, 5, 28, 17, 0, 57), 'salt', 14.44, 30.95, None, 7.84, 274.19, 16.93, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:00:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:00:58.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:00:58.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:00:57, diff=1.533378s, valid=True
2026-05-28T17:00:58.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:00:58.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:00:58.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:12, diff=-13.463775s, valid=True
2026-05-28T17:00:58.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:00:58.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:00:58.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:00:56, diff=2.54282s, valid=True
2026-05-28T17:00:58.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:00:58.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:00:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:00:58.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:00:58.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:00:58.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:00:58.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:12, diff=-13.454152s, valid=True
2026-05-28T17:00:58.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:00:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:00:58.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:00:58.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913100.546511s, valid=True
2026-05-28T17:00:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:00:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:00:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:00:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:00:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:00:58.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:00:58.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:00:58.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:00:58.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:00:58.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:00:58.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:00:58.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:00:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:00:58.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:00:59.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:00:59.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:00:59.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:00:59.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:00:59.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-28T17:00:59.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-28T17:00:59.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:00:59.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:01:29.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:01:29.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:01:29.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:01:30.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:01:30.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:01:30.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:01:30.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-28T17:01:30.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:01:30.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-28T17:01:30.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:01:30.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:01:30.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:01:30.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-28T17:01:33.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-28T17:01:33.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:01:33.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:01:33.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:01:33.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:01:33.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:01:33.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:01:33.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:01:33.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:01:33.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:01:33.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:01:33.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:01:33.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:01:33.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:01:33.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:01:33.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:01:33.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:01:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:01:33.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:01:33.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:01:33.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:01:33.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:01:33.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:01:33.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:01:33.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:01:27
2026-05-28T17:01:33.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69524, datetime.datetime(2026, 5, 28, 17, 1, 27), datetime.datetime(2026, 5, 28, 17, 1, 27), 'salt', 14.34, 31.11, None, 7.48, 268.16, 16.85, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:01:33.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:01:33.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:01:33.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:27, diff=6.731805s, valid=True
2026-05-28T17:01:33.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:01:33.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:01:33.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:12, diff=21.734677s, valid=True
2026-05-28T17:01:33.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:01:33.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:26, diff=7.741329s, valid=True
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:01:33.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:01:33.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:12, diff=21.744347s, valid=True
2026-05-28T17:01:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:01:33.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:01:33.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:01:33.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913135.745004s, valid=True
2026-05-28T17:01:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:01:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:01:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:01:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:01:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:01:33.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:01:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:01:33.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:01:33.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:01:33.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:01:33.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:01:33.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:01:34.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:01:34.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:01:34.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:01:34.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:01:34.729 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:01:34.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:01:34.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-28T17:01:34.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-28T17:01:35.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:01:35.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:02:05.056 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:02:05.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:02:05.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:02:05.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:02:05.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:02:05.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:02:05.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-28T17:02:05.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:02:05.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-28T17:02:05.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:02:05.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:02:05.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:02:05.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:02: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-28T17:02:08.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:02:08.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:02:08.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:02:08.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:02:08.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:02:08.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:02:08.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:02:08.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:02:08.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:02:08.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:02:08.220 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:02:08.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:02:08.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:02:08.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:02:08.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:02:08.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:02:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:02:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:02:08.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:02:08.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:02:08.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:02:08.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:02:08.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:02:08.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:01:57
2026-05-28T17:02:08.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69525, datetime.datetime(2026, 5, 28, 17, 1, 57), datetime.datetime(2026, 5, 28, 17, 1, 57), 'salt', 14.24, 31.38, None, 6.32, 247.89, 16.72, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:02:08.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:02:08.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:02:08.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:57, diff=11.535716s, valid=True
2026-05-28T17:02:08.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:02:08.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:02:08.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:12, diff=-3.461446s, valid=True
2026-05-28T17:02:08.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:02:08.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:01:57, diff=11.545081s, valid=True
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:02:08.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:02:08.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:12, diff=-3.451974s, valid=True
2026-05-28T17:02:08.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:02:08.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:02:08.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:02:08.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913170.548698s, valid=True
2026-05-28T17:02:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:02:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:02:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:02:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:02:08.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:02:08.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:02:08.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:02:08.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:02:08.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:02:08.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:02:08.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:02:08.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:02:08.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:02:08.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:02:09.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:02:09.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:02:09.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:02:09.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:02:09.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:02:09.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:02:09.689 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:02:09.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:02:39.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:02:39.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:02:39.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:02:39.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:02:39.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:02:40.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:02:40.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-28T17:02:40.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:02:40.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-28T17:02:40.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:02:40.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:02:40.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:02:40.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-28T17:02:42.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:02:42.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:02:42.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:02:42.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:02:42.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:02:42.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:02:42.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:02:42.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:02:42.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:02:42.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:02:42.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:02:42.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:02:42.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:02:42.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:02:42.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:02:42.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:02:42.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:02:42.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:02:42.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:02:42.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:02:42.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:02:42.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:02:42.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:02:42.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:02:43.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:02:28
2026-05-28T17:02:43.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69526, datetime.datetime(2026, 5, 28, 17, 2, 28), datetime.datetime(2026, 5, 28, 17, 2, 27), 'salt', 14.24, 31.54, None, 5.3, 266.22, 16.65, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:02:43.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:02:43.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:02:43.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:27, diff=16.058489s, valid=True
2026-05-28T17:02:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:02:43.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:02:43.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:12, diff=31.061521s, valid=True
2026-05-28T17:02:43.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:02:43.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:27, diff=16.06815s, valid=True
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:02:43.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:02:43.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:12, diff=31.071165s, valid=True
2026-05-28T17:02:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:02:43.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:02:43.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:02:43.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913205.071839s, valid=True
2026-05-28T17:02:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:02:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:02:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:02:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:02:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:02:43.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:02:43.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:02:43.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:02:43.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:02:43.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:02:43.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:02:43.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:02:43.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:02:43.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:02:43.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:02:44.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:02:44.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:02:44.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:02:44.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-28T17:02:44.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-28T17:02:44.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:02:44.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:03:14.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:03:14.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:03:14.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:03:14.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:03:14.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:03:14.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:03:14.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:03:14.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:03:14.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-28T17:03:14.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:03:14.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:03:14.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:03:14.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-28T17:03:17.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-28T17:03:17.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:03:17.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:03:17.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:03:17.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:03:17.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:03:17.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:03:17.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:03:17.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:03:17.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:03:17.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:03:17.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:03:17.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:03:17.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:03:17.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:03:17.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:03:17.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:03:17.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:03:17.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:03:17.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:03:17.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:03:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:03:17.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:03:17.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:03:17.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:02:58
2026-05-28T17:03:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69527, datetime.datetime(2026, 5, 28, 17, 2, 58), datetime.datetime(2026, 5, 28, 17, 2, 57), 'salt', 14.28, 32.3, None, 5.4, 245.4, 16.34, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:03:17.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:03:17.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:03:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:57, diff=20.695947s, valid=True
2026-05-28T17:03:17.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:03:17.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:03:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:12, diff=5.698799s, valid=True
2026-05-28T17:03:17.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:03:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:02:57, diff=20.705324s, valid=True
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:03:17.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:03:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:12, diff=5.708385s, valid=True
2026-05-28T17:03:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:03:17.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:03:17.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:03:17.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913239.709047s, valid=True
2026-05-28T17:03:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:03:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:03:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:03:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:03:17.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:03:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:03:17.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:03:17.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:03:17.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:03:17.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:03:17.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:03:17.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:03:17.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:03:18.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:03:18.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:03:18.599 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:03:18.699 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:03:18.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:03:18.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-28T17:03:18.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-28T17:03:18.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:03:18.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:03:48.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:03:48.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:03:48.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:03:48.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:03:48.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:03:49.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:03:49.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-28T17:03:49.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:03:49.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-28T17:03:49.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:03:49.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:03:49.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:03:49.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-28T17:03:51.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-28T17:03:51.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:03:51.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:03:51.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:03:51.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:03:51.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:03:51.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:03:51.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:03:51.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:03:51.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:03:51.906 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:03:51.906 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:03:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:03:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:03:51.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:03:52.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:03:52.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:03:52.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:03:52.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:03:52.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:03:52.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:03:52.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:03:52.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:03:52.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:03:52.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:03:28
2026-05-28T17:03:52.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69528, datetime.datetime(2026, 5, 28, 17, 3, 28), datetime.datetime(2026, 5, 28, 17, 3, 28), 'salt', 14.37, 31.61, None, 4.77, 227.21, 16.64, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:03:52.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:03:52.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:03:52.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:28, diff=24.244368s, valid=True
2026-05-28T17:03:52.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:03:52.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:03:52.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:12, diff=40.247309s, valid=True
2026-05-28T17:03:52.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:03:52.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:27, diff=25.254102s, valid=True
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:03:52.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:03:52.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:12, diff=40.257193s, valid=True
2026-05-28T17:03:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:03:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:03:52.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:03:52.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913274.25791s, valid=True
2026-05-28T17:03:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:03:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:03:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:03:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:03:52.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:03:52.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:03:52.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:03:52.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:03:52.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:03:52.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:03:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:03:52.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:03:52.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:03:52.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:03:52.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:03:53.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:03:53.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:03:53.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:03:53.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-28T17:03:53.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-28T17:03:53.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:03:53.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:04:23.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:04:23.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:04:23.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:04:23.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:04:23.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:04:23.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:04:23.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-28T17:04:23.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:04:23.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-28T17:04:24.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:04:24.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:04:24.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:04:24.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-28T17:04:26.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-28T17:04:26.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:04:26.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:04:26.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:04:26.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:04:26.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:04:26.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:04:26.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:04:26.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:04:26.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:04:26.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:04:26.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:04:26.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:04:26.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:04:26.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:04:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:04:26.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:04:26.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:04:26.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:04:26.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:04:26.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:04:26.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:04:26.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:04:26.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:04:26.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:03:58
2026-05-28T17:04:26.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69529, datetime.datetime(2026, 5, 28, 17, 3, 58), datetime.datetime(2026, 5, 28, 17, 3, 58), 'salt', 14.41, 31.08, None, 5.86, 297.65, 16.87, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:04:26.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:04:26.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:04:26.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:58, diff=28.789097s, valid=True
2026-05-28T17:04:26.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:04:26.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:04:26.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:04:12, diff=14.791994s, valid=True
2026-05-28T17:04:26.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:04:26.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:03:58, diff=28.798544s, valid=True
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:04:26.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:04:26.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:04:26.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:04:12, diff=14.801632s, valid=True
2026-05-28T17:04:26.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:04:26.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:04:26.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:04:26.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913308.802304s, valid=True
2026-05-28T17:04:26.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:04:26.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:04:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:04:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:04:26.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:04:26.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:04:26.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:04:26.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:04:26.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:04:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:04:27.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:04:27.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:04:27.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:04:27.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:04:27.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:04:27.701 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:04:27.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:04:27.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:04:27.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-28T17:04:27.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-28T17:04:27.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:04:27.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:04:58.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:04:58.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:04:58.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:04:58.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:04:58.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:04:58.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:04:58.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-28T17:04:58.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:04:58.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:04:58.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:04:58.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:04:58.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:04:58.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-28T17:05:00.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-28T17:05:00.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:05:00.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:05:00.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:05:00.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:05:00.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:05:00.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:05:00.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:05:00.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:05:00.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:05:00.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:05:00.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:05:00.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:05:00.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:05:00.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:05:00.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:05:00.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:05:00.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:05:00.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:05:01.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:05:01.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:05:01.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:05:01.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:05:01.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:05:01.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:04:59
2026-05-28T17:05:01.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69531, datetime.datetime(2026, 5, 28, 17, 4, 59), datetime.datetime(2026, 5, 28, 17, 4, 58), 'salt', 14.51, 32.7, None, 5.9, 253.51, 16.2, 829.95, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:05:01.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:05:01.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:05:01.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:04:58, diff=3.09029s, valid=True
2026-05-28T17:05:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:05:01.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:05:01.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:12, diff=-10.906213s, valid=True
2026-05-28T17:05:01.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:05:01.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:04:58, diff=3.101137s, valid=True
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:05:01.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:05:01.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:12, diff=-10.895811s, valid=True
2026-05-28T17:05:01.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:05:01.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:05:01.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:05:01.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913343.104849s, valid=True
2026-05-28T17:05:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:05:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:05:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:05:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:05:01.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:05:01.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:05:01.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:05:01.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:05:01.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:05:01.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:05:01.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:05:01.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:05:01.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:05:01.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:05:01.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:05:02.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:05:02.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:05:02.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:05:02.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-28T17:05:02.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-28T17:05:02.503 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:05:02.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:05:32.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:05:32.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:05:32.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:05:32.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:05:32.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:05:33.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:05:33.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-28T17:05:33.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:05:33.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-28T17:05:33.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:05:33.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:05:33.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:05:33.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-28T17:05:35.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-28T17:05:35.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:05:35.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:05:35.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:05:35.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:05:35.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:05:35.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:05:35.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:05:35.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:05:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:05:35.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:05:35.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:05:35.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:05:35.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:05:35.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:05:35.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:05:35.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:05:35.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:05:35.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:05:35.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:05:35.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:05:35.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:05:35.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:05:35.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:05:35.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:05:29
2026-05-28T17:05:35.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69532, datetime.datetime(2026, 5, 28, 17, 5, 29), datetime.datetime(2026, 5, 28, 17, 5, 29), 'salt', 14.47, 32.34, None, 6.57, 271.12, 16.34, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:05:35.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:05:35.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:05:35.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:29, diff=6.832846s, valid=True
2026-05-28T17:05:35.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:05:35.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:05:35.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:12, diff=23.835702s, valid=True
2026-05-28T17:05:35.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:05:35.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:28, diff=7.842418s, valid=True
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:05:35.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:05:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:12, diff=23.845498s, valid=True
2026-05-28T17:05:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:05:35.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:05:35.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:05:35.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913377.846193s, valid=True
2026-05-28T17:05:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:05:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:05:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:05:35.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:05:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:05:35.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:05:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:05:35.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:05:35.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:05:35.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:05:36.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:05:36.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:05:36.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:05:36.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:05:36.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:05:36.731 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:05:36.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:05:36.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:05:36.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-28T17:05:36.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-28T17:05:37.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:05:37.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:06:07.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:06:07.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:06:07.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:06:07.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:06:07.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:06:07.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:06:07.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-28T17:06:07.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:06:07.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-28T17:06:07.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:06:07.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:06:07.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:06:07.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-28T17:06:10.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-28T17:06:10.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:06:10.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:06:10.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:06:10.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:06:10.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:06:10.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:06:10.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:06:10.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:06:10.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:06:10.029 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:06:10.029 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:06:10.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:06:10.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:06:10.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:06:10.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:06:10.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:06:10.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:06:10.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:06:10.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:06:10.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:06:10.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:06:10.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:06:10.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:06:10.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:05:59
2026-05-28T17:06:10.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69533, datetime.datetime(2026, 5, 28, 17, 5, 59), datetime.datetime(2026, 5, 28, 17, 5, 59), 'salt', 14.51, 32.87, None, 7.69, 252.72, 16.13, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:06:10.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:06:10.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:06:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:59, diff=11.355095s, valid=True
2026-05-28T17:06:10.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:06:10.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:06:10.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:12, diff=-1.64205s, valid=True
2026-05-28T17:06:10.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:06:10.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:05:59, diff=11.36451s, valid=True
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:06:10.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:06:10.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:12, diff=-1.632466s, valid=True
2026-05-28T17:06:10.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:06:10.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:06:10.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:06:10.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913412.368197s, valid=True
2026-05-28T17:06:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:06:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:06:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:06:10.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:06:10.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:06:10.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:06:10.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:06:10.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:06:10.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:06:10.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:06:10.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:06:10.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:06:10.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:06:10.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:06:11.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:06:11.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:06:11.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:06:11.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:06:11.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-28T17:06:11.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-28T17:06:11.649 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:06:11.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:06:41.679 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:06:41.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:06:41.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:06:41.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:06:41.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:06:42.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:06:42.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-28T17:06:42.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:06:42.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-28T17:06:42.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:06:42.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:06:42.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:06:42.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-28T17:06:44.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-28T17:06:44.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:06:44.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:06:44.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:06:44.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:06:44.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:06:44.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:06:44.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:06:44.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:06:44.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:06:44.518 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:06:44.518 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:06:44.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:06:44.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:06:44.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:06:44.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:06:44.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:06:44.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:06:44.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:06:44.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:06:44.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:06:44.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:06:44.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:06:44.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:06:44.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:06:29
2026-05-28T17:06:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69534, datetime.datetime(2026, 5, 28, 17, 6, 29), datetime.datetime(2026, 5, 28, 17, 6, 29), 'salt', 14.44, 31.24, None, 5.68, 284.29, 16.8, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:06:44.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:06:44.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:06:44.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:29, diff=15.831295s, valid=True
2026-05-28T17:06:44.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:06:44.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:06:44.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:12, diff=32.834194s, valid=True
2026-05-28T17:06:44.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:06:44.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:06:44.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:29, diff=15.8409s, valid=True
2026-05-28T17:06:44.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:06:44.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:06:44.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:06:44.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:06:44.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:06:44.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:06:44.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:12, diff=32.843966s, valid=True
2026-05-28T17:06:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:06:44.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:06:44.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:06:44.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913446.844629s, valid=True
2026-05-28T17:06:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:06:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:06:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:06:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:06:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:06:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:06:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:06:44.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:06:44.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:06:44.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:06:45.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:06:45.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:06:45.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:06:45.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:06:45.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:06:45.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:06:45.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:06:45.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:06:45.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-28T17:06:45.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-28T17:06:46.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:06:46.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:07:16.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:07:16.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:07:16.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:07:16.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:07:16.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:07:16.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:07:16.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-28T17:07:16.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:07: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-28T17:07:16.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:07:16.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:07:16.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:07:16.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-28T17:07:19.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-28T17:07:19.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:07:19.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:07:19.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:07:19.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:07:19.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:07:19.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:07:19.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:07:19.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:07:19.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:07:19.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:07:19.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:07:19.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:07:19.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:07:19.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:07:19.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:07:19.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:07:19.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:07:19.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:07:19.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:07:19.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:07:19.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:07:19.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:07:19.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:07:19.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:07:00
2026-05-28T17:07:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69535, datetime.datetime(2026, 5, 28, 17, 7), datetime.datetime(2026, 5, 28, 17, 6, 59), 'salt', 14.47, 31.64, None, 6.5, 287.34, 16.63, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:07:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:07:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:07:19.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:59, diff=20.623763s, valid=True
2026-05-28T17:07:19.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:07:19.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:07:19.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:12, diff=7.626639s, valid=True
2026-05-28T17:07:19.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:07:19.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:06:59, diff=20.633239s, valid=True
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:07:19.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:07:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:12, diff=7.636243s, valid=True
2026-05-28T17:07:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:07:19.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:07:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:07:19.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913481.636898s, valid=True
2026-05-28T17:07:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:07:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:07:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:07:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:07:19.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:07:19.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:07:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:07:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:07:19.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:07:19.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:07:19.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:07:19.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:07:19.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:07:19.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:07:20.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:07:20.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:07:20.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:07:20.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:07:20.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-28T17:07:20.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-28T17:07:20.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:07:20.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:07:50.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:07:50.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:07:50.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:07:51.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:07:51.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:07:51.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:07:51.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:07:51.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:07:51.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-28T17:07:51.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:07:51.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:07:51.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:07:51.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-28T17:07: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-28T17:07:53.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:07:53.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:07:53.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:07:53.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:07:53.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:07:53.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:07:53.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:07:53.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:07:53.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:07:53.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:07:53.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:07:53.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:07:53.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:07:53.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:07:53.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:07:53.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:07:53.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:07:53.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:07:54.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:07:54.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:07:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:07:54.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:07:54.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:07:54.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:07:30
2026-05-28T17:07:54.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69536, datetime.datetime(2026, 5, 28, 17, 7, 30), datetime.datetime(2026, 5, 28, 17, 7, 29), 'salt', 14.41, 32.77, None, 9.18, 270.08, 16.16, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:07:54.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:07:54.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:07:54.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:29, diff=25.102859s, valid=True
2026-05-28T17:07:54.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:07:54.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:07:54.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:12, diff=42.106727s, valid=True
2026-05-28T17:07:54.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:07:54.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:07:54.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:29, diff=25.113913s, valid=True
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:07:54.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:07:54.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:07:12, diff=42.116983s, valid=True
2026-05-28T17:07:54.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:07:54.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:07:54.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:07:54.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913516.117671s, valid=True
2026-05-28T17:07:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:07:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:07:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:07:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:07:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:07:54.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:07:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:07:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:07:54.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:07:54.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:07:54.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:07:54.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:07:54.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:07:54.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:07:54.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:07:55.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:07:55.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:07:55.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:07:55.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-28T17:07:55.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-28T17:07:55.519 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:07:55.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:08:25.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:08:25.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:08:25.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:08:25.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:08:25.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:08:26.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:08:26.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-28T17:08:26.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:08:26.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-28T17:08:26.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:08:26.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:08:26.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:08:26.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-28T17:08:28.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-28T17:08:28.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:08:28.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:08:28.470 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:08:28.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:08:28.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:08:28.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:08:28.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:08:28.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:08:28.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:08:28.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:08:28.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:08:28.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:08:28.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:08:28.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:08:28.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:08:28.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:08:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:08:28.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:08:28.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:08:28.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:08:28.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:08:28.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:08:28.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:08:28.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:08:00
2026-05-28T17:08:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69537, datetime.datetime(2026, 5, 28, 17, 8), datetime.datetime(2026, 5, 28, 17, 8), 'salt', 14.44, 31.94, None, 8.75, 274.7, 16.51, 830.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:08:28.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:08:28.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:08:28.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:08:00, diff=28.866182s, valid=True
2026-05-28T17:08:28.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:08:28.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:08:28.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:08:12, diff=16.869021s, valid=True
2026-05-28T17:08:28.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:08:28.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:08:00, diff=28.875572s, valid=True
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:08:28.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:08:28.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:08:28.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:08:12, diff=16.878591s, valid=True
2026-05-28T17:08:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:08:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:08:28.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:08:28.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913550.879244s, valid=True
2026-05-28T17:08:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:08:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:08:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:08:28.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:08:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:08:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:08:28.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:08:28.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:08:28.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:08:29.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:08:29.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:08:29.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:08:29.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:08:29.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:08:29.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:08:29.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:08:29.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:08:29.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:08:29.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-28T17:08:29.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-28T17:08:30.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:08:30.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:09:00.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:09:00.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:09:00.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:09:00.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:09:00.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:09:00.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:09:00.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-28T17:09:00.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:09:00.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-28T17:09:00.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:09:00.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:09:00.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:09:00.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-28T17:09:03.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-28T17:09:03.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:09:03.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:09:03.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:09:03.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:09:03.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:09:03.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:09:03.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:09:03.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:09:03.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:09:03.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:09:03.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:09:03.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:09:03.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:09:03.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:09:03.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:09:03.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:09:03.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:09:03.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:09:03.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:09:03.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:09:03.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:09:03.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:09:03.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:09:03.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:09:00
2026-05-28T17:09:03.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69539, datetime.datetime(2026, 5, 28, 17, 9), datetime.datetime(2026, 5, 28, 17, 9), 'salt', 14.14, 32.73, None, 9.81, 256.63, 16.13, 830.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:09:03.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:09:03.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:09:03.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:00, diff=3.726309s, valid=True
2026-05-28T17:09:03.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:09:03.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:09:03.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:12, diff=-8.270788s, valid=True
2026-05-28T17:09:03.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:09:03.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:09:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:08:51, diff=12.735705s, valid=True
2026-05-28T17:09:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:09:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:09:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:09:03.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:09:03.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:09:03.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:09:03.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:12, diff=-8.261263s, valid=True
2026-05-28T17:09:03.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:09:03.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:09:03.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:09:03.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913585.739389s, valid=True
2026-05-28T17:09:03.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:09:03.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:09:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:09:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:09:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:09:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:09:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:09:03.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:09:03.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:09:03.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:09:03.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:09:03.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:09:04.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:09:04.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:09:04.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:09:04.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:09:04.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:09:04.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:09:04.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-28T17:09:04.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-28T17:09:04.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:09:04.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:09:34.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:09:34.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:09:34.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:09:35.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:09:35.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:09:35.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:09:35.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-28T17:09:35.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:09:35.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:09:35.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:09:35.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:09:35.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:09:35.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-28T17:09:37.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-28T17:09:37.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:09:37.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:09:37.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:09:37.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:09:37.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:09:37.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:09:37.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:09:37.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:09:37.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:09:37.901 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:09:37.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:09:37.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:09:37.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:09:37.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:09:38.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:09:38.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:09:38.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:09:38.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:09:38.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:09:38.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:09:38.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:09:38.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:09:38.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:09:38.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:09:31
2026-05-28T17:09:38.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69540, datetime.datetime(2026, 5, 28, 17, 9, 31), datetime.datetime(2026, 5, 28, 17, 9, 30), 'salt', 14.11, 33.5, None, 9.39, 252.2, 15.82, 830.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:09:38.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:09:38.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:09:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:30, diff=8.218787s, valid=True
2026-05-28T17:09:38.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:09:38.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:09:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:12, diff=26.221686s, valid=True
2026-05-28T17:09:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:09:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:09:38.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:31, diff=7.229647s, valid=True
2026-05-28T17:09:38.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:09:38.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:09:38.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:09:38.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:09:38.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:09:38.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:09:38.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:09:12, diff=26.236769s, valid=True
2026-05-28T17:09:38.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:09:38.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:09:38.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:09:38.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913620.238165s, valid=True
2026-05-28T17:09:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:09:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:09:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:09:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:09:38.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:09:38.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:09:38.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:09:38.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:09:38.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:09:38.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:09:38.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:09:38.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:09:38.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:09:38.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:09:38.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:09:39.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:09:39.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:09:39.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:09:39.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-28T17:09:39.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-28T17:09:39.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:09:39.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:10:09.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:10:09.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:10:09.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:10:09.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:10:09.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:10:09.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:10:09.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-28T17:10:09.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:10:09.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:10:09.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:10:09.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:10:09.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:10:09.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-28T17:10:12.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-28T17:10:12.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:10:12.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:10:12.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:10:12.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:10:12.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:10:12.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:10:12.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:10:12.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:10:12.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:10:12.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:10:12.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:10:12.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:10:12.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:10:12.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:10:12.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:10:12.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:10:12.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:10:12.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:10:12.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:10:12.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:10:12.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:10:12.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:10:12.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:10:12.713 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:10:01
2026-05-28T17:10:12.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69541, datetime.datetime(2026, 5, 28, 17, 10, 1), datetime.datetime(2026, 5, 28, 17, 10, 1), 'salt', 14.04, 33.7, None, 10.73, 246.67, 15.73, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:10:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:10:12.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:10:12.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:01, diff=11.719829s, valid=True
2026-05-28T17:10:12.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:10:12.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:10:12.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:12, diff=0.72275s, valid=True
2026-05-28T17:10:12.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:10:12.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:01, diff=11.729358s, valid=True
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:10:12.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:10:12.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:12, diff=0.732398s, valid=True
2026-05-28T17:10:12.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:10:12.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:10:12.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:10:12.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913654.733073s, valid=True
2026-05-28T17:10:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:10:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:10:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:10:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:10:12.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:10:12.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:10:12.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:10:12.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:10:12.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:10:12.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:10:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:10:13.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:10:13.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:10:13.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:10:13.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:10:13.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:10:13.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:10:13.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:10:13.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-28T17:10:13.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-28T17:10:13.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:10:13.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:10:43.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:10:43.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:10:43.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:10:44.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:10:44.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:10:44.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:10:44.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-28T17:10:44.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:10:44.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-28T17:10:44.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:10:44.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:10:44.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:10:44.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-28T17:10:47.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-28T17:10:47.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:10:47.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:10:47.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:10:47.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:10:47.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:10:47.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:10:47.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:10:47.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:10:47.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:10:47.074 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:10:47.074 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:10:47.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:10:47.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:10:47.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:10:47.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:10:47.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:10:47.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:10:47.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:10:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:10:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:10:47.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:10:47.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:10:47.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:10:47.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:10:31
2026-05-28T17:10:47.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69542, datetime.datetime(2026, 5, 28, 17, 10, 31), datetime.datetime(2026, 5, 28, 17, 10, 31), 'salt', 13.91, 34.39, None, 10.69, 246.39, 15.44, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:10:47.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:10:47.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:10:47.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:31, diff=16.401845s, valid=True
2026-05-28T17:10:47.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:10:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:10:47.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:12, diff=35.404891s, valid=True
2026-05-28T17:10:47.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:10:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:10:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:31, diff=16.411631s, valid=True
2026-05-28T17:10:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:10:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:10:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:10:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:10:47.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:10:47.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:10:47.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:10:12, diff=35.414751s, valid=True
2026-05-28T17:10:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:10:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:10:47.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:10:47.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913689.415407s, valid=True
2026-05-28T17:10:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:10:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:10:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:10:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:10:47.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:10:47.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:10:47.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:10:47.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:10:47.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:10:47.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:10:47.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:10:47.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:10:47.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:10:47.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:10:47.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:10:48.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:10:48.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:10:48.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:10:48.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-28T17:10:48.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-28T17:10:48.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:10:48.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:11:18.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:11:18.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:11:18.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:11:18.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:11:18.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:11:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:11:19.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-28T17:11:19.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:11:19.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-28T17:11:19.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:11:19.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:11:19.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:11:19.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-28T17:11:22.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:11:22.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:11:22.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:11:22.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:11:22.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:11:22.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:11:22.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17: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-28T17:11:22.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:11:22.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:11:22.282 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:11:22.282 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:11:22.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:11:22.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:11:22.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:11:22.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:11:22.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:11:22.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:11:22.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:11:22.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:11:22.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:11:22.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:11:22.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:11:22.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:11:22.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:11:01
2026-05-28T17:11:22.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69543, datetime.datetime(2026, 5, 28, 17, 11, 1), datetime.datetime(2026, 5, 28, 17, 11, 1), 'salt', 13.91, 34.76, None, 11.4, 246.69, 15.29, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:11:22.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:11:22.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:11:22.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:01, diff=21.600929s, valid=True
2026-05-28T17:11:22.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:11:22.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:11:22.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:12, diff=10.603841s, valid=True
2026-05-28T17:11:22.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:11:22.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:01, diff=21.610492s, valid=True
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:11:22.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:11:22.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:12, diff=10.613574s, valid=True
2026-05-28T17:11:22.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:11:22.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:11:22.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:11:22.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913724.614257s, valid=True
2026-05-28T17:11:22.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:11:22.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:11:22.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:11:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:11:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:11:22.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:11:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:11:22.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:11:22.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:11:22.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:11:22.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:11:22.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:11:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:11:23.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:11:23.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:11:23.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:11:23.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:11:23.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:11:23.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-28T17:11:23.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-28T17:11:23.825 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:11:23.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:11:53.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:11:53.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:11:53.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:11:53.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:11:53.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:11:54.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:11:54.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-28T17:11:54.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:11:54.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-28T17:11:54.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:11:54.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:11:54.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:11:54.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-28T17:11:56.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-28T17:11:56.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:11:56.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:11:56.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:11:56.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:11:56.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:11:56.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:11:56.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:11:56.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:11:56.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:11:56.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:11:56.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:11:56.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:11:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:11:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:11:56.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:11:56.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:11:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:11:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:11:56.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:11:56.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:11:56.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:11:56.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:11:56.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:11:56.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:11:32
2026-05-28T17:11:56.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69544, datetime.datetime(2026, 5, 28, 17, 11, 32), datetime.datetime(2026, 5, 28, 17, 11, 31), 'salt', 13.85, 35.05, None, 10.83, 259.82, 15.18, 830.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:11:56.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:11:56.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:11:56.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:31, diff=25.947161s, valid=True
2026-05-28T17:11:56.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:11:56.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:11:56.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:12, diff=44.950038s, valid=True
2026-05-28T17:11:56.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:11:56.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:11:56.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:31, diff=25.956742s, valid=True
2026-05-28T17:11:56.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:11:56.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:11:56.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:11:56.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:11:56.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:11:56.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:11:56.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:12, diff=44.959803s, valid=True
2026-05-28T17:11:56.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:11:56.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:11:56.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:11:56.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913758.960459s, valid=True
2026-05-28T17:11:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:11:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:11:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:11:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:11:56.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:11:57.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:11:57.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:11:57.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:11:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:11:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:11:57.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:11:57.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:11:57.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:11:57.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:11:57.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:11:57.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:11:57.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:11:57.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:11:57.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-28T17:11:57.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-28T17:11:58.111 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:11:58.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:12:28.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:12:28.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:12:28.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:12:28.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:12:28.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:12:28.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:12:28.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-28T17:12:28.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:12:28.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-28T17:12:28.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:12:28.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:12:28.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:12:28.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-28T17:12:30.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-28T17:12:30.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:12:30.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:12:30.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:12:30.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:12:30.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:12:31.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:12:31.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:12:31.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:12:31.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:12:31.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:12:31.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:12:31.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:12:31.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:12:31.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:12:31.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:12:31.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:12:31.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:12:31.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:12:31.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T17:12:31.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:12:31.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:12:31.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:12:31.326 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:12:31.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:12:02
2026-05-28T17:12:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69545, datetime.datetime(2026, 5, 28, 17, 12, 2), datetime.datetime(2026, 5, 28, 17, 12, 1), 'salt', 13.81, 35.22, None, 11.5, 258.3, 15.1, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:12:31.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:12:31.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:12:31.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:01, diff=30.393139s, valid=True
2026-05-28T17:12:31.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:12:31.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:12:31.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=19.396508s, valid=True
2026-05-28T17:12:31.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:12:31.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:11:59, diff=32.404396s, valid=True
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:12:31.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T17:12:31.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=19.407965s, valid=True
2026-05-28T17:12:31.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:12:31.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:12:31.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:12:31.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913793.408786s, valid=True
2026-05-28T17:12:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:12:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:12:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:12:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:12:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:12:31.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:12:31.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:12:31.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:12:31.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:12:31.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:12:31.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:12:31.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:12:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:12:31.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:12:31.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:12:32.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:12:32.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:12:32.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:12:32.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-28T17:12:32.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-28T17:12:32.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:12:32.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:13:02.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:13:02.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:13:02.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:13:02.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:13:02.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:13:03.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:13:03.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-28T17:13:03.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:13:03.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-28T17:13:03.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:13:03.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:13:03.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:13:03.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:13:05.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-28T17:13:05.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:13:05.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:13:05.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:13:05.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:13:05.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:13:05.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:13:05.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:13:05.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:13:05.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:13:05.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:13:05.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:13:05.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:13:05.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:13:05.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:13:05.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:13:05.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:13:05.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:13:05.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:13:05.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:13:05.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:13:05.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:13:05.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:13:05.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:13:05.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:13:02
2026-05-28T17:13:05.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69547, datetime.datetime(2026, 5, 28, 17, 13, 2), datetime.datetime(2026, 5, 28, 17, 13, 2), 'salt', 13.88, 35.52, None, 9.64, 248.67, 15.0, 830.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:13:05.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:13:05.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:13:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:13:02, diff=3.772287s, valid=True
2026-05-28T17:13:05.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:13:05.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:13:05.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=53.775154s, valid=True
2026-05-28T17:13:05.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:13:05.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:13:05.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:13:02, diff=3.781787s, valid=True
2026-05-28T17:13:05.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:13:05.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:13:05.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:13:05.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:13:05.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:13:05.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:13:05.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=53.78484s, valid=True
2026-05-28T17:13:05.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:13:05.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:13:05.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:13:05.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913827.785492s, valid=True
2026-05-28T17:13:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:13:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:13:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:13:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:13:05.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:13:05.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:13:05.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:13:05.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:13:05.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:13:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:13:05.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:13:06.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:13:06.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:13:06.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:13:06.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:13:06.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:13:06.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:13:06.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:13:06.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:13:06.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:13:06.918 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:13:06.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:13:36.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:13:36.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:13:36.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:13:37.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:13:37.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:13:37.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:13:37.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-28T17:13:37.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:13:37.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-28T17:13:37.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:13:37.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:13:37.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:13:37.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-28T17:13: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-28T17:13:39.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:13:39.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:13:39.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:13:39.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:13:39.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:13:39.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:13:39.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:13:39.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:13:39.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:13:39.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:13:39.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:13:39.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:13:39.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:13:39.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:13:39.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:13:39.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:13:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:13:39.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:13:39.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:13:39.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:13:39.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:13:39.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:13:39.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:13:40.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:13:33
2026-05-28T17:13:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69548, datetime.datetime(2026, 5, 28, 17, 13, 33), datetime.datetime(2026, 5, 28, 17, 13, 32), 'salt', 13.88, 35.58, None, 8.65, 239.8, 14.97, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:13:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:13:40.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:13:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:13:32, diff=8.045662s, valid=True
2026-05-28T17:13:40.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:13:40.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:13:40.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=88.052333s, valid=True
2026-05-28T17:13:40.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:13:40.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:13:23, diff=17.06025s, valid=True
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:13:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:13:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=88.064131s, valid=True
2026-05-28T17:13:40.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:13:40.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:13:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:13:40.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913862.064919s, valid=True
2026-05-28T17:13:40.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:13:40.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:13:40.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:13:40.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:13:40.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:13:40.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:13:40.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:13:40.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:13:40.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:13:40.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:13:40.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:13:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:13:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:13:40.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:13:40.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:13:40.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:13:41.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:13:41.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:13:41.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-28T17:13:41.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-28T17:13:41.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:13:41.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:14:11.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:14:11.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:14:11.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:14:11.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:14:11.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:14:11.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:14:11.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-28T17:14:11.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:14:11.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:14:11.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:14:11.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:14:11.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:14:11.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-28T17:14:14.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-28T17:14:14.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:14:14.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:14:14.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:14:14.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:14:14.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:14:14.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:14:14.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:14:14.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:14:14.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:14:14.121 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:14:14.121 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:14:14.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:14:14.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:14:14.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:14:14.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:14:14.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:14:14.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:14:14.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:14:14.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:14:14.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:14:14.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:14:14.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:14:14.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:14:14.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:14:03
2026-05-28T17:14:14.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69549, datetime.datetime(2026, 5, 28, 17, 14, 3), datetime.datetime(2026, 5, 28, 17, 14, 2), 'salt', 13.98, 36.25, None, 10.8, 240.72, 14.73, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:14:14.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:14:14.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:14:14.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:14:02, diff=12.446924s, valid=True
2026-05-28T17:14:14.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:14:14.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:14:14.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=122.44975s, valid=True
2026-05-28T17:14:14.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:14:14.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:13:55, diff=19.456219s, valid=True
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:14:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:14:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=122.459236s, valid=True
2026-05-28T17:14:14.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:14:14.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:14:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:14:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913896.459893s, valid=True
2026-05-28T17:14:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:14:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:14:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:14:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:14:14.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:14:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:14:14.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:14:14.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:14:14.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:14:14.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:14:14.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:14:14.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:14:14.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:14:14.849 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:14:15.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:14:15.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:14:15.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:14:15.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:14:15.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-28T17:14:15.508 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:14:15.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:14:15.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:14:45.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:14:45.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:14:45.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:14:45.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:14:45.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:14:46.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:14:46.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-28T17:14:46.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:14:46.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:14:46.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:14:46.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:14:46.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:14:46.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-28T17:14:48.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-28T17:14:48.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:14:48.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:14:48.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:14:48.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:14:48.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:14:48.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:14:48.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:14:48.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:14:48.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:14:48.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:14:48.550 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:14:48.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:14:48.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:14:48.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:14:48.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:14:48.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:14:48.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:14:48.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:14:48.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:14:48.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:14:48.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:14:48.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:14:48.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:14:48.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:14:33
2026-05-28T17:14:48.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69550, datetime.datetime(2026, 5, 28, 17, 14, 33), datetime.datetime(2026, 5, 28, 17, 14, 33), 'salt', 13.95, 36.08, None, 8.75, 265.66, 14.79, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:14:48.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:14:48.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:14:48.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:14:33, diff=15.868348s, valid=True
2026-05-28T17:14:48.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:14:48.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:14:48.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=156.871202s, valid=True
2026-05-28T17:14:48.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:14:48.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:14:48.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:14:26, diff=22.880827s, valid=True
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:14:48.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:14:48.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=156.885946s, valid=True
2026-05-28T17:14:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:14:48.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:14:48.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:14:48.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913930.887019s, valid=True
2026-05-28T17:14:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:14:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:14:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:14:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:14:48.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:14:48.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:14:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:14:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:14:48.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:14:49.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:14:49.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:14:49.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:14:49.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:14:49.221 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:14:49.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:14:49.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:14:49.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:14:49.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:14:49.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-28T17:14:49.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-28T17:14:50.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:14:50.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:15:20.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:15:20.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:15:20.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:15:20.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:15:20.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:15:20.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:15:20.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-28T17:15:20.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:15:20.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:15:20.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:15:20.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:15:20.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:15:20.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-28T17:15:23.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-28T17:15:23.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:15:23.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:15:23.051 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:15:23.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:15:23.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:15:23.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:15:23.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:15:23.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:15:23.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:15:23.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:15:23.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:15:23.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:15:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:15:23.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:15:23.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:15:23.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:15:23.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:15:23.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:15:23.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:15:23.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:15:23.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:15:23.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:15:23.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:15:23.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:15:03
2026-05-28T17:15:23.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69551, datetime.datetime(2026, 5, 28, 17, 15, 3), datetime.datetime(2026, 5, 28, 17, 15, 3), 'salt', 14.01, 36.55, None, 10.34, 255.95, 14.62, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:15:23.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:15:23.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:15:23.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:15:03, diff=20.384923s, valid=True
2026-05-28T17:15:23.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:15:23.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:15:23.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=191.387775s, valid=True
2026-05-28T17:15:23.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:15:23.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:14:57, diff=26.394322s, valid=True
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:15:23.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:15:23.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=191.39735s, valid=True
2026-05-28T17:15:23.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:15:23.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:15:23.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:15:23.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913965.398004s, valid=True
2026-05-28T17:15:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:15:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:15:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:15:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:15:23.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:15:23.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:15:23.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:15:23.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:15:23.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:15:23.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:15:23.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:15:23.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:15:23.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:15:23.784 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:15:23.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:15:24.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:15:24.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:15:24.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:15:24.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-28T17:15:24.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-28T17:15:24.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:15:24.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:15:54.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:15:54.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:15: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-28T17:15:54.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:15:54.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:15:55.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:15:55.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-28T17:15:55.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:15:55.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:15:55.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:15:55.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:15:55.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:15: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-28T17:15:57.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-28T17:15:57.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:15:57.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:15:57.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:15:57.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:15:57.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:15:57.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:15:57.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:15:57.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:15:57.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:15:57.487 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:15:57.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:15:57.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:15:57.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:15:57.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:15:57.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:15:57.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:15:57.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:15:57.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:15:57.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:15:57.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:15:57.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:15:57.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:15:57.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:15:57.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:15:33
2026-05-28T17:15:57.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69552, datetime.datetime(2026, 5, 28, 17, 15, 33), datetime.datetime(2026, 5, 28, 17, 15, 33), 'salt', 13.88, 36.65, None, 9.74, 274.71, 14.57, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:15:57.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:15:57.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:15:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:15:33, diff=24.816126s, valid=True
2026-05-28T17:15:57.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:15:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:15:57.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=225.8191s, valid=True
2026-05-28T17:15:57.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:15:57.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:15:29, diff=28.82605s, valid=True
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:15:57.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:15:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=225.829186s, valid=True
2026-05-28T17:15:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:15:57.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:15:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:15:57.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=913999.829879s, valid=True
2026-05-28T17:15:57.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:15:57.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:15:57.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:15:57.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:15:57.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:15:57.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:15:57.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:15:57.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:15:57.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:15:57.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:15:58.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:15:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:15:58.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:15:58.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:15:58.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:15:58.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:15:58.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:15:58.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:15:58.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-28T17:15:58.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-28T17:15:59.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:15:59.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:16:29.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:16:29.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:16:29.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:16:29.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:16:29.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:16:29.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:16:29.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-28T17:16:29.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:16: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-28T17:16:29.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:16:29.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:16:29.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:16:29.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-28T17:16:32.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-28T17:16:32.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:16:32.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:16:32.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:16:32.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:16:32.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:16:32.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:16:32.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:16:32.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:16:32.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:16:32.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:16:32.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:16:32.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:16:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:16:32.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:16:32.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:16:32.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:16:32.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:16:32.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:16:32.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:16:32.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:16:32.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:16:32.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:16:32.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:16:32.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:16:04
2026-05-28T17:16:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69553, datetime.datetime(2026, 5, 28, 17, 16, 4), datetime.datetime(2026, 5, 28, 17, 16, 3), 'salt', 13.91, 37.14, None, 8.82, 260.04, 14.39, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:16:32.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:16:32.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:16:32.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:16:03, diff=29.841981s, valid=True
2026-05-28T17:16:32.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:16:32.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:16:32.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=260.844889s, valid=True
2026-05-28T17:16:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:16:32.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:16:00, diff=32.851502s, valid=True
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:16:32.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:16:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:12:12, diff=260.854643s, valid=True
2026-05-28T17:16:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:16:32.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:16:32.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:16:32.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914034.855304s, valid=True
2026-05-28T17:16:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:16:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:16:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:16:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:16:32.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:16:32.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:16:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:16:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:16:33.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:16:33.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:16:33.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:16:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:16:33.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:16:33.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:16:33.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:16:33.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:16:33.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:16:33.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:16:33.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-28T17:16:33.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-28T17:16:34.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:16:34.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:17:04.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:17:04.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:17:04.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:17:04.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:17:04.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:17:04.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:17:04.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-28T17:17:04.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:17:04.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-28T17:17:04.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:17:04.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:17:04.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:17:04.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-28T17:17:07.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-28T17:17:07.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:17:07.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:17:07.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:17:07.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:17:07.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:17:07.174 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:17:07.174 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:17:07.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:17:07.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:17:07.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:17:07.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:17:07.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:17:07.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:17:07.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:17:07.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:17:07.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:17:07.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:17:07.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:17:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:17:07.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:17:07.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:17:07.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:17:07.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:17:07.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:17:04
2026-05-28T17:17:07.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69555, datetime.datetime(2026, 5, 28, 17, 17, 4), datetime.datetime(2026, 5, 28, 17, 17, 4), 'salt', 13.81, 36.41, None, 6.78, 236.43, 14.64, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:17:07.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:17:07.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:17:07.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:04, diff=3.491515s, valid=True
2026-05-28T17:17:07.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:17:07.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:17:07.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:12, diff=-4.505669s, valid=True
2026-05-28T17:17:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:17:07.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:03, diff=4.501013s, valid=True
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:17:07.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:17:07.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:12, diff=-4.495958s, valid=True
2026-05-28T17:17:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:17:07.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:17:07.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:17:07.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914069.504716s, valid=True
2026-05-28T17:17:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:17:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:17:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:17:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:17:07.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:17:07.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:17:07.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:17:07.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:17:07.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:17:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:17:07.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:17:07.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:17:07.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:17:07.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:17:08.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:17:08.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:17:08.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:17:08.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:17:08.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-28T17:17:08.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-28T17:17:08.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:17:08.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:17:38.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:17:38.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:17:38.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:17:39.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:17:39.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:17:39.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:17:39.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-28T17:17:39.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:17:39.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-28T17:17:39.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:17:39.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:17:39.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:17:39.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-28T17:17:41.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-28T17:17:41.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:17:41.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:17:41.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:17:41.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:17:41.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:17:41.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:17:41.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:17:41.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:17:41.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:17:41.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:17:41.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:17:41.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:17:42.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:17:42.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:17:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:17:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:17:42.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:17:42.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:17:42.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:17:42.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:17:42.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:17:42.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:17:42.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:17:42.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:17:35
2026-05-28T17:17:42.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69556, datetime.datetime(2026, 5, 28, 17, 17, 35), datetime.datetime(2026, 5, 28, 17, 17, 34), 'salt', 13.88, 36.31, None, 9.49, 249.49, 14.69, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:17:42.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:17:42.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:17:42.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:34, diff=8.291465s, valid=True
2026-05-28T17:17:42.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:17:42.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:17:42.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:12, diff=-29.705665s, valid=True
2026-05-28T17:17:42.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:17:42.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:34, diff=8.301026s, valid=True
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:17:42.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:17:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:12, diff=-29.695908s, valid=True
2026-05-28T17:17:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:17:42.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:17:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:17:42.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914104.304756s, valid=True
2026-05-28T17:17:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:17:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:17:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:17:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:17:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:17:42.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:17:42.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:17:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:17:42.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:17:42.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:17:42.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:17:42.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:17:42.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:17:42.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:17:42.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:17:43.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:17:43.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:17:43.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:17:43.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-28T17:17:43.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-28T17:17:43.522 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:17:43.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:18:13.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:18:13.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:18:13.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:18:14.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:18:14.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:18:14.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:18:14.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-28T17:18:14.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:18:14.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-28T17:18:14.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:18:14.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:18:14.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:18:14.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-28T17:18:16.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-28T17:18:16.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:18:16.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:18:16.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:18:16.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:18:16.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:18:16.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:18:16.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:18:16.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:18:16.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:18:16.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:18:16.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:18:16.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:18:16.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:18:16.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:18:16.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:18:16.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:18:16.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:18:16.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:18:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:18:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:18:16.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:18:16.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:18:16.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:18:17.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:18:05
2026-05-28T17:18:17.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69557, datetime.datetime(2026, 5, 28, 17, 18, 5), datetime.datetime(2026, 5, 28, 17, 18, 4), 'salt', 13.82, 35.98, None, 10.16, 246.75, 14.82, 830.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:18:17.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:18:17.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:18:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:04, diff=13.06181s, valid=True
2026-05-28T17:18:17.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:18:17.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:18:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:12, diff=5.064687s, valid=True
2026-05-28T17:18:17.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:18:17.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:17:55, diff=22.071264s, valid=True
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:18:17.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:18:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:12, diff=5.074352s, valid=True
2026-05-28T17:18:17.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:18:17.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:18:17.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:18:17.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914139.075009s, valid=True
2026-05-28T17:18:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:18:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:18:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:18:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:18:17.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:18:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:18:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:18:17.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:18:17.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:18:17.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:18:17.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:18:17.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:18:17.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:18:17.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:18:17.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:18:18.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:18:18.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:18:18.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:18: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-28T17:18: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-28T17:18:18.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:18:18.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:18:48.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:18:48.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:18:48.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:18:48.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:18:48.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:18:48.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:18:48.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:18:48.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:18:48.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-28T17:18:48.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:18:48.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:18:48.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:18:48.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-28T17:18:51.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-28T17:18:51.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:18:51.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:18:51.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:18:51.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:18:51.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:18:51.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:18:51.139 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:18:51.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:18:51.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:18:51.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:18:51.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:18:51.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:18:51.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:18:51.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:18:51.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:18:51.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:18:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:18:51.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:18:51.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:18:51.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:18:51.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:18:51.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:18:51.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:18:51.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:18:35
2026-05-28T17:18:51.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69558, datetime.datetime(2026, 5, 28, 17, 18, 35), datetime.datetime(2026, 5, 28, 17, 18, 35), 'salt', 13.78, 36.61, None, 9.04, 254.81, 14.57, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:18:51.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:18:51.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:18:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:35, diff=16.448422s, valid=True
2026-05-28T17:18:51.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:18:51.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:18:51.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:12, diff=-20.548747s, valid=True
2026-05-28T17:18:51.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:18:51.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:18:51.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:27, diff=24.457826s, valid=True
2026-05-28T17:18:51.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:18:51.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:18:51.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:18:51.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:18:51.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:18:51.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:18:51.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:12, diff=-20.539121s, valid=True
2026-05-28T17:18:51.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:18:51.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:18:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:18:51.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914173.461519s, valid=True
2026-05-28T17:18:51.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:18:51.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:18:51.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:18:51.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:18:51.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:18:51.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:18:51.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:18:51.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:18:51.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:18:51.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:18:51.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:18:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:18:51.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:18:51.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:18:51.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:18:52.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:18:52.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:18:52.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:18:52.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-28T17:18:52.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-28T17:18:52.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:18:52.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:19:22.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:19:22.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:19:22.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:19:22.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:19:22.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:19:23.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:19:23.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-28T17:19:23.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:19:23.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:19:23.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:19:23.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:19:23.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:19:23.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-28T17:19:25.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-28T17:19:25.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:19:25.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:19:25.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:19:25.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:19:25.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:19:25.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:19:25.608 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:19:25.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:19:25.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:19:25.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:19:25.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:19:25.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:19:25.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:19:25.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:19:25.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:19:25.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:19:25.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:19:25.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:19:25.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:19:25.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:19:25.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:19:25.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:19:25.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:19:25.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:19:05
2026-05-28T17:19:25.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69559, datetime.datetime(2026, 5, 28, 17, 19, 5), datetime.datetime(2026, 5, 28, 17, 19, 5), 'salt', 13.78, 36.51, None, 7.62, 246.37, 14.61, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:19:25.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:19:25.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:19:25.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:05, diff=20.932392s, valid=True
2026-05-28T17:19:25.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:19:25.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:19:25.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:12, diff=13.935259s, valid=True
2026-05-28T17:19:25.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:19:25.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:19:25.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:18:58, diff=27.941933s, valid=True
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:19:25.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:19:25.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:12, diff=13.944979s, valid=True
2026-05-28T17:19:25.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:19:25.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:19:25.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:19:25.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914207.945644s, valid=True
2026-05-28T17:19:25.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:19:25.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:19:25.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:19:25.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:19:25.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:19:26.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:19:26.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:19:26.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:19:26.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:19:26.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:19:26.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:19:26.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:19:26.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:19:26.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:19:26.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:19:26.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:19:27.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:19:27.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:19:27.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-28T17:19:27.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-28T17:19:27.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:19:27.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:19:57.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:19:57.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:19:57.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:19:57.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:19:57.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:19:57.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:19:57.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-28T17:19:57.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:19:57.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:19:57.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:19:57.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:19:57.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:19:57.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-28T17:19:59.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-28T17:19:59.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:19:59.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:19:59.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:19:59.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:19:59.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:19:59.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:19:59.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:19:59.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:19:59.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:19:59.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:19:59.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:19:59.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:20:00.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:20:00.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:20:00.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:20:00.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:20:00.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:20:00.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:20:00.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:20:00.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:20:00.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:20:00.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:20:00.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:20:00.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:19:36
2026-05-28T17:20:00.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69560, datetime.datetime(2026, 5, 28, 17, 19, 36), datetime.datetime(2026, 5, 28, 17, 19, 35), 'salt', 13.82, 38.27, None, 5.26, 246.54, 13.97, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:20:00.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:20:00.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:20:00.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:35, diff=25.315s, valid=True
2026-05-28T17:20:00.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:20:00.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:20:00.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:12, diff=-11.682141s, valid=True
2026-05-28T17:20:00.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:20:00.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:19:30, diff=30.32459s, valid=True
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:20:00.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:20:00.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:20:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:12, diff=-11.672359s, valid=True
2026-05-28T17:20:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:20:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:20:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:20:00.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914242.328293s, valid=True
2026-05-28T17:20:00.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:20:00.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:20:00.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:20:00.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:20:00.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:20:00.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:20:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:20:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:20:00.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:20:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:20:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:20:00.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:20:00.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:20:00.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:20:00.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:20:01.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:20:01.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:20:01.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:20:01.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-28T17:20:01.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-28T17:20:01.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:20:01.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:20:31.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:20:31.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:20:31.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:20:32.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:20:32.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:20:32.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:20:32.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-28T17:20:32.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:20:32.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-28T17:20:32.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:20:32.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:20:32.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:20:32.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-28T17:20:34.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-28T17:20:34.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:20:34.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:20:34.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:20:34.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:20:34.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:20:34.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:20:34.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:20:34.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:20:34.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:20:34.864 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:20:34.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:20:34.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:20:34.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:20:34.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:20:35.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:20:35.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:20:35.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:20:35.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:20:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:20:35.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:20:35.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:20:35.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:20:35.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:20:35.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:20:06
2026-05-28T17:20:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69561, datetime.datetime(2026, 5, 28, 17, 20, 6), datetime.datetime(2026, 5, 28, 17, 20, 5), 'salt', 13.78, 38.24, None, 5.05, 260.68, 13.97, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:20:35.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:20:35.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:20:35.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:05, diff=30.201377s, valid=True
2026-05-28T17:20:35.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:20:35.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:20:35.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:12, diff=23.204224s, valid=True
2026-05-28T17:20:35.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:20:35.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:20:35.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:01, diff=34.210914s, valid=True
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:20:35.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:20:35.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:20:12, diff=23.213892s, valid=True
2026-05-28T17:20:35.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:20:35.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:20:35.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:20:35.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914277.214539s, valid=True
2026-05-28T17:20:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:20:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:20:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:20:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:20:35.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:20:35.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:20:35.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:20:35.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:20:35.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:20:35.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:20:35.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:20:35.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:20:35.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:20:35.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:20:35.850 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:20:36.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:20:36.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:20:36.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:20:36.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-28T17:20: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-28T17:20:36.574 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:20:36.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:21:06.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:21:06.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:21:06.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:21:06.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:21:06.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:21:06.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:21:06.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-28T17:21:06.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:21:06.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-28T17:21:06.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:21:06.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:21:06.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:21:06.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-28T17:21:09.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-28T17:21:09.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:21:09.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:21:09.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:21:09.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:21:09.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:21:09.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:21:09.407 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:21:09.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:21:09.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:21:09.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:21:09.408 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:21:09.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:21:09.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:21:09.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:21:09.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:21:09.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:21:09.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:21:09.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:21:09.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:21:09.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:21:09.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:21:09.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:21:09.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:21:09.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:21:06
2026-05-28T17:21:09.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69563, datetime.datetime(2026, 5, 28, 17, 21, 6), datetime.datetime(2026, 5, 28, 17, 21, 6), 'salt', 13.92, 37.04, None, 3.67, 277.79, 14.43, 830.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:21:09.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:21:09.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:21:09.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:06, diff=3.731803s, valid=True
2026-05-28T17:21:09.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:21:09.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:21:09.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:12, diff=-2.265326s, valid=True
2026-05-28T17:21:09.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:21:09.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:05, diff=4.741308s, valid=True
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:21:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:21:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:12, diff=-2.255676s, valid=True
2026-05-28T17:21:09.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:21:09.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:21:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:21:09.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914311.744994s, valid=True
2026-05-28T17:21:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:21:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:21:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:21:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:21:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:21:09.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:21:09.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:21:09.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:21:09.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:21:09.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:21:09.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:21:09.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:21:10.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:21:10.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:21:10.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:21:10.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:21:10.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:21:10.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:21:10.756 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:21:10.756 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:21:10.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:21:10.925 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:21:40.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:21:40.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:21:40.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:21:41.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:21:41.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:21:41.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:21:41.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-28T17:21:41.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:21:41.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-28T17:21:41.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:21:41.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:21:41.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:21:41.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-28T17:21:44.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-28T17:21:44.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:21:44.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:21:44.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:21:44.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:21:44.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:21:44.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:21:44.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:21:44.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:21:44.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:21:44.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:21:44.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:21:44.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:21:44.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:21:44.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:21:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:21:44.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:21:44.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:21:44.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:21:44.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:21:44.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:21:44.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:21:44.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:21:44.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:21:44.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:21:36
2026-05-28T17:21:44.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69564, datetime.datetime(2026, 5, 28, 17, 21, 36), datetime.datetime(2026, 5, 28, 17, 21, 36), 'salt', 14.01, 37.44, None, 2.86, 249.26, 14.28, 830.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:21:44.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:21:44.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:21:44.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:36, diff=8.433905s, valid=True
2026-05-28T17:21:44.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:21:44.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:21:44.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:12, diff=-27.563213s, valid=True
2026-05-28T17:21:44.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:21:44.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:28, diff=16.443427s, valid=True
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:21:44.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:21:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:12, diff=-27.553531s, valid=True
2026-05-28T17:21:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:21:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:21:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:21:44.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914346.447122s, valid=True
2026-05-28T17:21:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:21:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:21:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:21:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:21:44.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:21:44.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:21:44.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:21:44.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:21:44.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:21:44.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:21:44.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:21:44.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:21:44.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:21:44.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:21:44.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:21:45.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:21:45.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:21:45.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:21:45.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-28T17:21:45.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-28T17:21:45.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:21:45.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:22:15.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:22:15.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:22:15.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:22:15.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:22:15.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:22:16.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:22:16.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-28T17:22:16.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:22: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-28T17:22:16.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:22:16.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:22:16.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:22:16.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-28T17:22:18.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:22:18.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:22:18.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:22:18.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:22:18.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:22:18.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:22:18.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:22:18.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:22:18.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:22:18.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:22:18.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:22:18.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:22:18.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:22:18.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:22:18.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:22:18.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:22:18.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:22:19.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:22:19.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:22:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:22:19.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:22:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:22:19.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:22:19.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:22:19.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:22:07
2026-05-28T17:22:19.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69565, datetime.datetime(2026, 5, 28, 17, 22, 7), datetime.datetime(2026, 5, 28, 17, 22, 6), 'salt', 14.02, 37.51, None, 1.41, 306.76, 14.27, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:22:19.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:22:19.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:22:19.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:06, diff=13.119827s, valid=True
2026-05-28T17:22:19.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:22:19.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:22:19.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:12, diff=7.123315s, valid=True
2026-05-28T17:22:19.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:22:19.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:22:19.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:21:58, diff=21.129959s, valid=True
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:22:19.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:12, diff=7.132998s, valid=True
2026-05-28T17:22:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:22:19.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:22:19.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914381.133682s, valid=True
2026-05-28T17:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:22:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:22:19.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:22:19.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:22:19.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:22:19.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:22:19.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:22:19.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:22:19.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:22:19.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:22:19.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:22:19.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:22:20.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:22:20.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:22:20.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:22:20.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:22:20.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:22:20.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:22:20.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:22:50.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:22:50.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:22:50.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:22:50.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:22:50.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:22:50.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:22:50.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-28T17:22:50.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:22:50.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:22:50.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:22:50.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:22:50.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:22:50.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-28T17:22:53.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-28T17:22:53.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:22:53.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:22:53.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:22:53.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:22:53.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:22:53.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:22:53.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:22:53.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:22:53.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:22:53.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:22:53.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:22:53.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:22:53.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:22:53.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:22:53.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:22:53.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:22:53.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:22:53.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:22:53.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:22:53.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:22:53.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:22:53.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:22:53.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:22:53.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:22:37
2026-05-28T17:22:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69566, datetime.datetime(2026, 5, 28, 17, 22, 37), datetime.datetime(2026, 5, 28, 17, 22, 36), 'salt', 13.95, 37.31, None, 1.41, 306.79, 14.33, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:22:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:22:53.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:22:53.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:36, diff=17.644719s, valid=True
2026-05-28T17:22:53.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:22:53.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:22:53.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:12, diff=-18.352463s, valid=True
2026-05-28T17:22:53.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:22:53.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:22:29, diff=24.654095s, valid=True
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:22:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:22:53.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:12, diff=-18.342901s, valid=True
2026-05-28T17:22:53.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:22:53.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:22:53.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:22:53.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914415.65776s, valid=True
2026-05-28T17:22:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:22:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:22:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:22:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:22:53.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:22:53.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:22:53.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:22:53.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:22:53.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:22:53.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:22:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:22:53.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:22:53.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:22:53.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:22:54.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:22:54.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:22:54.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:22:54.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:22:54.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-28T17:22:54.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-28T17:22:54.828 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:22:54.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:23:24.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:23:24.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:23:24.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:23:25.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:23:25.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:23:25.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:23:25.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-28T17:23:25.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:23:25.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-28T17:23:25.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:23:25.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:23:25.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:23:25.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-28T17:23:27.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-28T17:23:27.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:23:27.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:23:27.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:23:27.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:23:27.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:23:27.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:23:27.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:23:27.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:23:27.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:23:27.731 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:23:27.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:23:27.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:23:27.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:23:27.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:23:27.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:23:27.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:23:27.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:23:27.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:23:27.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:23:27.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:23:27.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:23:27.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:23:27.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:23:28.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:23:07
2026-05-28T17:23:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69567, datetime.datetime(2026, 5, 28, 17, 23, 7), datetime.datetime(2026, 5, 28, 17, 23, 7), 'salt', 14.05, 37.21, None, 1.41, 42.98, 14.38, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:23:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:23:28.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:23:28.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:07, diff=21.052009s, valid=True
2026-05-28T17:23:28.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:23:28.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:23:28.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:12, diff=16.054886s, valid=True
2026-05-28T17:23:28.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:23:28.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:00, diff=28.061552s, valid=True
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:23:28.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:23:28.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:23:28.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:12, diff=16.064631s, valid=True
2026-05-28T17:23:28.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:23:28.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:23:28.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:23:28.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914450.065311s, valid=True
2026-05-28T17:23:28.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:23:28.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:23:28.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:23:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:23:28.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:23:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:23:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:23:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:23:28.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:23:28.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:23:28.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:23:28.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:23:28.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:23:28.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:23:28.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:23:29.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:23:29.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:23:29.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:23:29.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-28T17:23:29.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-28T17:23:29.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:23:29.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:23:59.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:23:59.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:23:59.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:23:59.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:23:59.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:23:59.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:23:59.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-28T17:23:59.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:23: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-28T17:23:59.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:23:59.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:23:59.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:23:59.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-28T17:24:02.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-28T17:24:02.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:24:02.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:24:02.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:24:02.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:24:02.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:24:02.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:24:02.199 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:24:02.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:24:02.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:24:02.199 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:24:02.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:24:02.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:24:02.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:24:02.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:24:02.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:24:02.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:24:02.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:24:02.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:24:02.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:24:02.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:24:02.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:24:02.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:24:02.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:24:02.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:23:37
2026-05-28T17:24:02.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69568, datetime.datetime(2026, 5, 28, 17, 23, 37), datetime.datetime(2026, 5, 28, 17, 23, 37), 'salt', 14.05, 37.61, None, 3.18, 56.08, 14.23, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:24:02.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:24:02.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:24:02.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:37, diff=25.562176s, valid=True
2026-05-28T17:24:02.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:24:02.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:24:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:12, diff=-9.43466s, valid=True
2026-05-28T17:24:02.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:24:02.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:24:02.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:23:31, diff=31.573629s, valid=True
2026-05-28T17:24:02.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:24:02.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:24:02.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:24:02.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:24:02.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:24:02.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:24:02.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:12, diff=-9.422281s, valid=True
2026-05-28T17:24:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:24:02.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:24:02.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:24:02.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914484.578569s, valid=True
2026-05-28T17:24:02.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:24:02.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:24:02.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:24:02.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:24:02.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:24:02.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:24:02.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:24:02.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:24:02.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:24:02.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:24:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:24:02.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:24:02.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:24:02.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:24:03.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:24:03.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:24:03.667 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:24:03.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:24:03.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-28T17:24:03.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-28T17:24:03.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:24:03.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:24:33.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:24:33.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:24:33.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:24:34.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:24:34.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:24:34.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:24:34.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-28T17:24:34.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:24:34.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-28T17:24:34.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:24:34.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:24:34.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:24:34.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-28T17:24: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-28T17:24:36.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:24:36.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:24:36.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:24:36.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:24:36.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:24:36.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:24:36.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:24:36.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:24:36.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:24:36.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:24:36.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:24:36.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:24:36.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:24:36.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:24:37.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:24:37.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:24:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:24:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:24:37.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:24:37.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:24:37.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:24:37.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:24:37.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:24:37.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:24:07
2026-05-28T17:24:37.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69569, datetime.datetime(2026, 5, 28, 17, 24, 7), datetime.datetime(2026, 5, 28, 17, 24, 7), 'salt', 14.05, 40.99, None, 2.47, 18.81, 13.04, 830.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:24:37.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:24:37.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:24:37.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:07, diff=30.241215s, valid=True
2026-05-28T17:24:37.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:24:37.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:24:37.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:12, diff=25.244126s, valid=True
2026-05-28T17:24:37.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:24:37.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:24:37.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:03, diff=34.250869s, valid=True
2026-05-28T17:24:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:24:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:24:37.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:24:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:24:37.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:24:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:24:37.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:24:12, diff=25.253947s, valid=True
2026-05-28T17:24:37.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:24:37.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:24:37.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:24:37.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914519.254595s, valid=True
2026-05-28T17:24:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:24:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:24:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:24:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:24:37.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:24:37.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:24:37.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:24:37.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:24:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:24:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:24:37.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:24:37.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:24:37.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:24:37.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:24:37.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:24:38.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:24:38.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:24:38.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:24:38.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-28T17:24:38.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-28T17:24:38.602 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:24:38.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:25:08.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:25:08.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:25:08.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:25:08.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:25:08.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:25:08.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:25:08.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-28T17:25:08.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:25:08.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-28T17:25:08.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:25:08.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:25:08.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:25:08.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-28T17:25:11.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:25:11.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:25:11.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:25:11.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:25:11.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:25:11.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:25:11.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:25:11.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:25:11.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:25:11.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:25:11.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:25:11.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:25:11.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:25:11.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:25:11.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:25:11.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:25:11.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:25:11.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:25:11.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:25:11.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:25:11.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:25:11.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:25:11.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:25:11.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:25:12.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:25:08
2026-05-28T17:25:12.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69571, datetime.datetime(2026, 5, 28, 17, 25, 8), datetime.datetime(2026, 5, 28, 17, 25, 8), 'salt', 13.85, 44.1, None, 7.91, 123.52, 12.0, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:25:12.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:25:12.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:25:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:08, diff=4.015435s, valid=True
2026-05-28T17:25:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:25:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:25:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:12, diff=0.018226s, valid=True
2026-05-28T17:25:12.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:25:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:25:12.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:06, diff=6.024797s, valid=True
2026-05-28T17:25:12.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:25:12.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:25:12.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:25:12.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:25:12.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:25:12.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:25:12.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:12, diff=0.027822s, valid=True
2026-05-28T17:25:12.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:25:12.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:25:12.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:25:12.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914554.028471s, valid=True
2026-05-28T17:25:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:25:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:25:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:25:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:25:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:25:12.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:25:12.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:25:12.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:25:12.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:25:12.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:25:12.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:25:12.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:25:12.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:25:12.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:25:12.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:25:12.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:25:13.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:25:13.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:25:13.031 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:25:13.031 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:25:13.281 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:25:13.281 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:25:43.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:25:43.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:25:43.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:25:43.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:25:43.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:25:43.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:25: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-28T17:25:43.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:25:43.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-28T17:25:43.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:25:43.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:25:43.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:25:43.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-28T17:25:46.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-28T17:25:46.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:25:46.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:25:46.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:25:46.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:25:46.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:25:46.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:25:46.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:25:46.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:25:46.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:25:46.429 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:25:46.429 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:25:46.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:25:46.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:25:46.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:25:46.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:25:46.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:25:46.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:25:46.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:25:46.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:25:46.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:25:46.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:25:46.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:25:46.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:25:46.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:25:38
2026-05-28T17:25:46.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69572, datetime.datetime(2026, 5, 28, 17, 25, 38), datetime.datetime(2026, 5, 28, 17, 25, 38), 'salt', 13.65, 47.05, None, 6.25, 120.76, 11.08, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:25:46.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:25:46.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:25:46.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:38, diff=8.764948s, valid=True
2026-05-28T17:25:46.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:25:46.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:25:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:12, diff=-25.23216s, valid=True
2026-05-28T17:25:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:25:46.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:25:37, diff=9.77451s, valid=True
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:25:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:25:46.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:12, diff=-25.222405s, valid=True
2026-05-28T17:25:46.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:25:46.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:25:46.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:25:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914588.778272s, valid=True
2026-05-28T17:25:46.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:25:46.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:25:46.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:25:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:25:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:25:46.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:25:46.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:25:46.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:25:46.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:25:46.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:25:47.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:25:47.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:25:47.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:25:47.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:25:47.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:25:47.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:25:47.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:25:47.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:25:47.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-28T17:25:47.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-28T17:25:48.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:25:48.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:26:18.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:26:18.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:26:18.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:26:18.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:26:18.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:26:18.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:26:18.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-28T17:26:18.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:26:18.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-28T17:26:18.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:26:18.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:26:18.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:26:18.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:26:20.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-28T17:26:20.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:26:20.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:26:20.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:26:20.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:26:21.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:26:21.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:26:21.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:26:21.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:26:21.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:26:21.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:26:21.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:26:21.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:26:21.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:26:21.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:26:21.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:26:21.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:26:21.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:26:21.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:26:21.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:26:21.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:26:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:26:21.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:26:21.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:26:21.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:26:08
2026-05-28T17:26:21.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69573, datetime.datetime(2026, 5, 28, 17, 26, 8), datetime.datetime(2026, 5, 28, 17, 26, 8), 'salt', 13.32, 49.47, None, 5.9, 117.87, 10.34, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:26:21.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:26:21.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:26:21.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:08, diff=13.333915s, valid=True
2026-05-28T17:26:21.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:26:21.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:26:21.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:12, diff=9.336703s, valid=True
2026-05-28T17:26:21.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:26:21.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:01, diff=20.343221s, valid=True
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:26:21.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:26:21.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:12, diff=9.346324s, valid=True
2026-05-28T17:26:21.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:26:21.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:26:21.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:26:21.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914623.347665s, valid=True
2026-05-28T17:26:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:26:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:26:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:26:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:26:21.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:26:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:26:21.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:26:21.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:26:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:26:21.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:26:21.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:26:21.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:26:21.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:26:21.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:26:21.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:26:22.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:26:22.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:26:22.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:26:22.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-28T17:26:22.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-28T17:26:22.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:26:22.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:26:52.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:26:52.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:26:52.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:26:52.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:26:52.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:26:52.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:26:52.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-28T17:26:52.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:26:52.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-28T17:26:52.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:26:52.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:26:52.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:26:52.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-28T17:26:55.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:26:55.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:26:55.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:26:55.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:26:55.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:26:55.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:26:55.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:26:55.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:26:55.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:26:55.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:26:55.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:26:55.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:26:55.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:26:55.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:26:55.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:26:55.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:26:55.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:26:55.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:26:55.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:26:55.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:26:55.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:26:55.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:26:55.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:26:55.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:26:55.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:26:39
2026-05-28T17:26:55.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69574, datetime.datetime(2026, 5, 28, 17, 26, 39), datetime.datetime(2026, 5, 28, 17, 26, 38), 'salt', 13.25, 50.2, None, 6.71, 99.8, 10.13, 830.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:26:55.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:26:55.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:26:55.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:38, diff=17.989617s, valid=True
2026-05-28T17:26:55.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:26:55.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:26:55.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:12, diff=-16.007506s, valid=True
2026-05-28T17:26:55.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:26:55.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:26:31, diff=24.999137s, valid=True
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:26:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:26:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:12, diff=-15.997827s, valid=True
2026-05-28T17:26:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:26:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:26:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:26:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914658.002831s, valid=True
2026-05-28T17:26:56.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:26:56.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:26:56.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:26:56.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:26:56.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:26:56.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:26:56.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:26:56.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:26:56.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:26:56.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:26:56.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:26:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:26:56.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:26:56.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:26:56.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:26:56.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:26:57.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:26:57.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:26:57.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-28T17:26:57.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-28T17:26:57.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:26:57.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:27:27.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:27:27.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:27:27.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:27:27.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:27:27.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:27:27.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:27:27.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-28T17:27:27.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:27:27.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-28T17:27:27.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:27:27.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:27:27.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:27:27.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-28T17:27:30.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-28T17:27:30.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:27:30.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:27:30.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:27:30.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:27:30.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:27:30.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:27:30.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:27:30.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:27:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:27:30.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:27:30.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:27:30.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:27:30.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:27:30.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:27:30.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:27:30.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:27:30.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:27:30.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:27:30.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:27:30.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:27:30.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:27:30.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:27:30.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:27:30.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:27:09
2026-05-28T17:27:30.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69575, datetime.datetime(2026, 5, 28, 17, 27, 9), datetime.datetime(2026, 5, 28, 17, 27, 8), 'salt', 12.99, 51.42, None, 8.47, 82.1, 9.77, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:27:30.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:27:30.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:27:30.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:08, diff=22.552302s, valid=True
2026-05-28T17:27:30.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:27:30.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:27:30.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:12, diff=18.555112s, valid=True
2026-05-28T17:27:30.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:27:30.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:01, diff=29.562236s, valid=True
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:27:30.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:27:30.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:12, diff=18.565798s, valid=True
2026-05-28T17:27:30.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:27:30.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:27:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:27:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914692.566582s, valid=True
2026-05-28T17:27:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:27:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:27:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:27:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:27:30.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:27:30.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:27:30.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:27:30.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:27:30.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:27:30.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:27:30.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:27:30.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:27:30.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:27:30.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:27:31.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:27:31.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:27:31.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:27:31.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:27:31.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-28T17:27:31.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-28T17:27:31.795 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:27:31.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:28:01.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:28:01.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:28:01.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:28:02.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:28:02.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:28:02.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:28:02.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-28T17:28:02.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:28:02.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-28T17:28:02.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:28:02.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:28:02.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:28:02.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-28T17:28:04.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-28T17:28:04.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:28:04.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:28:04.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:28:04.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:28:04.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:28:04.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:28:04.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:28:04.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:28:04.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:28:04.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:28:04.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:28:04.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:28:04.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:28:04.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:28:05.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:28:05.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:28:05.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:28:05.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:28:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:28:05.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:28:05.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:28:05.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:28:05.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:28:05.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:27:39
2026-05-28T17:28:05.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69576, datetime.datetime(2026, 5, 28, 17, 27, 39), datetime.datetime(2026, 5, 28, 17, 27, 39), 'salt', 12.82, 52.19, None, 7.45, 109.88, 9.55, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:28:05.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:28:05.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:28:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:39, diff=26.170699s, valid=True
2026-05-28T17:28:05.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:28:05.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:28:05.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:12, diff=-6.826461s, valid=True
2026-05-28T17:28:05.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:28:05.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:27:33, diff=32.180268s, valid=True
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:28:05.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:28:05.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:12, diff=-6.816671s, valid=True
2026-05-28T17:28:05.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:28:05.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:28:05.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:28:05.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914727.184004s, valid=True
2026-05-28T17:28:05.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:28:05.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:28:05.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:28:05.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:28:05.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:28:05.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:28:05.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:28:05.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:28:05.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:28:05.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:28:05.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:28:05.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:28:05.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:28:05.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:28:05.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:28:06.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:28:06.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:28:06.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:28:06.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-28T17:28:06.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-28T17:28:06.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:28:06.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:28:36.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:28:36.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:28:36.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:28:36.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:28:36.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:28:37.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:28:37.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-28T17:28:37.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:28:37.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-28T17:28:37.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:28:37.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:28:37.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:28:37.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-28T17:28:39.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-28T17:28:39.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:28:39.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:28:39.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:28:39.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:28:39.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:28:39.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:28:39.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:28:39.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:28:39.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:28:39.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:28:39.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:28:39.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:28:39.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:28:39.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:28:39.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:28:39.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:28:39.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:28:39.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:28:39.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:28:39.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:28:39.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:28:39.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:28:39.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:28:39.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:28:10
2026-05-28T17:28:39.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69577, datetime.datetime(2026, 5, 28, 17, 28, 10), datetime.datetime(2026, 5, 28, 17, 28, 9), 'salt', 12.49, 51.39, None, 8.51, 132.01, 9.74, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:28:39.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:28:39.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:28:39.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:09, diff=30.874906s, valid=True
2026-05-28T17:28:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:28:39.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:28:39.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:12, diff=27.877935s, valid=True
2026-05-28T17:28:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:28:39.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:05, diff=34.885155s, valid=True
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:28:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:28:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:28:12, diff=27.888435s, valid=True
2026-05-28T17:28:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:28:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:28:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:28:39.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914761.889144s, valid=True
2026-05-28T17:28:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:28:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:28:39.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:28:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:28:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:28:39.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:28:39.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:28:39.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:28:39.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:28:40.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:28:40.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:28:40.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:28:40.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:28:40.225 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:28:40.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:28:40.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:28:40.951 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:28:40.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:28:40.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-28T17:28:40.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-28T17:28:41.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:28:41.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:29:11.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:29:11.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:29:11.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:29:11.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:29:11.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:29:11.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:29:11.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-28T17:29:11.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:29:11.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-28T17:29:11.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:29:11.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:29:11.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:29:11.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-28T17:29:14.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-28T17:29:14.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:29:14.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:29:14.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:29:14.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:29:14.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:29:14.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:29:14.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:29:14.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:29:14.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:29:14.143 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:29:14.143 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:29:14.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:29:14.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:29:14.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:29:14.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:29:14.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:29:14.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:29:14.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:29:14.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:29:14.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:29:14.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:29:14.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:29:14.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:29:14.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:29:10
2026-05-28T17:29:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69579, datetime.datetime(2026, 5, 28, 17, 29, 10), datetime.datetime(2026, 5, 28, 17, 29, 10), 'salt', 12.19, 51.79, None, 8.89, 132.48, 9.61, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:29:14.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:29:14.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:29:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:10, diff=4.456308s, valid=True
2026-05-28T17:29:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:29:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:29:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:12, diff=2.459137s, valid=True
2026-05-28T17:29:14.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:29:14.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:29:14.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:07, diff=7.465715s, valid=True
2026-05-28T17:29:14.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:29:14.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:29:14.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:29:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:29:14.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:29:14.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:29:14.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:12, diff=2.468717s, valid=True
2026-05-28T17:29:14.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:29:14.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:29:14.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:29:14.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914796.469366s, valid=True
2026-05-28T17:29:14.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:29:14.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:29:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:29:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:29:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:29:14.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:29:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:29:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:29:14.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:29:14.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:29:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:29:14.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:29:14.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:29:14.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:29:15.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:29:15.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:29:15.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:29:15.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:29:15.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-28T17:29:15.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-28T17:29:15.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:29:15.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:29:45.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:29:45.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:29:45.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:29:45.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:29:45.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:29:45.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:29:45.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-28T17:29:45.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:29:45.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-28T17:29:45.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:29:45.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:29:46.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:29:46.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:29:48.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-28T17:29:48.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:29:48.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:29:48.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:29:48.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:29:48.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:29:48.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:29:48.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:29:48.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:29:48.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:29:48.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:29:48.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:29:48.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:29:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:29:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:29:48.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:29:48.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:29:48.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:29:48.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:29:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:29:48.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:29:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:29:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:29:48.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:29:49.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:29:41
2026-05-28T17:29:49.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69580, datetime.datetime(2026, 5, 28, 17, 29, 41), datetime.datetime(2026, 5, 28, 17, 29, 41), 'salt', 12.13, 52.12, None, 8.22, 145.54, 9.52, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:29:49.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:29:49.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:29:49.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:41, diff=8.062551s, valid=True
2026-05-28T17:29:49.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:29:49.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:29:49.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:12, diff=-22.934601s, valid=True
2026-05-28T17:29:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:29:49.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:29:49.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:29:39, diff=10.071975s, valid=True
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:29:49.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:29:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:12, diff=-22.924998s, valid=True
2026-05-28T17:29:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:29:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:29:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:29:49.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914831.075661s, valid=True
2026-05-28T17:29:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:29:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:29:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:29:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:29:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:29:49.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:29:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:29:49.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:29:49.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:29:49.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:29:49.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:29:49.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:29:49.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:29:49.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:29:49.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:29:50.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:29:50.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:29:50.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:29:50.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-28T17:29:50.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-28T17:29:50.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:29:50.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:30:20.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:30:20.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:30:20.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:30:20.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:30:20.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:30:20.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:30:20.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-28T17:30:20.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:30:20.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-28T17:30:20.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:30:20.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:30:20.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:30:20.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:30:23.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-28T17:30:23.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:30:23.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:30:23.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:30:23.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:30:23.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:30:23.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:30:23.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:30:23.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:30:23.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:30:23.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:30:23.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:30:23.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:30:23.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:30:23.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:30:23.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:30:23.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:30:23.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:30:23.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:30:23.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:30:23.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:30:23.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:30:23.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:30:23.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:30:23.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:30:11
2026-05-28T17:30:23.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69581, datetime.datetime(2026, 5, 28, 17, 30, 11), datetime.datetime(2026, 5, 28, 17, 30, 11), 'salt', 12.03, 53.58, None, 5.68, 141.15, 9.12, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:30:23.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:30:23.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:30:23.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:11, diff=12.751736s, valid=True
2026-05-28T17:30:23.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:30:23.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:30:23.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:12, diff=11.754589s, valid=True
2026-05-28T17:30:23.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:30:23.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:10, diff=13.761087s, valid=True
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:30:23.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:30:23.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:12, diff=11.764082s, valid=True
2026-05-28T17:30:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:30:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:30:23.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:30:23.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914865.764747s, valid=True
2026-05-28T17:30:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:30:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:30:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:30:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:30:23.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:30:23.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:30:23.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:30:23.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:30:23.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:30:23.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:30:23.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:30:23.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:30:24.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:30:24.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:30:24.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:30:24.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:30:24.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:30:24.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:30:24.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:30:24.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:30:24.934 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:30:24.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:30:54.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:30:54.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:30:54.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:30:55.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:30:55.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:30:55.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:30:55.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-28T17:30:55.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:30:55.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-28T17:30:55.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:30:55.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:30:55.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:30:55.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-28T17:30:57.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:30:57.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:30:57.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:30:57.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:30:57.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:30:57.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:30:57.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:30:57.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:30:57.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:30:57.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:30:57.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:30:57.974 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:30:57.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:30:58.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:30:58.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:30:58.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:30:58.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:30:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:30:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:30:58.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:30:58.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:30:58.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:30:58.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:30:58.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:30:58.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:30:42
2026-05-28T17:30:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69582, datetime.datetime(2026, 5, 28, 17, 30, 42), datetime.datetime(2026, 5, 28, 17, 30, 41), 'salt', 11.93, 54.01, None, 8.65, 139.4, 9.0, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:30:58.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:30:58.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:30:58.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:41, diff=17.289535s, valid=True
2026-05-28T17:30:58.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:30:58.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:30:58.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:12, diff=-13.707596s, valid=True
2026-05-28T17:30:58.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:30:58.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:30:33, diff=25.299028s, valid=True
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:30:58.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:30:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:12, diff=-13.697946s, valid=True
2026-05-28T17:30:58.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:30:58.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:30:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:30:58.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914900.302716s, valid=True
2026-05-28T17:30:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:30:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:30:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:30:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:30:58.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:30:58.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:30:58.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:30:58.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:30:58.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:30:58.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:30:58.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:30:58.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:30:58.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:30:58.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:30:58.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:30:59.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:30:59.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:30:59.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:30:59.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:30:59.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:30:59.427 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:30:59.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:31:29.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:31:29.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:31:29.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:31:29.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:31:29.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:31:29.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:31:29.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-28T17:31:29.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:31:29.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-28T17:31:29.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:31:29.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:31:29.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:31:29.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-28T17:31:32.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-28T17:31:32.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:31:32.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:31:32.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:31:32.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:31:32.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:31:32.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:31:32.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:31:32.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:31:32.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:31:32.357 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:31:32.357 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:31:32.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:31:32.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:31:32.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:31:32.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:31:32.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:31:32.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:31:32.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:31:32.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:31:32.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:31:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:31:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:31:32.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:31:32.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:31:12
2026-05-28T17:31:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69583, datetime.datetime(2026, 5, 28, 17, 31, 12), datetime.datetime(2026, 5, 28, 17, 31, 11), 'salt', 11.9, 54.94, None, 7.59, 131.08, 8.76, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:31:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:31:32.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:31:32.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:11, diff=21.69219s, valid=True
2026-05-28T17:31:32.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:31:32.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:31:32.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:12, diff=20.696523s, valid=True
2026-05-28T17:31:32.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:31:32.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:31:32.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:03, diff=29.706858s, valid=True
2026-05-28T17:31:32.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:31:32.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:31:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:31:32.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:31:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:31:32.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:31:32.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:12, diff=20.709938s, valid=True
2026-05-28T17:31:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:31:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:31:32.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:31:32.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914934.710595s, valid=True
2026-05-28T17:31:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:31:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:31:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:31:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:31:32.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:31:32.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:31:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:31:32.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:31:32.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:31:32.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:31:32.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:31:32.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:31:33.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:31:33.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:31:33.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:31:33.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:31:33.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:31:33.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:31:33.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:31:33.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:31:33.899 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:31:33.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:32:03.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:32:03.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:32:03.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:32:04.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:32:04.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:32:04.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:32:04.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-28T17:32:04.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:32:04.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-28T17:32:04.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:32:04.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:32:04.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:32:04.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-28T17:32: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-28T17:32:07.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:32:07.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:32:07.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:32:07.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:32:07.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:32:07.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:32:07.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:32:07.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:32:07.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:32:07.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:32:07.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:32:07.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:32:07.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:32:07.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:32:07.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:32:07.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:32:07.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:32:07.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:32:07.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:32:07.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:32:07.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:32:07.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:32:07.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:32:07.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:31:42
2026-05-28T17:32:07.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69584, datetime.datetime(2026, 5, 28, 17, 31, 42), datetime.datetime(2026, 5, 28, 17, 31, 42), 'salt', 11.76, 55.27, None, 8.44, 120.08, 8.66, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:32:07.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:32:07.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:32:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:42, diff=25.479683s, valid=True
2026-05-28T17:32:07.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:32:07.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:32:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:12, diff=-4.517424s, valid=True
2026-05-28T17:32:07.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:32:07.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:31:34, diff=33.489455s, valid=True
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:32:07.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:32:07.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:12, diff=-4.507475s, valid=True
2026-05-28T17:32:07.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:32:07.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:32:07.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:32:07.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=914969.493193s, valid=True
2026-05-28T17:32:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:32:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:32:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:32:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:32:07.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:32:07.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:32:07.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:32:07.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:32:07.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:32:07.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:32:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:32:07.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:32:07.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:32:07.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:32:08.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:32:08.475 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:32:08.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:32:08.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:32:08.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-28T17:32:08.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-28T17:32:08.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:32:08.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:32:38.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:32:38.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:32:38.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:32:39.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:32:39.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:32:39.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:32:39.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-28T17:32:39.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:32:39.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-28T17:32:39.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:32:39.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:32:39.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:32:39.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-28T17:32:41.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-28T17:32:41.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:32:41.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:32:41.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:32:41.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:32:41.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:32:41.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:32:41.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:32:41.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:32:41.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:32:41.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:32:41.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:32:41.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:32:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:32:41.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:32:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:32:41.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:32:41.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:32:41.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:32:41.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T17:32:41.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:32:41.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:32:41.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:32:41.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:32:42.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:32:12
2026-05-28T17:32:42.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69585, datetime.datetime(2026, 5, 28, 17, 32, 12), datetime.datetime(2026, 5, 28, 17, 32, 12), 'salt', 11.83, 56.1, None, 8.12, 120.01, 8.46, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:32:42.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:32:42.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:32:42.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:12, diff=30.058157s, valid=True
2026-05-28T17:32:42.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:32:42.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:32:42.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:12, diff=30.06109s, valid=True
2026-05-28T17:32:42.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:32:42.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:32:42.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:05, diff=37.067774s, valid=True
2026-05-28T17:32:42.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:32:42.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:32:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:32:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:32:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:32:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T17:32:42.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:32:12, diff=30.070814s, valid=True
2026-05-28T17:32:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:32:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:32:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:32:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915004.071464s, valid=True
2026-05-28T17:32:42.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:32:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:32:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:32:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:32:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:32:42.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:32:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:32:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:32:42.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:32:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:32:42.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:32:42.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:32:42.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:32:42.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:32:42.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:32:42.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:32:43.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:32:43.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:32:43.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-28T17:32:43.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-28T17:32:43.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:32:43.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:33:13.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:33:13.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:33:13.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:33:13.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:33:13.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:33:13.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:33:13.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-28T17:33:13.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:33:13.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-28T17:33:13.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:33:13.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:33:13.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:33:13.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-28T17:33:16.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-28T17:33:16.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:33:16.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:33:16.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:33:16.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:33:16.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:33:16.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:33:16.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:33:16.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:33:16.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:33:16.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:33:16.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:33:16.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:33:16.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:33:16.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:33:16.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:33:16.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:33:16.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:33:16.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:33:16.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T17:33:16.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:33:16.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:33:16.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:33:16.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:33:16.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:33:13
2026-05-28T17:33:16.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69587, datetime.datetime(2026, 5, 28, 17, 33, 13), datetime.datetime(2026, 5, 28, 17, 33, 13), 'salt', 11.67, 57.56, None, 8.4, 118.65, 8.09, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:33:16.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:33:16.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:33:16.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:13, diff=3.539558s, valid=True
2026-05-28T17:33:16.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:33:16.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:33:16.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:12, diff=4.542386s, valid=True
2026-05-28T17:33:16.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:33:16.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:33:16.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:08, diff=8.54887s, valid=True
2026-05-28T17:33:16.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:33:16.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:33:16.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:33:16.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:33:16.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:33:16.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T17:33:16.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:12, diff=4.551865s, valid=True
2026-05-28T17:33:16.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:33:16.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:33:16.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:33:16.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915038.552517s, valid=True
2026-05-28T17:33:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:33:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:33:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:33:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:33:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:33:16.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:33:16.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:33:16.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:33:16.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:33:16.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:33:16.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:33:16.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:33:16.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:33:16.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:33:17.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:33:17.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:33:17.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:33:17.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:33:17.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-28T17:33:17.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-28T17:33:17.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:33:17.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:33:47.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:33:47.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:33:47.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:33:48.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:33:48.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:33:48.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:33:48.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-28T17:33:48.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:33:48.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-28T17:33:48.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:33:48.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:33:48.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:33:48.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-28T17:33:51.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-28T17:33:51.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:33:51.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:33:51.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:33:51.090 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:33:51.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:33:51.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:33:51.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:33:51.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:33:51.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:33:51.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:33:51.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:33:51.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:33:51.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:33:51.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:33:51.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:33:51.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:33:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:33:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:33:51.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:33:51.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:33:51.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:33:51.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:33:51.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:33:51.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:33:44
2026-05-28T17:33:51.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69588, datetime.datetime(2026, 5, 28, 17, 33, 44), datetime.datetime(2026, 5, 28, 17, 33, 43), 'salt', 11.53, 57.66, None, 8.44, 123.22, 8.05, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:33:51.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:33:51.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:33:51.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:43, diff=8.42391s, valid=True
2026-05-28T17:33:51.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:33:51.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:33:51.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:12, diff=-20.573267s, valid=True
2026-05-28T17:33:51.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:33:51.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:33:40, diff=11.433301s, valid=True
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:33:51.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:33:51.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:12, diff=-20.563682s, valid=True
2026-05-28T17:33:51.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:33:51.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:33:51.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:33:51.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915073.436982s, valid=True
2026-05-28T17:33:51.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:33:51.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:33:51.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:33:51.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:33:51.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:33:51.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:33:51.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:33:51.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:33:51.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:33:51.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:33:51.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:33:51.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:33:51.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:33:51.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:33:51.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:33:52.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:33:52.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:33:52.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:33:52.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-28T17:33:52.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-28T17:33:52.540 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:33:52.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:34:22.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:34:22.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:34:22.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:34:23.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:34:23.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:34:23.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:34:23.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-28T17:34:23.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:34: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-28T17:34:23.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:34:23.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:34:23.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:34:23.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-28T17:34:25.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-28T17:34:25.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:34:25.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:34:25.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:34:25.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:34:25.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:34:25.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:34:25.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:34:25.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:34:25.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:34:25.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:34:25.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:34:25.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:34:26.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:34:26.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:34:26.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:34:26.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:34:26.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:34:26.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:34:26.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:34:26.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:34:26.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:34:26.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:34:26.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:34:26.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:34:14
2026-05-28T17:34:26.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69589, datetime.datetime(2026, 5, 28, 17, 34, 14), datetime.datetime(2026, 5, 28, 17, 34, 14), 'salt', 11.57, 58.22, None, 8.96, 117.01, 7.92, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:34:26.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:34:26.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:34:26.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:14, diff=12.252793s, valid=True
2026-05-28T17:34:26.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:34:26.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:34:26.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:12, diff=14.255593s, valid=True
2026-05-28T17:34:26.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:34:26.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:11, diff=15.262262s, valid=True
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:34:26.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:34:26.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:12, diff=14.265303s, valid=True
2026-05-28T17:34:26.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:34:26.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:34:26.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:34:26.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915108.265978s, valid=True
2026-05-28T17:34:26.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:34:26.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:34:26.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:34:26.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:34:26.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:34:26.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:34:26.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:34:26.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:34:26.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:34:26.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:34:26.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:34:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:34:26.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:34:26.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:34:26.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:34:27.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:34:27.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:34:27.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:34:27.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-28T17:34:27.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-28T17:34:27.316 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:34:27.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:34:57.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:34:57.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:34:57.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:34:57.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:34:57.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:34:57.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:34:57.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-28T17:34:57.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:34:57.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-28T17:34:57.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:34:57.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:34:57.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:34:57.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-28T17:35:00.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-28T17:35:00.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:35:00.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:35:00.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:35:00.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:35:00.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:35:00.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:35:00.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:35:00.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:35:00.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:35:00.595 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:35:00.595 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:35:00.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:35:00.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:35:00.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:35:00.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:35:00.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:35:00.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:35:00.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:35:00.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:35:00.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:35:00.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:35:00.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:35:00.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:35:00.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:34:44
2026-05-28T17:35:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69590, datetime.datetime(2026, 5, 28, 17, 34, 44), datetime.datetime(2026, 5, 28, 17, 34, 44), 'salt', 11.5, 58.45, None, 9.35, 121.21, 7.85, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:35:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:35:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:35:00.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:44, diff=16.917994s, valid=True
2026-05-28T17:35:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:35:00.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:35:00.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:12, diff=-11.077134s, valid=True
2026-05-28T17:35:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:35:00.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:35:00.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:34:42, diff=18.929745s, valid=True
2026-05-28T17:35:00.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:35:00.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:35:00.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:35:00.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:35:00.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:35:00.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:35:00.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:12, diff=-11.067159s, valid=True
2026-05-28T17:35:00.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:35:00.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:35:00.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:35:00.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915142.933497s, valid=True
2026-05-28T17:35:00.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:35:00.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:35:00.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:35:00.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:35:00.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:35:01.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:35:01.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:35:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:35:01.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:35:01.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:35:01.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:35:01.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:35:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:35:01.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:35:01.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:35:02.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:35:02.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:35:02.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:35:02.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-28T17:35:02.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-28T17:35:02.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:35:02.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:35:32.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:35:32.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:35:32.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:35:32.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:35:32.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:35:32.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:35:32.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:35:32.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:35:32.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-28T17:35:32.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:35:32.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:35:32.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:35:32.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:35:35.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-28T17:35:35.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:35:35.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:35:35.307 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:35:35.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:35:35.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:35:35.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:35:35.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:35:35.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:35:35.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:35:35.326 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:35:35.326 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:35:35.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:35:35.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:35:35.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:35:35.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:35:35.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:35:35.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:35:35.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:35:35.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:35:35.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:35:35.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:35:35.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:35:35.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:35:35.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:35:14
2026-05-28T17:35:35.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69591, datetime.datetime(2026, 5, 28, 17, 35, 14), datetime.datetime(2026, 5, 28, 17, 35, 14), 'salt', 11.47, 59.21, None, 9.88, 117.15, 7.67, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:35:35.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:35:35.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:35:35.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:14, diff=21.66072s, valid=True
2026-05-28T17:35:35.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:35:35.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:35:35.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:12, diff=23.663543s, valid=True
2026-05-28T17:35:35.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:35:35.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:35:35.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:14, diff=21.671876s, valid=True
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:35:35.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:35:35.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:12, diff=23.674952s, valid=True
2026-05-28T17:35:35.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:35:35.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:35:35.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:35:35.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915177.675639s, valid=True
2026-05-28T17:35:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:35:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:35:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:35:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:35:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:35:35.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:35:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:35:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:35:35.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:35:35.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:35:35.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:35:35.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:35:35.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:35:36.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:35:36.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:35:36.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:35:36.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:35:36.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:35:36.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-28T17:35:36.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-28T17:35:36.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:35:36.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:36:06.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:36:06.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:36:06.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:36:07.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:36:07.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:36:07.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:36:07.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-28T17:36:07.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:36:07.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-28T17:36:07.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:36:07.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:36:07.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:36:07.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-28T17:36:10.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-28T17:36:10.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:36:10.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:36:10.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:36:10.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:36:10.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:36:10.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:36:10.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:36:10.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:36:10.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:36:10.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:36:10.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:36:10.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:36:10.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:36:10.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:36:10.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:36:10.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:36:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:36:10.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:36:10.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:36:10.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:36:10.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:36:10.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:36:10.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:36:10.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:35:45
2026-05-28T17:36:10.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69592, datetime.datetime(2026, 5, 28, 17, 35, 45), datetime.datetime(2026, 5, 28, 17, 35, 44), 'salt', 11.4, 59.65, None, 10.52, 119.36, 7.56, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:36:10.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:36:10.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:36:10.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:44, diff=26.442729s, valid=True
2026-05-28T17:36:10.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:36:10.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:36:10.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:12, diff=-1.554386s, valid=True
2026-05-28T17:36:10.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:36:10.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:35:36, diff=34.452144s, valid=True
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:36:10.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:36:10.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:12, diff=-1.544811s, valid=True
2026-05-28T17:36:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:36:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:36:10.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:36:10.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915212.455844s, valid=True
2026-05-28T17:36:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:36:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:36:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:36:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:36:10.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:36:10.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:36:10.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:36:10.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:36:10.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:36:10.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:36:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:36:10.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:36:10.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:36:10.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:36:11.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:36:11.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:36:11.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:36:11.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:36:11.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-28T17:36:11.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-28T17:36:11.746 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:36:11.746 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:36:41.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:36:41.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:36:41.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:36:42.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:36:42.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:36:42.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:36:42.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-28T17:36:42.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:36:42.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-28T17:36:42.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:36:42.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:36:42.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:36:42.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-28T17:36:44.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-28T17:36:44.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:36:44.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:36:44.962 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:36:44.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:36:44.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:36:44.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:36:44.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:36:44.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:36:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:36:44.981 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:36:44.981 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:36:44.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:36:45.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:36:45.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:36:45.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:36:45.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:36:45.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:36:45.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:36:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T17:36:45.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:36:45.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:36:45.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:36:45.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:36:45.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:36:15
2026-05-28T17:36:45.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69593, datetime.datetime(2026, 5, 28, 17, 36, 15), datetime.datetime(2026, 5, 28, 17, 36, 14), 'salt', 11.4, 60.28, None, 10.59, 117.86, 7.41, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:36:45.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:36:45.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:36:45.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:45, diff=0.297727s, valid=True
2026-05-28T17:36:45.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:36:45.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:36:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:12, diff=33.300559s, valid=True
2026-05-28T17:36:45.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:36:45.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:38, diff=7.307149s, valid=True
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:36:45.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T17:36:45.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:36:12, diff=33.310159s, valid=True
2026-05-28T17:36:45.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:36:45.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:36:45.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:36:45.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915247.310828s, valid=True
2026-05-28T17:36:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:36:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:36:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:36:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:36:45.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:36:45.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:36:45.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:36:45.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:36:45.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:36:45.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:36:45.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:36:45.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:36:45.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:36:45.629 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:36:45.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:36:46.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:36:46.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:36:46.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:36:46.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-28T17:36:46.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-28T17:36:46.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:36:46.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:37:16.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:37:16.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:37:16.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:37:16.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:37:16.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:37:16.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:37:16.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-28T17:37:16.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:37:16.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-28T17:37:16.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:37:16.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:37:16.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:37:16.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-28T17:37:19.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-28T17:37:19.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:37:19.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:37:19.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:37:19.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:37:19.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:37:19.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:37:19.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:37:19.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:37:19.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:37:19.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:37:19.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:37:19.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:37:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:37:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:37:19.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:37:19.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:37:19.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:37:19.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:37:19.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:37:19.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:37:19.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:37:19.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:37:19.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:37:19.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:37:15
2026-05-28T17:37:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69595, datetime.datetime(2026, 5, 28, 17, 37, 15), datetime.datetime(2026, 5, 28, 17, 37, 15), 'salt', 11.14, 60.97, None, 9.18, 117.93, 7.24, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:37:19.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:37:19.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:37:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:15, diff=4.833314s, valid=True
2026-05-28T17:37:19.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:37:19.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:37:19.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:12, diff=7.836292s, valid=True
2026-05-28T17:37:19.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:37:19.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:09, diff=10.843367s, valid=True
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:37:19.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:37:19.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:37:19.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:12, diff=7.847251s, valid=True
2026-05-28T17:37:19.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:37:19.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:37:19.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:37:19.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915281.848018s, valid=True
2026-05-28T17:37:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:37:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:37:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:37:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:37:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:37:19.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:37:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:37:19.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:37:19.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:37:19.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:37:20.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:37:20.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:37:20.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:37:20.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:37:20.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:37:20.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:37:20.909 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:37:20.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:37:20.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-28T17:37:20.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-28T17:37:21.918 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:37:21.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:37:51.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:37:51.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:37:51.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:37:52.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:37:52.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:37:52.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:37:52.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-28T17:37:52.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:37:52.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-28T17:37:52.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:37:52.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:37:52.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:37:52.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:37:54.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-28T17:37:54.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:37:54.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:37:54.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:37:54.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:37:54.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:37:54.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:37:54.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:37:54.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:37:54.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:37:54.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:37:54.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:37:54.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:37:54.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:37:54.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:37:54.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:37:54.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:37:54.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:37:54.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:37:55.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:37:55.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:37:55.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:37:55.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:37:55.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:37:55.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:37:45
2026-05-28T17:37:55.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69596, datetime.datetime(2026, 5, 28, 17, 37, 45), datetime.datetime(2026, 5, 28, 17, 37, 45), 'salt', 11.2, 61.34, None, 9.46, 121.75, 7.15, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:37:55.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:37:55.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:37:55.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:45, diff=10.104095s, valid=True
2026-05-28T17:37:55.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:37:55.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:37:55.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:12, diff=-16.89303s, valid=True
2026-05-28T17:37:55.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:37:55.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:37:41, diff=14.113594s, valid=True
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:37:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:37:55.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:37:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:12, diff=-16.883369s, valid=True
2026-05-28T17:37:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:37:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:37:55.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:37:55.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915317.117282s, valid=True
2026-05-28T17:37:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:37:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:37:55.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:37:55.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:37:55.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:37:55.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:37:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:37:55.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:37:55.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:37:55.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:37:55.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:37:55.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:37:55.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:37:55.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:37:55.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:37:56.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:37:56.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:37:56.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:37:56.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-28T17:37:56.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-28T17:37:56.398 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:37:56.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:38:26.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:38:26.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:38:26.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:38:27.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:38:27.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:38:27.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:38:27.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-28T17:38:27.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:38:27.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-28T17:38:27.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:38:27.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:38:27.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:38:27.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-28T17:38:29.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-28T17:38:29.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:38:29.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:38:29.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:38:29.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:38:29.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:38:29.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:38:29.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:38:29.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:38:29.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:38:29.758 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:38:29.758 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:38:29.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:38:29.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:38:29.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:38:29.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:38:29.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:38:29.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:38:29.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:38:30.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:38:30.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:38:30.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:38:30.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:38:30.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:38:30.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:38:16
2026-05-28T17:38:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69597, datetime.datetime(2026, 5, 28, 17, 38, 16), datetime.datetime(2026, 5, 28, 17, 38, 15), 'salt', 11.14, 61.73, None, 9.32, 117.11, 7.06, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:38:30.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:38:30.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:38:30.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:15, diff=15.169973s, valid=True
2026-05-28T17:38:30.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:38:30.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:38:30.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:12, diff=18.172824s, valid=True
2026-05-28T17:38:30.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:38:30.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:12, diff=18.179411s, valid=True
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:38:30.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:38:30.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:12, diff=18.182489s, valid=True
2026-05-28T17:38:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:38:30.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:38:30.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:38:30.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915352.183175s, valid=True
2026-05-28T17:38:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:38:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:38:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:38:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:38:30.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:38:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:38:30.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:38:30.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:38:30.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:38:30.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:38:30.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:38:30.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:38:30.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:38:30.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:38:30.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:38:31.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:38:31.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:38:31.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:38:31.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-28T17:38:31.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-28T17:38:31.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:38:31.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:39:01.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:39:01.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:39:01.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:39:01.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:39:01.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:39:01.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:39:01.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-28T17:39:01.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:39:01.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-28T17:39:01.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:39:01.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:39:01.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:39:01.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:39:04.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:39:04.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:39:04.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:39:04.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:39:04.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:39:04.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:39:04.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:39:04.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:39:04.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:39:04.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:39:04.432 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:39:04.432 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:39:04.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:39:04.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:39:04.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:39:04.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:39:04.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:39:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:39:04.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:39:04.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:39:04.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:39:04.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:39:04.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:39:04.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:39:04.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:38:46
2026-05-28T17:39:04.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69598, datetime.datetime(2026, 5, 28, 17, 38, 46), datetime.datetime(2026, 5, 28, 17, 38, 46), 'salt', 11.1, 62.2, None, 9.74, 112.04, 6.95, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:39:04.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:39:04.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:39:04.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:46, diff=18.750788s, valid=True
2026-05-28T17:39:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:39:04.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:39:04.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:12, diff=-7.246375s, valid=True
2026-05-28T17:39:04.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:39:04.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:38:43, diff=21.760179s, valid=True
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:39:04.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:39:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:12, diff=-7.236772s, valid=True
2026-05-28T17:39:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:39:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:39:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:39:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915386.763914s, valid=True
2026-05-28T17:39:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:39:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:39:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:39:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:39:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:39:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:39:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:39:04.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:39:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:39:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:39:04.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:39:04.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:39:05.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:39:05.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:39:05.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:39:05.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:39:05.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:39:05.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:39:05.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-28T17:39:05.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-28T17:39:05.790 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:39:05.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:39:35.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:39:35.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:39:35.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:39:36.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:39:36.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:39:36.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:39:36.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:39:36.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:39:36.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-28T17:39:36.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:39:36.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:39:36.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:39:36.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-28T17:39:38.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-28T17:39:38.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:39:38.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:39:38.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:39:38.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:39:38.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:39:38.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:39:38.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:39:38.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:39:38.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:39:38.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:39:38.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:39:38.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:39:38.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:39:38.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:39:38.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:39:38.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:39:39.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:39:39.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:39:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:39:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:39:39.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:39:39.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:39:39.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:39:39.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:39:16
2026-05-28T17:39:39.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69599, datetime.datetime(2026, 5, 28, 17, 39, 16), datetime.datetime(2026, 5, 28, 17, 39, 16), 'salt', 11.07, 62.33, None, 10.34, 119.43, 6.92, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:39:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:39:39.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:39:39.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:16, diff=23.109935s, valid=True
2026-05-28T17:39:39.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:39:39.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:39:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:12, diff=27.112772s, valid=True
2026-05-28T17:39:39.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:39:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:15, diff=24.119348s, valid=True
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:39:39.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:39:39.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:12, diff=27.122381s, valid=True
2026-05-28T17:39:39.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:39:39.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:39:39.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:39:39.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915421.123044s, valid=True
2026-05-28T17:39:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:39:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:39:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:39:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:39:39.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:39:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:39:39.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:39:39.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:39:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:39:39.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:39:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:39:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:39:39.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:39:39.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:39:39.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:39:40.035 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:39:40.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:39:40.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:39: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-28T17:39: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-28T17:39:40.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:39:40.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:40:10.373 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:40:10.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:40:10.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:40:10.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:40:10.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:40:11.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:40:11.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:40:11.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:40:11.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:40:11.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:40:11.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:40:11.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:40:11.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-28T17:40:13.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-28T17:40:13.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:40:13.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:40:13.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:40:13.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:40:13.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:40:13.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:40:13.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:40:13.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:40:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:40:13.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:40:13.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:40:13.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:40:13.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:40:13.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:40:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:40:13.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:40:13.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:40:13.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:40:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:40:13.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:40:13.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:40:13.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:40:13.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:40:13.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:39:46
2026-05-28T17:40:13.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69600, datetime.datetime(2026, 5, 28, 17, 39, 46), datetime.datetime(2026, 5, 28, 17, 39, 46), 'salt', 11.04, 62.86, None, 10.66, 117.65, 6.8, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:40:13.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:40:13.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:40:13.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:46, diff=27.917304s, valid=True
2026-05-28T17:40:13.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:40:13.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:40:13.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:40:12, diff=1.920215s, valid=True
2026-05-28T17:40:13.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:40:13.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:40:13.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:39:38, diff=35.926844s, valid=True
2026-05-28T17:40:13.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:40:13.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:40:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:40:13.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:40:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:40:13.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:40:13.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:40:12, diff=1.931368s, valid=True
2026-05-28T17:40:13.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:40:13.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:40:13.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:40:13.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915455.932485s, valid=True
2026-05-28T17:40:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:40:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:40:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:40:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:40:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:40:13.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:40:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:40:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:40:14.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:40:14.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:40:14.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:40:14.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:40:14.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:40:14.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:40:14.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:40:14.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:40:15.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:40:15.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:40:15.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-28T17:40:15.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-28T17:40:15.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:40:15.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:40:45.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:40:45.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:40:45.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:40:45.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:40:45.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:40:45.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:40:45.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-28T17:40:45.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:40:45.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:40:45.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:40:45.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:40:45.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:40:45.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:40:48.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-28T17:40:48.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:40:48.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:40:48.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:40:48.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:40:48.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:40:48.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:40:48.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:40:48.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:40:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:40:48.322 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:40:48.322 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:40:48.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:40:48.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:40:48.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:40:48.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:40:48.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:40:48.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:40:48.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:40:48.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:40:48.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:40:48.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:40:48.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:40:48.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:40:48.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:40:47
2026-05-28T17:40:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69602, datetime.datetime(2026, 5, 28, 17, 40, 47), datetime.datetime(2026, 5, 28, 17, 40, 47), 'salt', 10.91, 63.62, None, 10.8, 115.96, 6.62, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:40:48.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:40:48.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:40:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:40:47, diff=1.641939s, valid=True
2026-05-28T17:40:48.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:40:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:40:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:12, diff=-23.355231s, valid=True
2026-05-28T17:40:48.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:40:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:40:39, diff=9.651331s, valid=True
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:40:48.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:40:48.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:12, diff=-23.345671s, valid=True
2026-05-28T17:40:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:40:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:40:48.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:40:48.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915490.655001s, valid=True
2026-05-28T17:40:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:40:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:40:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:40:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:40:48.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:40:48.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:40:48.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:40:48.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:40:48.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:40:48.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:40:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:40:48.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:40:48.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:40:48.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:40:49.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:40:49.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:40:49.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:40:49.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:40:49.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-28T17:40:49.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-28T17:40:49.861 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:40:49.861 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:41:19.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:41:19.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:41:19.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:41:20.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:41:20.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:41:20.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:41:20.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-28T17:41:20.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:41:20.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-28T17:41:20.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:41:20.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:41:20.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:41:20.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-28T17:41: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-28T17:41:22.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:41:22.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:41:22.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:41:22.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:41:22.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:41:22.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:41:22.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:41:22.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:41:22.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:41:22.734 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:41:22.734 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:41:22.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:41:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:41:22.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:41:22.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:41:22.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:41:22.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:41:22.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:41:22.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:41:22.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:41:22.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:41:22.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:41:22.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:41:23.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:41:17
2026-05-28T17:41:23.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69603, datetime.datetime(2026, 5, 28, 17, 41, 17), datetime.datetime(2026, 5, 28, 17, 41, 17), 'salt', 10.91, 63.89, None, 10.66, 113.06, 6.56, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:41:23.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:41:23.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:41:23.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:17, diff=6.04963s, valid=True
2026-05-28T17:41:23.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:41:23.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:41:23.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:12, diff=11.052472s, valid=True
2026-05-28T17:41:23.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:41:23.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:11, diff=12.059018s, valid=True
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:41:23.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:41:23.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:12, diff=11.062041s, valid=True
2026-05-28T17:41:23.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:41:23.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:41:23.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:41:23.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915525.062741s, valid=True
2026-05-28T17:41:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:41:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:41:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:41:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:41:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:41:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:41:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:41:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:41:23.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:41:23.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:41:23.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:41:23.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:41:23.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:41:23.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:41:23.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:41:23.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:41:24.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:41:24.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:41:24.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-28T17:41:24.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-28T17:41:24.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:41:24.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:41:54.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:41:54.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:41:54.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:41:54.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:41:54.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:41:54.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:41:54.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-28T17:41:54.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:41:54.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-28T17:41:54.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:41:54.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:41:54.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:41:54.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-28T17:41: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-28T17:41:57.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:41:57.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:41:57.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:41:57.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:41:57.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:41:57.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:41:57.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:41:57.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:41:57.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:41:57.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:41:57.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:41:57.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:41:57.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:41:57.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:41:57.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:41:57.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:41:57.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:41:57.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:41:57.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:41:57.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:41:57.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:41:57.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:41:57.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:41:57.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:41:47
2026-05-28T17:41:57.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69604, datetime.datetime(2026, 5, 28, 17, 41, 47), datetime.datetime(2026, 5, 28, 17, 41, 47), 'salt', 10.81, 64.25, None, 12.07, 110.71, 6.47, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:41:57.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:41:57.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:41:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:47, diff=10.649446s, valid=True
2026-05-28T17:41:57.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:41:57.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:41:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:12, diff=-14.347673s, valid=True
2026-05-28T17:41:57.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:41:57.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:41:57.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:41:42, diff=15.658956s, valid=True
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:41:57.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:41:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:12, diff=-14.338006s, valid=True
2026-05-28T17:41:57.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:41:57.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:41:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:41:57.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915559.662652s, valid=True
2026-05-28T17:41:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:41:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:41:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:41:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:41:57.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:41:57.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:41:57.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:41:57.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:41:57.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:41:57.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:41:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:41:57.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:41:57.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:41:57.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:41:58.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:41:58.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:41:58.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:41:58.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:41:58.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-28T17:41:58.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-28T17:41:58.793 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:41:58.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:42:28.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:42:28.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:42:28.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:42:29.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:42:29.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:42:29.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:42:29.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-28T17:42:29.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:42:29.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-28T17:42:29.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:42:29.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:42:29.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:42:29.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-28T17:42:31.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-28T17:42:31.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:42:31.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:42:31.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:42:31.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:42:31.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:42:31.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:42:31.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:42:31.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:42:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:42:31.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:42:31.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:42:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:42:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:42:31.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:42:32.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:42:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:42:32.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:42:32.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:42:32.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:42:32.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:42:32.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:42:32.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:42:32.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:42:32.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:42:18
2026-05-28T17:42:32.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69605, datetime.datetime(2026, 5, 28, 17, 42, 18), datetime.datetime(2026, 5, 28, 17, 42, 17), 'salt', 10.77, 64.49, None, 11.96, 105.11, 6.41, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:42:32.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:42:32.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:42:32.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:17, diff=15.1781s, valid=True
2026-05-28T17:42:32.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:42:32.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:42:32.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:12, diff=20.180934s, valid=True
2026-05-28T17:42:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:42:32.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:14, diff=18.187581s, valid=True
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:42:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:42:32.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:42:32.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:12, diff=20.190652s, valid=True
2026-05-28T17:42:32.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:42:32.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:42:32.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:42:32.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915594.191403s, valid=True
2026-05-28T17:42:32.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:42:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:42:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:42:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:42:32.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:42:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:42:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:42:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:42:32.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:42:32.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:42:32.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:42:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:42:32.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:42:32.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:42:32.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:42:33.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:42:33.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:42:33.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:42:33.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-28T17:42:33.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-28T17:42:33.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:42:33.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:43:03.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:43:03.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:43:03.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:43:03.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:43:03.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:43:03.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:43:03.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-28T17:43:03.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:43:03.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-28T17:43:03.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:43:03.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:43:03.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:43:03.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-28T17:43:06.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-28T17:43:06.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:43:06.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:43:06.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:43:06.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:43:06.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:43:06.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:43:06.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:43:06.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:43:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:43:06.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:43:06.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:43:06.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:43:06.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:43:06.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:43:06.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:43:06.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:43:06.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:43:06.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:43:06.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:43:06.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:43:06.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:43:06.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:43:06.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:43:06.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:42:48
2026-05-28T17:43:06.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69606, datetime.datetime(2026, 5, 28, 17, 42, 48), datetime.datetime(2026, 5, 28, 17, 42, 47), 'salt', 10.77, 65.22, None, 11.68, 105.72, 6.25, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:43:06.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:43:06.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:43:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:47, diff=19.521824s, valid=True
2026-05-28T17:43:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:43:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:43:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:12, diff=-5.475261s, valid=True
2026-05-28T17:43:06.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:43:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:42:45, diff=21.533349s, valid=True
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:43:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:43:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:12, diff=-5.463482s, valid=True
2026-05-28T17:43:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:43:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:43:06.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:43:06.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915628.537205s, valid=True
2026-05-28T17:43:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:43:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:43:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:43:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:43:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:43:06.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:43:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:43:06.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:43:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:43:06.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:43:06.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:43:06.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:43:06.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:43:06.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:43:07.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:43:07.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:43:07.538 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:43:07.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:43:07.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-28T17:43:07.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-28T17:43:07.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:43:07.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:43:37.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:43:37.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:43:37.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:43:37.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:43:38.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:43:38.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:43:38.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:43:38.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:43:38.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-28T17:43:38.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:43:38.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:43:38.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:43:38.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-28T17:43:40.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-28T17:43:40.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:43:40.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:43:40.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:43:40.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:43:40.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:43:40.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:43:40.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:43:40.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:43:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:43:40.697 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:43:40.697 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:43:40.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:43:40.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:43:40.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:43:40.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:43:40.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:43:40.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:43:40.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:43:40.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:43:40.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:43:40.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:43:40.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:43:40.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:43:41.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:43:18
2026-05-28T17:43:41.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69607, datetime.datetime(2026, 5, 28, 17, 43, 18), datetime.datetime(2026, 5, 28, 17, 43, 18), 'salt', 11.17, 65.25, None, 11.5, 107.5, 6.27, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:43:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:43:41.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:43:41.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:18, diff=23.055905s, valid=True
2026-05-28T17:43:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:43:41.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:43:41.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:12, diff=29.058846s, valid=True
2026-05-28T17:43:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:43:41.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:17, diff=24.065471s, valid=True
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:43:41.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:43:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:12, diff=29.068493s, valid=True
2026-05-28T17:43:41.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:43:41.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:43:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:43:41.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915663.069161s, valid=True
2026-05-28T17:43:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:43:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:43:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:43:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:43:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:43:41.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:43:41.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:43:41.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:43:41.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:43:41.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:43:41.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:43:41.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:43:41.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:43:41.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:43:41.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:43:42.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:43:42.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:43:42.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:43:42.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-28T17:43:42.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-28T17:43:42.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:43:42.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:44:12.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:44:12.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:44:12.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:44:12.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:44:12.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:44:12.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:44:12.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-28T17:44:12.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:44:12.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-28T17:44:12.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:44:12.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:44:12.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:44:12.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-28T17:44:15.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:44:15.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:44:15.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:44:15.144 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:44:15.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:44:15.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:44:15.162 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:44:15.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:44:15.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:44:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:44:15.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:44:15.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:44:15.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:44:15.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:44:15.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:44:15.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:44:15.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:44:15.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:44:15.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:44:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:44:15.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:44:15.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:44:15.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:44:15.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:44:15.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:43:48
2026-05-28T17:44:15.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69608, datetime.datetime(2026, 5, 28, 17, 43, 48), datetime.datetime(2026, 5, 28, 17, 43, 48), 'salt', 10.71, 65.85, None, 10.59, 114.86, 6.12, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:44:15.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:44:15.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:44:15.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:48, diff=27.477988s, valid=True
2026-05-28T17:44:15.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:44:15.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:44:15.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:44:12, diff=3.480926s, valid=True
2026-05-28T17:44:15.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:44:15.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:43:48, diff=27.487519s, valid=True
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:44:15.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:44:15.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:44:12, diff=3.490576s, valid=True
2026-05-28T17:44:15.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:44:15.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:44:15.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:44:15.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915697.49124s, valid=True
2026-05-28T17:44:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:44:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:44:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:44:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:44:15.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:44:15.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:44:15.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:44:15.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:44:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:44:15.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:44:15.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:44:15.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:44:15.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:44:15.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:44:16.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:44:16.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:44:16.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:44:16.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:44:16.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-28T17:44:16.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-28T17:44:16.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:44:16.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:44:46.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:44:46.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:44:46.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:44:46.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:44:46.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:44:47.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:44:47.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-28T17:44:47.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:44:47.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-28T17:44:47.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:44:47.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:44:47.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:44:47.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-28T17:44:49.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-28T17:44:49.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:44:49.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:44:49.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:44:49.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:44:49.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:44:49.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:44:49.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:44:49.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:44:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:44:49.503 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:44:49.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:44:49.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:44:49.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:44:49.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:44:49.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:44:49.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:44:49.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:44:49.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:44:49.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:44:49.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:44:49.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:44:49.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:44:49.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:44:49.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:44:49
2026-05-28T17:44:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69610, datetime.datetime(2026, 5, 28, 17, 44, 49), datetime.datetime(2026, 5, 28, 17, 44, 48), 'salt', 10.68, 66.34, None, 10.73, 105.42, 6.01, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:44:49.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:44:49.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:44:49.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:44:48, diff=1.840946s, valid=True
2026-05-28T17:44:49.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:44:49.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:44:49.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:12, diff=-22.155429s, valid=True
2026-05-28T17:44:49.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:44:49.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:44:49.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:44:41, diff=8.852506s, valid=True
2026-05-28T17:44:49.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:44:49.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:44:49.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:44:49.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:44:49.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:44:49.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:44:49.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:12, diff=-22.142521s, valid=True
2026-05-28T17:44:49.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:44:49.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:44:49.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:44:49.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915731.858824s, valid=True
2026-05-28T17:44:49.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:44:49.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:44:49.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:44:49.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:44:49.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:44:49.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:44:49.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:44:49.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:44:50.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:44:50.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:44:50.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:44:50.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:44:50.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:44:50.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:44:50.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:44:50.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:44:50.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:44:50.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:44:50.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-28T17:44:50.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-28T17:44:50.988 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:44:50.988 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:45:20.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:45:20.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:45:20.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:45:21.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:45:21.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:45:21.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:45:21.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-28T17:45:21.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:45:21.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-28T17:45:21.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:45:21.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:45:21.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:45:21.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-28T17:45:23.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-28T17:45:23.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:45:23.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:45:23.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:45:23.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:45:23.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:45:23.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:45:23.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:45:23.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:45:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:45:23.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:45:23.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:45:23.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:45:24.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:45:24.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:45:24.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:45:24.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:45:24.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:45:24.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:45:24.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:45:24.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:45:24.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:45:24.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:45:24.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:45:24.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:45:19
2026-05-28T17:45:24.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69611, datetime.datetime(2026, 5, 28, 17, 45, 19), datetime.datetime(2026, 5, 28, 17, 45, 19), 'salt', 10.61, 66.44, None, 10.73, 110.43, 5.98, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:45:24.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:45:24.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:45:24.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:19, diff=5.24353s, valid=True
2026-05-28T17:45:24.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:45:24.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:45:24.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:12, diff=12.246413s, valid=True
2026-05-28T17:45:24.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:45:24.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:45:24.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:12, diff=12.252924s, valid=True
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:45:24.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:45:24.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:12, diff=12.255978s, valid=True
2026-05-28T17:45:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:45:24.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:45:24.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:45:24.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915766.25663s, valid=True
2026-05-28T17:45:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:45:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:45:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:45:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:45:24.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:45:24.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:45:24.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:45:24.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:45:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:45:24.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:45:24.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:45:24.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:45:24.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:45:24.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:45:24.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:45:25.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:45:25.214 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:45:25.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:45:25.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-28T17:45:25.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-28T17:45:25.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:45:25.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:45:55.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:45:55.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:45:55.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:45:55.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:45:55.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:45:55.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:45:55.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:45:55.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:45:55.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:45:55.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:45:55.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:45:55.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:45:55.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-28T17:45:58.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-28T17:45:58.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:45:58.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:45:58.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:45:58.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:45:58.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:45:58.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:45:58.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:45:58.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:45:58.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:45:58.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:45:58.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:45:58.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:45:58.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:45:58.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:45:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:45:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:45:58.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:45:58.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:45:58.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:45:58.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:45:58.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:45:58.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:45:58.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:45:58.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:45:49
2026-05-28T17:45:58.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69612, datetime.datetime(2026, 5, 28, 17, 45, 49), datetime.datetime(2026, 5, 28, 17, 45, 49), 'salt', 10.74, 66.48, None, 11.01, 108.42, 5.98, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:45:58.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:45:58.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:45:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:49, diff=9.757608s, valid=True
2026-05-28T17:45:58.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:45:58.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:45:58.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:12, diff=-13.237626s, valid=True
2026-05-28T17:45:58.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:45:58.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:45:44, diff=14.772967s, valid=True
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:45:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:45:58.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:12, diff=-13.221692s, valid=True
2026-05-28T17:45:58.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:45:58.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:45:58.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:45:58.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915800.779463s, valid=True
2026-05-28T17:45:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:45:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:45:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:45:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:45:58.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:45:58.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:45:58.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:45:58.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:45:58.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:45:58.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:45:59.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:45:59.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:45:59.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:45:59.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:45:59.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:45:59.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:45:59.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:45:59.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:45: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-28T17:45: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-28T17:45:59.930 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:45:59.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:46:29.960 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:46:29.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:46:29.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:46:30.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:46:30.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:46:30.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:46:30.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-28T17:46:30.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:46:30.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-28T17:46:30.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:46:30.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:46:30.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:46:30.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-28T17:46: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-28T17:46:32.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:46:32.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:46:32.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:46:32.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:46:32.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:46:32.889 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:46:32.889 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:46:32.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:46:32.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:46:32.890 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:46:32.890 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:46:32.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:46:32.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:46:32.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:46:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:46:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:46:33.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:46:33.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:46:33.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:46:33.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:46:33.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:46:33.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:46:33.170 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:46:33.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:46:19
2026-05-28T17:46:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69613, datetime.datetime(2026, 5, 28, 17, 46, 19), datetime.datetime(2026, 5, 28, 17, 46, 19), 'salt', 10.68, 66.38, None, 12.0, 110.25, 6.0, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:46:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:46:33.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:46:33.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:19, diff=14.236129s, valid=True
2026-05-28T17:46:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:46:33.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:46:33.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:12, diff=21.23894s, valid=True
2026-05-28T17:46:33.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:46:33.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:15, diff=18.245594s, valid=True
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:46:33.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:46:33.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:46:33.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:12, diff=21.248609s, valid=True
2026-05-28T17:46:33.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:46:33.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:46:33.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:46:33.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915835.249269s, valid=True
2026-05-28T17:46:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:46:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:46:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:46:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:46:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:46:33.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:46:33.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:46:33.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:46:33.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:46:33.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:46:33.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:46:33.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:46:33.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:46:33.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:46:33.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:46:34.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:46:34.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:46:34.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:46:34.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:46:34.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:46:34.485 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:46:34.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:47:04.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:47:04.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:47:04.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:47:04.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:47:05.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:47:05.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:47:05.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-28T17:47:05.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:47:05.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-28T17:47:05.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:47:05.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:47:05.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:47:05.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-28T17:47:07.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-28T17:47:07.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:47:07.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:47:07.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:47:07.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:47:07.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:47:07.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:47:07.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:47:07.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:47:07.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:47:07.703 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:47:07.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:47:07.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:47:07.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:47:07.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:47:07.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:47:07.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:47:07.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:47:07.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:47:07.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:47:07.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:47:07.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:47:07.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:47:07.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:47:08.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:46:50
2026-05-28T17:47:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69614, datetime.datetime(2026, 5, 28, 17, 46, 50), datetime.datetime(2026, 5, 28, 17, 46, 49), 'salt', 10.68, 66.28, None, 12.03, 102.35, 6.02, 830.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:47:08.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:47:08.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:47:08.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:49, diff=19.018802s, valid=True
2026-05-28T17:47:08.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:47:08.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:47:08.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:12, diff=-3.978294s, valid=True
2026-05-28T17:47:08.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:47:08.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:46:47, diff=21.028328s, valid=True
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:47:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:47:08.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:12, diff=-3.968542s, valid=True
2026-05-28T17:47:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:47:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:47:08.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:47:08.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915870.032137s, valid=True
2026-05-28T17:47:08.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:47:08.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:47:08.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:47:08.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:47:08.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:47:08.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:47:08.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:47:08.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:47:08.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:47:08.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:47:08.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:47:08.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:47:08.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:47:08.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:47:08.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:47:08.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:47:09.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:47:09.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:47:09.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-28T17:47:09.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-28T17:47:09.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:47:09.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:47:39.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:47:39.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:47:39.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:47:39.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:47:39.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:47:39.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:47:39.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-28T17:47:39.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:47:39.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-28T17:47:39.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:47:39.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:47:39.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:47:39.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-28T17:47:42.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-28T17:47:42.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:47:42.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:47:42.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:47:42.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:47:42.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:47:42.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:47:42.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:47:42.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:47:42.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:47:42.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:47:42.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:47:42.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:47:42.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:47:42.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:47:42.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:47:42.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:47:42.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:47:42.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:47:42.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:47:42.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:47:42.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:47:42.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:47:42.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:47:42.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:47:20
2026-05-28T17:47:42.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69615, datetime.datetime(2026, 5, 28, 17, 47, 20), datetime.datetime(2026, 5, 28, 17, 47, 20), 'salt', 10.65, 66.25, None, 10.27, 105.49, 6.03, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:47:42.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:47:42.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:47:42.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:20, diff=22.510928s, valid=True
2026-05-28T17:47:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:47:42.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:47:42.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:12, diff=30.51376s, valid=True
2026-05-28T17:47:42.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:47:42.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:18, diff=24.520256s, valid=True
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:47:42.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:47:42.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:12, diff=30.523332s, valid=True
2026-05-28T17:47:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:47:42.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:47:42.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:47:42.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915904.523991s, valid=True
2026-05-28T17:47:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:47:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:47:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:47:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:47:42.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:47:42.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:47:42.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:47:42.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:47:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:47:42.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:47:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:47:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:47:42.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:47:42.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:47:43.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:47:43.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:47:43.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:47:43.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:47:43.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-28T17:47:43.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-28T17:47:43.731 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:47:43.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:48:13.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:48:13.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:48:13.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:48:14.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:48:14.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:48:14.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:48:14.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-28T17:48:14.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:48:14.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-28T17:48:14.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:48:14.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:48:14.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:48:14.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-28T17:48: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-28T17:48:16.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:48:16.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:48:16.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:48:16.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:48:16.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:48:16.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:48:16.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:48:16.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:48:16.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:48:16.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:48:16.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:48:16.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:48:16.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:48:16.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:48:17.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:48:17.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:48:17.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:48:17.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:48:17.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:48:17.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:48:17.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:48:17.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:48:17.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:48:17.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:47:50
2026-05-28T17:48:17.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69616, datetime.datetime(2026, 5, 28, 17, 47, 50), datetime.datetime(2026, 5, 28, 17, 47, 50), 'salt', 10.65, 66.51, None, 10.91, 102.35, 5.97, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:48:17.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:48:17.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:48:17.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:50, diff=27.227426s, valid=True
2026-05-28T17:48:17.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:48:17.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:48:17.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:48:12, diff=5.230255s, valid=True
2026-05-28T17:48:17.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:48:17.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:48:17.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:47:50, diff=27.236807s, valid=True
2026-05-28T17:48:17.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:48:17.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:48:17.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:48:17.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:48:17.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:48:17.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:48:17.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:48:12, diff=5.239852s, valid=True
2026-05-28T17:48:17.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:48:17.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:48:17.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:48:17.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915939.240498s, valid=True
2026-05-28T17:48:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:48:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:48:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:48:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:48:17.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:48:17.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:48:17.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:48:17.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:48:17.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:48:17.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:48:17.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:48:17.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:48:17.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:48:17.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:48:17.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:48:18.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:48:18.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:48:18.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:48:18.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-28T17:48:18.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-28T17:48:18.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:48:18.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:48:48.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:48:48.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:48:48.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:48:48.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:48:48.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:48:48.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:48:48.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-28T17:48:48.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:48:48.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-28T17:48:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:48:48.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:48:48.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:48:48.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-28T17:48:51.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-28T17:48:51.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:48:51.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:48:51.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:48:51.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:48:51.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:48:51.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:48:51.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:48:51.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:48:51.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:48:51.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:48:51.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:48:51.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:48:51.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:48:51.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:48:51.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:48:51.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:48:51.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:48:51.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:48:51.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:48:51.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:48:51.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:48:51.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:48:51.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:48:51.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:48:51
2026-05-28T17:48:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69618, datetime.datetime(2026, 5, 28, 17, 48, 51), datetime.datetime(2026, 5, 28, 17, 48, 50), 'salt', 10.65, 66.88, None, 10.91, 105.86, 5.9, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:48:51.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:48:51.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:48:51.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:48:50, diff=1.730201s, valid=True
2026-05-28T17:48:51.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:48:51.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:48:51.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:12, diff=-20.266947s, valid=True
2026-05-28T17:48:51.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:48:51.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:48:51.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:48:44, diff=7.739749s, valid=True
2026-05-28T17:48:51.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:48:51.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:48:51.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:48:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:48:51.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:48:51.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:48:51.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:12, diff=-20.257191s, valid=True
2026-05-28T17:48:51.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:48:51.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:48:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:48:51.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=915973.743461s, valid=True
2026-05-28T17:48:51.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:48:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:48:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:48:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:48:51.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:48:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:48:51.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:48:51.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:48:51.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:48:51.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:48:52.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:48:52.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:48:52.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:48:52.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:48:52.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:48:52.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:48:52.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:48:52.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:48: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-28T17:48: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-28T17:48:52.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:48:52.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:49:22.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:49:22.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:49:22.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:49:23.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:49:23.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:49:23.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:49:23.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-28T17:49:23.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:49:23.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-28T17:49:23.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:49:23.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:49:23.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:49:23.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-28T17:49:26.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-28T17:49:26.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:49:26.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:49:26.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:49:26.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:49:26.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:49:26.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:49:26.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:49:26.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:49:26.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:49:26.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:49:26.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:49:26.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:49:26.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:49:26.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:49:26.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:49:26.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:49:26.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:49:26.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:49:26.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:49:26.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:49:26.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:49:26.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:49:26.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:49:26.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:49:21
2026-05-28T17:49:26.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69619, datetime.datetime(2026, 5, 28, 17, 49, 21), datetime.datetime(2026, 5, 28, 17, 49, 20), 'salt', 10.58, 66.97, None, 10.66, 102.02, 5.87, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:49:26.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:49:26.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:49:26.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:20, diff=6.640345s, valid=True
2026-05-28T17:49:26.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:49:26.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:49:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:12, diff=14.643193s, valid=True
2026-05-28T17:49:26.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:49:26.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:49:26.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:14, diff=12.649799s, valid=True
2026-05-28T17:49:26.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:49:26.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:49:26.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:49:26.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:49:26.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:49:26.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:49:26.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:12, diff=14.652844s, valid=True
2026-05-28T17:49:26.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:49:26.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:49:26.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:49:26.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916008.653503s, valid=True
2026-05-28T17:49:26.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:49:26.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:49:26.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:49:26.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:49:26.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:49:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:49:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:49:26.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:49:26.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:49:26.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:49:26.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:49:26.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:49:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:49:26.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:49:27.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:49:27.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:49:27.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:49:27.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:49:27.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-28T17:49:27.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-28T17:49:27.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:49:27.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:49:57.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:49:57.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:49:57.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:49:58.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:49:58.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:49:58.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:49:58.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T17:49:58.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:49:58.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-28T17:49:58.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:49:58.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:49:58.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:49:58.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:50:01.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-28T17:50:01.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:50:01.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:50:01.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:50:01.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:50:01.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:50:01.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:50:01.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:50:01.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:50:01.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:50:01.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:50:01.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:50:01.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:50:01.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:50:01.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:50:01.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:50:01.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:50:01.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:50:01.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:50:01.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:50:01.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:50:01.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:50:01.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:50:01.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:50:01.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:49:51
2026-05-28T17:50:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69620, datetime.datetime(2026, 5, 28, 17, 49, 51), datetime.datetime(2026, 5, 28, 17, 49, 51), 'salt', 10.65, 67.17, None, 10.73, 101.18, 5.83, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:50:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:50:01.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:50:01.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:51, diff=10.613316s, valid=True
2026-05-28T17:50:01.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:50:01.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:50:01.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:12, diff=-10.383761s, valid=True
2026-05-28T17:50:01.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:50:01.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:50:01.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:49:45, diff=16.622956s, valid=True
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:50:01.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:50:01.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:12, diff=-10.373921s, valid=True
2026-05-28T17:50:01.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:50:01.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:50:01.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:50:01.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916043.626763s, valid=True
2026-05-28T17:50:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:50:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:50:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:50:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:50:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:50:01.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:50:01.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:50:01.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:50:01.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:50:01.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:50:01.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:50:01.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:50:02.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:50:02.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:50:02.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:50:02.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:50:02.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:50:02.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:50:02.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-28T17:50:02.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-28T17:50:02.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:50:02.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:50:33.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:50:33.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:50:33.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:50:33.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:50:33.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:50:33.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:50:33.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-28T17:50:33.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:50:33.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-28T17:50:33.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:50:33.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:50:33.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:50:33.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-28T17:50:36.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-28T17:50:36.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:50:36.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:50:36.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:50:36.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:50:36.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:50:36.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:50:36.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:50:36.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:50:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:50:36.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:50:36.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:50:36.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:50:36.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:50:36.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:50:36.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:50:36.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:50:36.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:50:36.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:50:36.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:50:36.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:50:36.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:50:36.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:50:36.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:50:36.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:50:21
2026-05-28T17:50:36.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69621, datetime.datetime(2026, 5, 28, 17, 50, 21), datetime.datetime(2026, 5, 28, 17, 50, 21), 'salt', 10.55, 67.11, None, 10.31, 107.88, 5.84, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:50:36.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:50:36.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:50:36.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:21, diff=15.540959s, valid=True
2026-05-28T17:50:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:50:36.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:50:36.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:12, diff=24.543846s, valid=True
2026-05-28T17:50:36.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:50:36.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:16, diff=20.550418s, valid=True
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:50:36.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:50:36.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:12, diff=24.553394s, valid=True
2026-05-28T17:50:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:50:36.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:50:36.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:50:36.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916078.554058s, valid=True
2026-05-28T17:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:50:36.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:50:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:50:36.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:50:36.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:50:36.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:50:36.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:50:36.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:50:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:50:36.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:50:37.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:50:37.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:50:37.571 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:50:37.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:50:37.571 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T17:50:37.571 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T17:50:37.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:50:37.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:51:07.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:51:07.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:51:07.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:51:08.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:51:08.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:51:08.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:51:08.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-28T17:51:08.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:51:08.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-28T17:51:08.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:51:08.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:51:08.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:51:08.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-28T17:51:11.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-28T17:51:11.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:51:11.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:51:11.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:51:11.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:51:11.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:51:11.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:51:11.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:51:11.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:51:11.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:51:11.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:51:11.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:51:11.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:51:11.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:51:11.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:51:11.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:51:11.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:51:11.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:51:11.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:51:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:51:11.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:51:11.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:51:11.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:51:11.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:51:11.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:50:52
2026-05-28T17:51:11.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69622, datetime.datetime(2026, 5, 28, 17, 50, 52), datetime.datetime(2026, 5, 28, 17, 50, 51), 'salt', 10.58, 67.37, None, 12.21, 109.03, 5.78, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:51:11.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:51:11.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:51:11.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:51, diff=20.908412s, valid=True
2026-05-28T17:51:11.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:51:11.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:51:11.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:12, diff=-0.088741s, valid=True
2026-05-28T17:51:11.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:51:11.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:51:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:50:47, diff=24.917752s, valid=True
2026-05-28T17:51:11.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:51:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:51:11.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:51:11.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:51:11.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:51:11.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:51:11.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:12, diff=-0.079255s, valid=True
2026-05-28T17:51:11.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:51:11.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:51:11.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:51:11.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916113.921391s, valid=True
2026-05-28T17:51:11.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:51:11.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:51:11.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:51:11.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:51:11.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:51:11.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:51:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:51:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:51:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:51:12.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:51:12.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:51:12.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:51:12.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:51:12.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:51:12.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:51:12.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:51:13.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:51:13.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:51:13.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-28T17:51:13.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-28T17:51:13.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:51:13.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:51:43.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:51:43.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:51:43.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:51:43.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:51:43.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:51:43.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:51:43.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-28T17:51:43.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:51:43.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-28T17:51:43.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:51:43.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:51:43.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:51:43.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:51:46.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-28T17:51:46.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:51:46.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:51:46.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:51:46.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:51:46.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:51:46.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:51:46.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:51:46.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:51:46.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:51:46.780 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:51:46.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:51:46.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:51:46.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:51:46.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:51:46.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:51:46.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:51:46.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:51:46.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:51:47.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:51:47.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:51:47.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:51:47.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:51:47.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:51:47.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:51:22
2026-05-28T17:51:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69623, datetime.datetime(2026, 5, 28, 17, 51, 22), datetime.datetime(2026, 5, 28, 17, 51, 21), 'salt', 10.51, 67.57, None, 12.1, 106.24, 5.73, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:51:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:51:47.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:51:47.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:21, diff=26.095008s, valid=True
2026-05-28T17:51:47.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:51:47.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:51:47.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:12, diff=35.097815s, valid=True
2026-05-28T17:51:47.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:51:47.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:19, diff=28.104374s, valid=True
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:51:47.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:51:47.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:12, diff=35.107397s, valid=True
2026-05-28T17:51:47.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:51:47.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:51:47.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:51:47.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916149.108061s, valid=True
2026-05-28T17:51:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:51:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:51:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:51:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:51:47.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:51:47.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:51:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:51:47.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:51:47.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:51:47.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:51:47.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:51:47.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:51:47.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:51:47.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:51:47.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:51:48.183 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:51:48.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:51:48.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:51:48.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-28T17:51:48.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-28T17:51:48.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:51:48.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:52:18.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:52:18.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:52:18.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:52:18.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:52:18.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:52:18.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:52:18.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-28T17:52:18.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:52:18.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-28T17:52:19.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:52:19.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:52:19.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:52:19.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-28T17:52:21.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T17:52:21.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:52:21.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:52:21.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:52:21.551 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:52:21.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:52:21.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:52:21.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:52:21.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:52:21.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:52:21.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:52:21.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:52:21.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:52:21.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:52:21.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:52:21.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:52:21.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:52:21.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:52:21.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:52:21.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:52:21.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:52:21.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:52:21.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:52:21.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:52:21.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:51:52
2026-05-28T17:52:21.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69624, datetime.datetime(2026, 5, 28, 17, 51, 52), datetime.datetime(2026, 5, 28, 17, 51, 52), 'salt', 10.42, 67.67, None, 10.23, 105.35, 5.72, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:52:21.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:52:21.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:52:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:52, diff=29.953726s, valid=True
2026-05-28T17:52:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:52:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:52:21.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:52:12, diff=9.95656s, valid=True
2026-05-28T17:52:21.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:52:21.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:52:21.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:51:50, diff=31.964611s, valid=True
2026-05-28T17:52:21.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:52:21.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:52:21.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:52:21.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:52:21.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:52:21.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:52:21.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:52:12, diff=9.967709s, valid=True
2026-05-28T17:52:21.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:52:21.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:52:21.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:52:21.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916183.96836s, valid=True
2026-05-28T17:52:21.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:52:21.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:52:21.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:52:21.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:52:21.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:52:22.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:52:22.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:52:22.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:52:22.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:52:22.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:52:22.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:52:22.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:52:22.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:52:22.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:52:22.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:52:23.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:52:23.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:52:23.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:52:23.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-28T17:52:23.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-28T17:52:23.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:52:23.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:52:53.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:52:53.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:52:53.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:52:53.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:52:53.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:52:53.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:52:53.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-28T17:52:53.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:52:53.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-28T17:52:53.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:52:53.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:52:53.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:52:53.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-28T17:52:56.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-28T17:52:56.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:52:56.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:52:56.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:52:56.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:52:56.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:52:56.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:52:56.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:52:56.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:52:56.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:52:56.160 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:52:56.160 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:52:56.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:52:56.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:52:56.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:52:56.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:52:56.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:52:56.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:52:56.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:52:56.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:52:56.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:52:56.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:52:56.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:52:56.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:52:56.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:52:52
2026-05-28T17:52:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69626, datetime.datetime(2026, 5, 28, 17, 52, 52), datetime.datetime(2026, 5, 28, 17, 52, 52), 'salt', 10.68, 67.24, None, 12.77, 110.04, 5.81, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:52:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:52:56.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:52:56.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:52:52, diff=4.477097s, valid=True
2026-05-28T17:52:56.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:52:56.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:52:56.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:12, diff=-15.520027s, valid=True
2026-05-28T17:52:56.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:52:56.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:52:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:52:46, diff=10.486665s, valid=True
2026-05-28T17:52:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:52:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:52:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:52:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:52:56.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:52:56.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:52:56.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:12, diff=-15.510316s, valid=True
2026-05-28T17:52:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:52:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:52:56.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:52:56.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916218.49033s, valid=True
2026-05-28T17:52:56.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:52:56.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:52:56.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:52:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:52:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:52:56.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:52:56.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:52:56.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:52:56.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:52:56.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:52:56.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:52:56.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:52:56.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:52:56.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:52:57.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:52:57.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:52:57.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:52:57.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:52:57.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-28T17:52:57.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-28T17:52:57.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:52:57.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:53:27.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:53:27.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:53:27.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:53:28.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:53:28.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:53:28.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:53:28.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-28T17:53:28.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:53:28.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:53:28.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:53:28.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:53:28.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:53:28.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-28T17:53:30.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-28T17:53:30.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:53:30.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:53:30.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:53:30.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:53:30.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:53:30.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:53:30.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:53:30.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:53:30.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:53:30.876 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:53:30.876 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:53:30.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:53:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:53:30.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:53:31.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:53:31.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:53:31.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:53:31.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:53:31.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:53:31.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:53:31.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:53:31.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:53:31.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:53:31.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:53:23
2026-05-28T17:53:31.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69627, datetime.datetime(2026, 5, 28, 17, 53, 23), datetime.datetime(2026, 5, 28, 17, 53, 22), 'salt', 10.65, 67.21, None, 14.22, 107.3, 5.82, 830.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:53:31.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:53:31.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:53:31.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:22, diff=9.191845s, valid=True
2026-05-28T17:53:31.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:53:31.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:53:31.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:12, diff=19.194704s, valid=True
2026-05-28T17:53:31.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:53:31.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:16, diff=15.201273s, valid=True
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:53:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:53:31.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:12, diff=19.204336s, valid=True
2026-05-28T17:53:31.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:53:31.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:53:31.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:53:31.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916253.204999s, valid=True
2026-05-28T17:53:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:53:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:53:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:53:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:53:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:53:31.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:53:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:53:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:53:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:53:31.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:53:31.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:53:31.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:53:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:53:31.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:53:31.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:53:32.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:53:32.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:53:32.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:53:32.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-28T17:53:32.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-28T17:53:32.254 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:53:32.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:54:02.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:54:02.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:54:02.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:54:02.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:54:02.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:54:02.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:54:02.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-28T17:54:02.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:54:02.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-28T17:54:02.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:54:02.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:54:02.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:54:02.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T17:54:04.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-28T17:54:04.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:54:04.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:54:04.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:54:04.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:54:04.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:54:04.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:54:04.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:54:04.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:54:04.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:54:04.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:54:04.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:54:04.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:54:05.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:54:05.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:54:05.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:54:05.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:54:05.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:54:05.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:54:05.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:54:05.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:54:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:54:05.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:54:05.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:54:05.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:53:53
2026-05-28T17:54:05.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69628, datetime.datetime(2026, 5, 28, 17, 53, 53), datetime.datetime(2026, 5, 28, 17, 53, 52), 'salt', 10.58, 67.21, None, 13.02, 108.54, 5.81, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:54:05.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:54:05.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:54:05.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:52, diff=13.316041s, valid=True
2026-05-28T17:54:05.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:54:05.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:54:05.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:12, diff=-6.681074s, valid=True
2026-05-28T17:54:05.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:54:05.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:54:05.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:53:46, diff=19.325631s, valid=True
2026-05-28T17:54:05.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:54:05.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:54:05.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:54:05.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:54:05.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:54:05.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:54:05.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:12, diff=-6.671304s, valid=True
2026-05-28T17:54:05.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:54:05.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:54:05.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:54:05.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916287.329363s, valid=True
2026-05-28T17:54:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:54:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:54:05.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:54:05.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:54:05.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:54:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:54:05.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:54:05.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:54:05.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:54:05.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:54:05.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:54:05.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:54:05.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:54:05.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:54:05.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:54:06.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:54:06.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:54:06.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:54:06.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-28T17:54:06.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-28T17:54:06.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:54:06.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:54:36.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:54:36.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:54:36.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:54:36.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:54:36.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:54:37.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:54:37.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-28T17:54:37.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:54:37.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:54:37.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:54:37.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:54:37.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:54:37.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-28T17:54:39.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-28T17:54:39.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:54:39.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:54:39.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:54:39.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:54:39.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:54:39.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:54:39.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:54:39.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:54:39.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:54:39.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:54:39.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:54:39.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:54:39.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:54:39.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:54:39.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:54:39.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:54:39.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:54:39.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:54:39.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:54:39.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:54:39.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:54:39.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:54:39.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:54:39.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:54:23
2026-05-28T17:54:39.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69629, datetime.datetime(2026, 5, 28, 17, 54, 23), datetime.datetime(2026, 5, 28, 17, 54, 23), 'salt', 10.55, 67.24, None, 13.13, 109.01, 5.81, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:54:39.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:54:39.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:54:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:23, diff=16.794014s, valid=True
2026-05-28T17:54:39.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:54:39.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:54:39.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:12, diff=27.796872s, valid=True
2026-05-28T17:54:39.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:54:39.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:18, diff=21.803518s, valid=True
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:54:39.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:54:39.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:12, diff=27.806544s, valid=True
2026-05-28T17:54:39.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:54:39.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:54:39.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:54:39.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916321.807223s, valid=True
2026-05-28T17:54:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:54:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:54:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:54:39.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:54:39.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:54:39.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:54:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:54:39.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:54:39.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:54:39.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:54:40.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:54:40.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:54:40.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:54:40.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:54:40.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:54:40.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:54:40.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:54:40.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:54:40.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-28T17:54:40.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-28T17:54:40.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:54:40.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:55:11.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:55:11.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:55:11.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:55:11.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:55:11.143 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:55:11.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:55: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-28T17:55:11.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:55:11.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-28T17:55:11.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:55:11.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:55:11.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:55:11.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-28T17:55:13.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-28T17:55:13.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:55:13.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:55:13.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:55:13.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:55:13.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:55:13.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:55:13.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:55:13.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:55:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:55:13.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:55:13.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:55:13.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:55:13.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:55:13.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:55:13.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:55:13.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:55:13.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:55:13.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:55:14.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:55:14.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:55:14.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:55:14.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:55:14.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:55:14.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:54:53
2026-05-28T17:55:14.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69630, datetime.datetime(2026, 5, 28, 17, 54, 53), datetime.datetime(2026, 5, 28, 17, 54, 53), 'salt', 10.62, 67.67, None, 14.01, 103.18, 5.72, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:55:14.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:55:14.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:55:14.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:53, diff=21.10246s, valid=True
2026-05-28T17:55:14.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:55:14.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:55:14.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:12, diff=2.105303s, valid=True
2026-05-28T17:55:14.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:55:14.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:55:14.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:54:49, diff=25.111901s, valid=True
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:55:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:55:14.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:12, diff=2.1149s, valid=True
2026-05-28T17:55:14.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:55:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:55:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:55:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916356.115545s, valid=True
2026-05-28T17:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:55:14.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:55:14.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:55:14.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:55:14.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:55:14.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:55:14.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:55:14.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:55:14.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:55:14.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:55:14.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:55:15.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:55:15.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:55:15.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:55:15.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-28T17:55:15.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-28T17:55:15.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:55:15.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:55:45.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:55:45.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:55:45.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:55:46.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:55:46.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:55:46.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:55:46.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-28T17:55:46.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:55:46.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-28T17:55:46.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:55:46.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:55:46.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:55:46.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-28T17:55:48.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-28T17:55:48.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:55:48.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:55:48.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:55:48.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:55:48.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:55:48.740 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:55:48.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:55:48.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:55:48.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:55:48.741 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:55:48.741 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:55:48.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:55:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:55:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:55:48.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:55:48.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:55:48.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:55:48.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:55:48.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:55:48.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:55:48.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:55:48.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:55:48.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:55:49.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:55:24
2026-05-28T17:55:49.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69631, datetime.datetime(2026, 5, 28, 17, 55, 24), datetime.datetime(2026, 5, 28, 17, 55, 23), 'salt', 10.55, 67.77, None, 12.77, 101.65, 5.7, 830.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:55:49.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:55:49.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:55:49.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:23, diff=26.06124s, valid=True
2026-05-28T17:55:49.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:55:49.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:55:49.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:12, diff=37.064125s, valid=True
2026-05-28T17:55:49.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:55:49.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:55:49.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:21, diff=28.070737s, valid=True
2026-05-28T17:55:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:55:49.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:55:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:55:49.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:55:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:55:49.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:55:49.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:12, diff=37.073753s, valid=True
2026-05-28T17:55:49.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:55:49.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:55:49.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:55:49.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916391.074426s, valid=True
2026-05-28T17:55:49.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:55:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:55:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:55:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:55:49.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:55:49.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:55:49.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:55:49.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:55:49.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:55:49.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:55:49.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:55:49.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:55:49.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:55:49.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:55:49.609 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:55:49.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:55:50.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:55:50.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:55:50.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-28T17:55:50.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-28T17:55:50.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:55:50.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:56:20.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:56:20.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:56:20.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:56:20.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:56:20.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:56:20.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:56:20.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-28T17:56:20.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:56:20.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-28T17:56:20.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:56:20.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:56:20.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:56:20.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-28T17:56:23.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-28T17:56:23.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:56:23.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:56:23.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:56:23.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:56:23.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:56:23.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:56:23.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:56:23.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:56:23.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:56:23.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:56:23.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:56:23.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:56:23.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T17:56:23.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:56:23.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T17:56:23.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:56:23.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:56:23.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:56:23.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:56:23.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:56:23.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:56:23.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:56:23.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:56:24.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:55:54
2026-05-28T17:56:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69632, datetime.datetime(2026, 5, 28, 17, 55, 54), datetime.datetime(2026, 5, 28, 17, 55, 53), 'salt', 10.38, 67.91, None, 13.83, 94.8, 5.66, 830.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:56:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:56:24.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T17:56:24.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:53, diff=31.006428s, valid=True
2026-05-28T17:56:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:56:24.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:56:24.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:56:12, diff=12.009301s, valid=True
2026-05-28T17:56:24.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:56:24.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T17:56:24.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:55:52, diff=32.0159s, valid=True
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:56:24.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:56:24.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:56:12, diff=12.018972s, valid=True
2026-05-28T17:56:24.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:56:24.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:56:24.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:56:24.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916426.019637s, valid=True
2026-05-28T17:56:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:56:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:56:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:56:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:56:24.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:56:24.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:56:24.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:56:24.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:56:24.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:56:24.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:56:24.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:56:24.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:56:24.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:56:24.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:56:24.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:56:24.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:56:24.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:56:24.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:56:24.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-28T17:56:24.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-28T17:56:25.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:56:25.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:56:55.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:56:55.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:56:55.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:56:55.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:56:55.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:56:55.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:56:55.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-28T17:56:55.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:56:55.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-28T17:56:55.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:56:55.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:56:55.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:56:55.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-28T17:56:58.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-28T17:56:58.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:56:58.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:56:58.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:56:58.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:56:58.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:56:58.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:56:58.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:56:58.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:56:58.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:56:58.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:56:58.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:56:58.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:56:58.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:56:58.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:56:58.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:56:58.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:56:58.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:56:58.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:56:58.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:56:58.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:56:58.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:56:58.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:56:58.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:56:58.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:56:54
2026-05-28T17:56:58.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69634, datetime.datetime(2026, 5, 28, 17, 56, 54), datetime.datetime(2026, 5, 28, 17, 56, 54), 'salt', 10.35, 68.7, None, 12.53, 102.71, 5.49, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:56:58.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:56:58.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:56:58.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:56:54, diff=4.393123s, valid=True
2026-05-28T17:56:58.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:56:58.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:56:58.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:12, diff=-13.604008s, valid=True
2026-05-28T17:56:58.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:56:58.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:56:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:56:48, diff=10.402716s, valid=True
2026-05-28T17:56:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:56:58.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:56:58.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:56:58.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:56:58.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:56:58.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:56:58.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:12, diff=-13.594188s, valid=True
2026-05-28T17:56:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:56:58.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:56:58.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:56:58.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916460.406486s, valid=True
2026-05-28T17:56:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:56:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:56:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:56:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:56:58.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:56:58.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:56:58.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:56:58.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:56:58.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:56:58.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:56:58.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:56:58.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:56:58.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:56:58.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:56:58.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:56:59.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:56:59.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:56:59.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:56:59.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-28T17:56:59.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-28T17:56:59.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:56:59.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:57:29.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:57:29.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:57:29.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:57:30.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:57:30.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:57:30.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:57:30.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-28T17:57:30.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:57:30.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-28T17:57:30.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:57:30.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:57:30.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:57:30.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-28T17:57:33.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-28T17:57:33.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:57:33.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:57:33.100 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:57:33.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:57:33.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:57:33.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:57:33.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:57:33.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:57:33.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:57:33.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:57:33.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:57:33.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:57:33.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:57:33.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:57:33.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:57:33.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:57:33.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:57:33.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:57:33.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:57:33.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:57:33.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:57:33.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:57:33.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:57:33.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:57:24
2026-05-28T17:57:33.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69635, datetime.datetime(2026, 5, 28, 17, 57, 24), datetime.datetime(2026, 5, 28, 17, 57, 24), 'salt', 10.32, 68.87, None, 13.37, 93.52, 5.46, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:57:33.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:57:33.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:57:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:24, diff=9.494289s, valid=True
2026-05-28T17:57:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:57:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:57:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:12, diff=21.497161s, valid=True
2026-05-28T17:57:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:57:33.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:57:33.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:18, diff=15.503855s, valid=True
2026-05-28T17:57:33.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:57:33.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:57:33.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:57:33.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:57:33.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:57:33.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:57:33.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:12, diff=21.507248s, valid=True
2026-05-28T17:57:33.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:57:33.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:57:33.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:57:33.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916495.507918s, valid=True
2026-05-28T17:57:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:57:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:57:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:57:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:57:33.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:57:33.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:57:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:57:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:57:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:57:33.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:57:33.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:57:33.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:57:33.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:57:33.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:57:34.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:57:34.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:57:34.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:57:34.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:57:34.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-28T17:57:34.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-28T17:57:34.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:57:34.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:58:04.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:58:04.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:58:04.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:58:04.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:58:04.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:58:05.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:58:05.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-28T17:58:05.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:58:05.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-28T17:58:05.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:58:05.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:58:05.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:58:05.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-28T17:58:07.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-28T17:58:07.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:58:07.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:58:07.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:58:07.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:58:07.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:58:07.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:58:07.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:58:07.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:58:07.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:58:07.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:58:07.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:58:07.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:58:07.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:58:07.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:58:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:58:07.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:58:07.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:58:07.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:58:07.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:58:07.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:58:07.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:58:07.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:58:07.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:58:08.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:57:55
2026-05-28T17:58:08.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69636, datetime.datetime(2026, 5, 28, 17, 57, 55), datetime.datetime(2026, 5, 28, 17, 57, 54), 'salt', 10.29, 69.27, None, 13.06, 103.41, 5.38, 830.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:58:08.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:58:08.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:58:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:54, diff=14.050318s, valid=True
2026-05-28T17:58:08.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:58:08.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:58:08.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:12, diff=-3.94674s, valid=True
2026-05-28T17:58:08.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:58:08.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:57:48, diff=20.060217s, valid=True
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:58:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:58:08.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:12, diff=-3.936564s, valid=True
2026-05-28T17:58:08.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:58:08.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:58:08.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:58:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916530.06412s, valid=True
2026-05-28T17:58:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:58:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:58:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:58:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:58:08.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:58:08.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:58:08.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:58:08.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:58:08.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:58:08.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:58:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:58:08.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:58:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:58:08.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:58:08.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:58:09.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:58:09.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:58:09.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:58:09.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-28T17:58:09.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-28T17:58:11.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:58:11.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:58:41.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:58:41.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:58:41.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:58:41.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:58:41.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:58:41.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:58:41.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-28T17:58:41.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:58:41.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:58:41.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:58:41.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:58:41.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:58:41.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-28T17:58:44.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-28T17:58:44.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:58:44.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:58:44.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:58:44.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:58:44.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:58:44.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:58:44.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:58:44.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:58:44.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:58:44.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:58:44.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:58:44.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:58:44.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:58:44.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:58:44.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:58:44.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:58:44.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:58:44.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:58:44.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:58:44.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:58:44.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:58:44.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:58:44.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:58:44.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:58:25
2026-05-28T17:58:44.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69637, datetime.datetime(2026, 5, 28, 17, 58, 25), datetime.datetime(2026, 5, 28, 17, 58, 24), 'salt', 10.29, 69.37, None, 13.45, 100.48, 5.35, 830.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:58:44.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:58:44.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:58:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:24, diff=20.446778s, valid=True
2026-05-28T17:58:44.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:58:44.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:58:44.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:12, diff=32.449628s, valid=True
2026-05-28T17:58:44.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:58:44.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:19, diff=25.456151s, valid=True
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:58:44.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:58:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:12, diff=32.459142s, valid=True
2026-05-28T17:58:44.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:58:44.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:58:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:58:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916566.459796s, valid=True
2026-05-28T17:58:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:58:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:58:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:58:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:58:44.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:58:44.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:58:44.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:58:44.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:58:44.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:58:44.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:58:44.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:58:44.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:58:44.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:58:44.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:58:45.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:58:45.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:58:45.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:58:45.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:58:45.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-28T17:58:45.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-28T17:58:45.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:58:45.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:59:15.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:59:15.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:59:15.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:59:16.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:59:16.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:59:16.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:59:16.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-28T17:59:16.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:59:16.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T17:59:16.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:59:16.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:59:16.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:59:16.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-28T17:59:19.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-28T17:59:19.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:59:19.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:59:19.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:59:19.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:59:19.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:59:19.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:59:19.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:59:19.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:59:19.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:59:19.054 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:59:19.054 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:59:19.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:59:19.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:59:19.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:59:19.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:59:19.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:59:19.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:59:19.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:59:19.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:59:19.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:59:19.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:59:19.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:59:19.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:59:19.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:58:55
2026-05-28T17:59:19.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69638, datetime.datetime(2026, 5, 28, 17, 58, 55), datetime.datetime(2026, 5, 28, 17, 58, 55), 'salt', 10.22, 69.87, None, 12.6, 106.46, 5.25, 830.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:59:19.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:59:19.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:59:19.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:55, diff=24.370098s, valid=True
2026-05-28T17:59:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:59:19.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:59:19.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:12, diff=7.372928s, valid=True
2026-05-28T17:59:19.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:59:19.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:58:51, diff=28.379567s, valid=True
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:59:19.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:59:19.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:59:19.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:12, diff=7.382615s, valid=True
2026-05-28T17:59:19.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:59:19.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:59:19.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:59:19.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916601.383288s, valid=True
2026-05-28T17:59:19.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:59:19.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:59:19.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:59:19.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:59:19.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:59:19.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:59:19.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:59:19.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:59:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:59:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:59:19.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:59:19.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:59:19.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:59:19.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:59:20.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:59:20.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:59:20.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:59:20.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:59:20.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-28T17:59:20.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-28T17:59:20.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:59:20.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T17:59:50.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T17:59:50.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T17:59:50.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T17:59:50.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T17:59:50.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T17:59:51.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T17:59: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-28T17:59:51.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T17:59:51.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-28T17:59:51.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T17:59:51.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T17:59:51.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T17:59:51.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-28T17:59:53.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-28T17:59:53.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T17:59:53.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T17:59:53.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T17:59:53.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T17:59:53.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T17:59:53.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T17:59:53.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T17:59:53.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T17:59:53.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T17:59:53.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T17:59:53.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T17:59:53.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T17:59:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T17:59:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T17:59:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T17:59:54.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:59:54.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:59:54.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T17:59:54.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T17:59:54.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T17:59:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T17:59:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T17:59:54.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T17:59:54.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 17:59:25
2026-05-28T17:59:54.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69639, datetime.datetime(2026, 5, 28, 17, 59, 25), datetime.datetime(2026, 5, 28, 17, 59, 25), 'salt', 10.15, 70.03, None, 12.95, 105.38, 5.2, 830.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T17:59:54.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T17:59:54.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T17:59:54.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:25, diff=29.234095s, valid=True
2026-05-28T17:59:54.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T17:59:54.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:59:54.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:12, diff=42.237208s, valid=True
2026-05-28T17:59:54.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T17:59:54.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:22, diff=32.244406s, valid=True
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T17:59:54.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T17:59:54.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 17:59:12, diff=42.247705s, valid=True
2026-05-28T17:59:54.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T17:59:54.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T17:59:54.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T17:59:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916636.248407s, valid=True
2026-05-28T17:59:54.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T17:59:54.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T17:59:54.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T17:59:54.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T17:59:54.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T17:59:54.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T17:59:54.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T17:59:54.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T17:59:54.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T17:59:54.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T17:59:54.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T17:59:54.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T17:59:54.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T17:59:54.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T17:59:54.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:59:55.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T17:59:55.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T17:59:55.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T17:59:55.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-28T17:59:55.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-28T17:59:55.453 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T17:59:55.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:00:25.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:00:25.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:00:25.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:00:25.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:00:25.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:00:26.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:00:26.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-28T18:00:26.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:00:26.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-28T18:00:26.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:00:26.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:00:26.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:00:26.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-28T18:00:28.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-28T18:00:28.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:00:28.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:00:28.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:00:28.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:00:28.816 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:00:28.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:00:28.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:00:28.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:00:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:00:28.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:00:28.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:00:28.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:00:28.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:00:28.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:00:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:00:29.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:00:29.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:00:29.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:00:29.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:00:29.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:00:29.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:00:29.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:00:29.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:00:29.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:00:27
2026-05-28T18:00:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69641, datetime.datetime(2026, 5, 28, 18, 0, 27), datetime.datetime(2026, 5, 28, 18, 0, 26), 'salt', 10.16, 70.46, None, 10.59, 108.5, 5.13, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:00:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:00:29.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:00:29.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:26, diff=3.160373s, valid=True
2026-05-28T18:00:29.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:00:29.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:00:29.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:12, diff=17.163244s, valid=True
2026-05-28T18:00:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:00:29.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:00:29.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:25, diff=4.169727s, valid=True
2026-05-28T18:00:29.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:00:29.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:00:29.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:00:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:00:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:00:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:00:29.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:12, diff=17.172736s, valid=True
2026-05-28T18:00:29.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:00:29.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:00:29.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:00:29.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916671.173377s, valid=True
2026-05-28T18:00:29.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:00:29.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:00:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:00:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:00:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:00:29.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:00:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:00:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:00:29.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:00:29.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:00:29.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:00:29.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:00:29.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:00:29.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:00:29.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:00:30.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:00:30.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:00:30.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:00:30.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-28T18:00:30.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-28T18:00:30.484 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:00:30.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:01:00.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:01:00.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:01:00.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:01:00.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:01:00.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:01:00.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:01:00.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:01:00.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:01:00.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-28T18:01:00.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:01:00.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:01:00.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:01:00.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-28T18:01:03.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-28T18:01:03.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:01:03.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:01:03.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:01:03.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:01:03.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:01:03.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:01:03.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:01:03.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:01:03.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:01:03.605 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:01:03.605 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:01:03.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:01:03.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:01:03.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:01:03.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:01:03.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:01:03.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:01:03.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:01:03.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:01:03.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:01:03.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:01:03.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:01:03.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:01:03.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:00:57
2026-05-28T18:01:03.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69642, datetime.datetime(2026, 5, 28, 18, 0, 57), datetime.datetime(2026, 5, 28, 18, 0, 57), 'salt', 10.16, 70.5, None, 10.94, 107.59, 5.12, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:01:03.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:01:03.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:01:03.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:57, diff=6.930341s, valid=True
2026-05-28T18:01:03.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:01:03.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:01:03.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:12, diff=-8.066815s, valid=True
2026-05-28T18:01:03.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:01:03.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:01:03.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:00:56, diff=7.939806s, valid=True
2026-05-28T18:01:03.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:01:03.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:01:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:01:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:01:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:01:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:01:03.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:12, diff=-8.057123s, valid=True
2026-05-28T18:01:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:01:03.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:01:03.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:01:03.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916705.943563s, valid=True
2026-05-28T18:01:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:01:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:01:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:01:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:01:03.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:01:04.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:01:04.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:01:04.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:01:04.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:01:04.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:01:04.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:01:04.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:01:04.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:01:04.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:01:04.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:01:04.832 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:01:04.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:01:04.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:01:04.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-28T18:01:04.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-28T18:01:05.150 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:01:05.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:01:35.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:01:35.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:01:35.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:01:35.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:01:35.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:01:35.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:01:35.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-28T18:01:35.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:01:35.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-28T18:01:35.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:01:35.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:01:35.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:01:35.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-28T18:01:38.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-28T18:01:38.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:01:38.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:01:38.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:01:38.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:01:38.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:01:38.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:01:38.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:01:38.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:01:38.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:01:38.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:01:38.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:01:38.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:01:38.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:01:38.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:01:38.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:01:38.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:01:39.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:01:39.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:01:39.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:01:39.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:01:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:01:39.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:01:39.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:01:39.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:01:27
2026-05-28T18:01:39.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69643, datetime.datetime(2026, 5, 28, 18, 1, 27), datetime.datetime(2026, 5, 28, 18, 1, 27), 'salt', 10.02, 70.6, None, 10.41, 107.78, 5.09, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:01:39.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:01:39.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:01:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:27, diff=12.108347s, valid=True
2026-05-28T18:01:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:01:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:01:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:12, diff=27.111193s, valid=True
2026-05-28T18:01:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:01:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:01:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:20, diff=19.117805s, valid=True
2026-05-28T18:01:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:01:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:01:39.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:01:39.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:01:39.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:01:39.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:01:39.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:12, diff=27.120853s, valid=True
2026-05-28T18:01:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:01:39.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:01:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:01:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916741.121521s, valid=True
2026-05-28T18:01:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:01:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:01:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:01:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:01:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:01:39.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:01:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:01:39.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:01:39.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:01:39.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:01:39.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:01:39.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:01:39.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:01:39.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:01:39.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:01:40.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:01:40.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:01:40.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:01:40.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-28T18:01:40.192 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:01:40.278 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:01:40.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:02:10.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:02:10.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:02:10.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:02:11.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:02:11.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:02:11.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:02:11.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-28T18:02:11.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:02:11.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-28T18:02:11.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:02:11.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:02:11.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:02:11.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-28T18:02:14.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-28T18:02:14.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:02:14.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:02:14.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:02:14.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:02:14.444 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:02:14.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:02:14.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:02:14.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:02:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:02:14.456 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:02:14.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:02:14.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:02:14.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:02:14.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:02:14.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:02:14.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:02:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:02:14.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:02:14.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:02:14.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:02:14.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:02:14.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:02:14.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:02:14.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:01:57
2026-05-28T18:02:14.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69644, datetime.datetime(2026, 5, 28, 18, 1, 57), datetime.datetime(2026, 5, 28, 18, 1, 57), 'salt', 10.06, 70.73, None, 11.08, 104.59, 5.07, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:02:14.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:02:14.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:02:14.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:57, diff=17.778132s, valid=True
2026-05-28T18:02:14.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:02:14.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:02:14.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:12, diff=2.780954s, valid=True
2026-05-28T18:02:14.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:02:14.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:01:51, diff=23.787489s, valid=True
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:02:14.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:02:14.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:12, diff=2.790495s, valid=True
2026-05-28T18:02:14.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:02:14.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:02:14.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:02:14.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916776.791161s, valid=True
2026-05-28T18:02:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:02:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:02:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:02:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:02:14.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:02:14.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:02:14.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:02:14.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:02:14.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:02:14.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:02:15.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:02:15.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:02:15.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:02:15.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:02:15.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:02:15.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:02:15.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:02:15.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:02:15.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:02:15.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:02:15.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:02:15.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:02:45.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:02:45.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:02:45.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:02:46.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:02:46.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:02:46.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:02:46.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-28T18:02:46.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:02:46.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-28T18:02:46.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:02:46.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:02:46.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:02:46.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-28T18:02:49.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-28T18:02:49.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:02:49.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:02:49.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:02:49.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:02:49.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:02:49.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:02:49.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:02:49.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:02:49.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:02:49.583 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:02:49.583 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:02:49.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:02:49.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:02:49.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:02:49.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:02:49.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:02:49.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:02:49.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:02:49.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:02:49.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:02:49.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:02:49.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:02:49.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:02:49.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:02:28
2026-05-28T18:02:49.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69645, datetime.datetime(2026, 5, 28, 18, 2, 28), datetime.datetime(2026, 5, 28, 18, 2, 26), 'salt', 10.06, 70.8, None, 10.02, 109.73, 5.05, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:02:49.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:02:49.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:02:49.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:26, diff=23.896806s, valid=True
2026-05-28T18:02:49.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:02:49.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:02:49.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:12, diff=37.899827s, valid=True
2026-05-28T18:02:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:02:49.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:02:49.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:21, diff=28.906808s, valid=True
2026-05-28T18:02:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:02:49.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:02:49.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:02:49.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:02:49.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:02:49.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:02:49.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:12, diff=37.910042s, valid=True
2026-05-28T18:02:49.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:02:49.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:02:49.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:02:49.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916811.910715s, valid=True
2026-05-28T18:02:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:02:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:02:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:02:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:02:49.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:02:49.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:02:49.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:02:49.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:02:49.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:02:50.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:02:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:02:50.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:02:50.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:02:50.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:02:50.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:02:50.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:02:50.905 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:02:50.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:02:50.905 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:02:50.905 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:02:51.046 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:02:51.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:03:21.076 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:03:21.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:03:21.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:03:21.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:03:21.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:03:21.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:03:21.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-28T18:03:21.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:03:21.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-28T18:03:21.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:03:21.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:03:21.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:03:21.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-28T18:03:24.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-28T18:03:24.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:03:24.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:03:24.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:03:24.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:03:24.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:03:24.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:03:24.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:03:24.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:03:24.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:03:24.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:03:24.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:03:24.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:03:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:03:24.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:03:24.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:03:24.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:03:24.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:03:24.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:03:24.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:03:24.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:03:24.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:03:24.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:03:24.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:03:24.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:02:58
2026-05-28T18:03:24.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69646, datetime.datetime(2026, 5, 28, 18, 2, 58), datetime.datetime(2026, 5, 28, 18, 2, 57), 'salt', 9.99, 70.83, None, 9.56, 108.72, 5.04, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:03:24.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:03:24.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:03:24.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:57, diff=27.527936s, valid=True
2026-05-28T18:03:24.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:03:24.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:03:24.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:03:12, diff=12.53078s, valid=True
2026-05-28T18:03:24.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:03:24.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:02:52, diff=32.537431s, valid=True
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:03:24.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:03:24.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:03:12, diff=12.540601s, valid=True
2026-05-28T18:03:24.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:03:24.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:03:24.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:03:24.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916846.541267s, valid=True
2026-05-28T18:03:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:03:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:03:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:03:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:03:24.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:03:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:03:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:03:24.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:03:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:03:24.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:03:24.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:03:24.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:03:24.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:03:24.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:03:25.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:03:25.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:03:25.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:03:25.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:03:25.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-28T18:03:25.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-28T18:03:26.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:03:26.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:03:56.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:03:56.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:03:56.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:03:56.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:03:56.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:03:56.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:03:56.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-28T18:03:56.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:03:56.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-28T18:03:56.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:03:56.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:03:56.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:03:56.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-28T18:03:59.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-28T18:03:59.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:03:59.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:03:59.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:03:59.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:03:59.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:03:59.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:03:59.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:03:59.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:03:59.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:03:59.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:03:59.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:03:59.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:03:59.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:03:59.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:04:00.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:04:00.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:04:00.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:04:00.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:04:00.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:04:00.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:04:00.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:04:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:04:00.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:04:00.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:03:58
2026-05-28T18:04:00.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69648, datetime.datetime(2026, 5, 28, 18, 3, 58), datetime.datetime(2026, 5, 28, 18, 3, 58), 'salt', 9.99, 70.96, None, 10.16, 100.42, 5.01, 830.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:04:00.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:04:00.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:04:00.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:03:58, diff=2.195865s, valid=True
2026-05-28T18:04:00.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:04:00.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:04:00.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:12, diff=-11.801232s, valid=True
2026-05-28T18:04:00.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:04:00.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:03:54, diff=6.205452s, valid=True
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:04:00.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:04:00.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:12, diff=-11.79148s, valid=True
2026-05-28T18:04:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:04:00.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:04:00.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:04:00.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916882.209193s, valid=True
2026-05-28T18:04:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:04:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:04:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:04:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:04:00.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:04:00.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:04:00.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:04:00.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:04:00.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:04:00.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:04:00.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:04:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:04:00.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:04:00.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:04:00.792 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:04:01.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:04:01.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:04:01.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:04:01.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-28T18:04:01.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-28T18:04:01.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:04:01.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:04:31.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:04:31.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:04:31.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:04:31.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:04:31.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:04:32.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:04:32.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-28T18:04:32.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:04:32.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-28T18:04:32.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:04:32.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:04:32.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:04:32.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-28T18:04: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-28T18:04:34.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:04:34.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:04:34.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:04:34.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:04:34.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:04:34.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:04:34.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:04:34.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:04:34.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:04:34.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:04:34.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:04:34.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:04:34.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:04:34.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:04:34.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:04:34.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:04:34.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:04:34.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:04:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:04:35.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:04:35.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:04:35.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:04:35.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:04:35.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:04:28
2026-05-28T18:04:35.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69649, datetime.datetime(2026, 5, 28, 18, 4, 28), datetime.datetime(2026, 5, 28, 18, 4, 28), 'salt', 9.96, 71.03, None, 9.28, 106.07, 5.0, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:04:35.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:04:35.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:04:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:28, diff=7.08407s, valid=True
2026-05-28T18:04:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:04:35.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:04:35.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:12, diff=23.086917s, valid=True
2026-05-28T18:04:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:04:35.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:26, diff=9.093572s, valid=True
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:04:35.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:04:35.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:04:35.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:12, diff=23.096647s, valid=True
2026-05-28T18:04:35.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:04:35.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:04:35.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:04:35.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916917.097297s, valid=True
2026-05-28T18:04:35.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:04:35.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:04:35.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:04:35.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:04:35.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:04:35.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:04:35.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:04:35.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:04:35.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:04:35.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:04:35.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:04:35.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:04:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:04:35.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:04:35.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:04:36.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:04:36.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:04:36.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:04:36.159 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:04:36.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:04:36.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:04:36.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:05:06.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:05:06.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:05:06.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:05:06.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:05:06.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:05:06.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:05:06.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-28T18:05:06.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:05:06.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-28T18:05:06.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:05:06.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:05:06.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:05:06.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-28T18:05:09.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-28T18:05:09.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:05:09.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:05:09.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:05:09.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:05:09.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:05:09.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:05:09.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:05:09.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:05:09.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:05:09.565 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:05:09.565 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:05:09.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:05:09.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:05:09.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:05:09.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:05:09.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:05:09.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:05:09.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:05:09.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:05:09.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:05:09.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:05:09.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:05:09.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:05:09.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:04:59
2026-05-28T18:05:09.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69650, datetime.datetime(2026, 5, 28, 18, 4, 59), datetime.datetime(2026, 5, 28, 18, 4, 58), 'salt', 9.99, 71.06, None, 9.95, 110.71, 4.99, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:05:09.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:05:09.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:05:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:58, diff=11.898264s, valid=True
2026-05-28T18:05:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:05:09.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:05:09.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:12, diff=-2.098811s, valid=True
2026-05-28T18:05:09.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:05:09.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:05:09.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:04:57, diff=12.907814s, valid=True
2026-05-28T18:05:09.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:05:09.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:05:09.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:05:09.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:05:09.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:05:09.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:05:09.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:12, diff=-2.089104s, valid=True
2026-05-28T18:05:09.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:05:09.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:05:09.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:05:09.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916951.911564s, valid=True
2026-05-28T18:05:09.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:05:09.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:05:09.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:05:09.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:05:09.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:05:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:05:09.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:05:09.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:05:09.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:05:10.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:05:10.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:05:10.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:05:10.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:05:10.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:05:10.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:05:10.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:05:10.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:05:10.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:05:10.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-28T18:05:10.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-28T18:05:11.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:05:11.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:05:41.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:05:41.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:05:41.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:05:41.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:05:41.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:05:41.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:05:41.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-28T18:05:41.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:05:41.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-28T18:05:41.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:05:41.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:05:41.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:05:41.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-28T18:05:44.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:05:44.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:05:44.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:05:44.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:05:44.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:05:44.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:05:44.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:05:44.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:05:44.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:05:44.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:05:44.722 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:05:44.722 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:05:44.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:05:44.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:05:44.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:05:44.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:05:44.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:05:44.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:05:44.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:05:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:05:44.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:05:44.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:05:44.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:05:44.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:05:45.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:05:29
2026-05-28T18:05:45.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69651, datetime.datetime(2026, 5, 28, 18, 5, 29), datetime.datetime(2026, 5, 28, 18, 5, 28), 'salt', 10.03, 71.03, None, 9.18, 114.61, 5.0, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:05:45.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:05:45.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:05:45.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:28, diff=17.055146s, valid=True
2026-05-28T18:05:45.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:05:45.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:05:45.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:12, diff=33.058056s, valid=True
2026-05-28T18:05:45.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:05:45.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:05:45.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:23, diff=22.064761s, valid=True
2026-05-28T18:05:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:05:45.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:05:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:05:45.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:05:45.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:05:45.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:05:45.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:12, diff=33.067783s, valid=True
2026-05-28T18:05:45.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:05:45.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:05:45.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:05:45.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=916987.06843s, valid=True
2026-05-28T18:05:45.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:05:45.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:05:45.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:05:45.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:05:45.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:05:45.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:05:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:05:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:05:45.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:05:45.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:05:45.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:05:45.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:05:45.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:05:45.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:05:45.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:05:46.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:05:46.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:05:46.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:05:46.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-28T18:05:46.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-28T18:05:46.346 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:05:46.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:06:16.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:06:16.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:06:16.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:06:16.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:06:16.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:06:16.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:06:16.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-28T18:06:16.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:06:16.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-28T18:06:16.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:06:16.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:06:16.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:06:16.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-28T18:06:20.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-28T18:06:20.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:06:20.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:06:20.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:06:20.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:06:20.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:06:20.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:06:20.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:06:20.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:06:20.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:06:20.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:06:20.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:06:20.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:06:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:06:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:06:20.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:06:20.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:06:20.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:06:20.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:06:20.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:06:20.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:06:20.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:06:20.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:06:20.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:06:20.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:05:59
2026-05-28T18:06:20.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69652, datetime.datetime(2026, 5, 28, 18, 5, 59), datetime.datetime(2026, 5, 28, 18, 5, 59), 'salt', 9.99, 70.97, None, 9.18, 108.11, 5.01, 830.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:06:20.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:06:20.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:06:20.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:59, diff=21.998877s, valid=True
2026-05-28T18:06:20.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:06:20.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:06:21.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:12, diff=9.001951s, valid=True
2026-05-28T18:06:21.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:06:21.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:05:53, diff=28.009095s, valid=True
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:06:21.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:06:21.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:12, diff=9.012329s, valid=True
2026-05-28T18:06:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:06:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:06:21.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:06:21.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917023.013014s, valid=True
2026-05-28T18:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:06:21.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:06:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:06:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:06:21.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:06:21.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:06:21.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:06:21.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:06:21.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:06:21.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:06:21.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:06:22.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:06:22.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:06:22.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-28T18:06:22.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-28T18:06:22.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:06:22.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:06:52.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:06:52.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:06:52.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:06:52.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:06:52.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:06:53.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:06:53.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:06:53.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:06:53.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-28T18:06:53.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:06:53.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:06:53.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:06:53.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-28T18:06:55.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-28T18:06:55.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:06:55.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:06:55.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:06:55.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:06:55.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:06:55.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:06:55.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:06:55.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:06:55.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:06:55.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:06:55.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:06:55.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:06:55.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:06:55.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:06:55.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:06:55.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:06:56.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:06:56.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:06:56.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:06:56.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:06:56.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:06:56.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:06:56.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:06:56.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:06:29
2026-05-28T18:06:56.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69653, datetime.datetime(2026, 5, 28, 18, 6, 29), datetime.datetime(2026, 5, 28, 18, 6, 29), 'salt', 9.99, 70.97, None, 9.11, 118.81, 5.01, 830.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:06:56.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:06:56.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:06:56.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:29, diff=27.118457s, valid=True
2026-05-28T18:06:56.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:06:56.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:06:56.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:12, diff=44.121298s, valid=True
2026-05-28T18:06:56.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:06:56.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:06:56.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:23, diff=33.127909s, valid=True
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:06:56.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:06:56.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:06:12, diff=44.130941s, valid=True
2026-05-28T18:06:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:06:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:06:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:06:56.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917058.131589s, valid=True
2026-05-28T18:06:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:06:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:06:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:06:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:06:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:06:56.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:06:56.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:06:56.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:06:56.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:06:56.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:06:56.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:06:56.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:06:56.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:06:56.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:06:56.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:06:57.120 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:06:57.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:06:57.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:06:57.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-28T18:06:57.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-28T18:06:57.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:06:57.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:07:27.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:07:27.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:07:27.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:07:27.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:07:27.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:07:27.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:07:27.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-28T18:07:27.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:07:27.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-28T18:07:27.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:07:27.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:07:27.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:07:27.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-28T18:07:30.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-28T18:07:30.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:07:30.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:07:30.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:07:30.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:07:30.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:07:30.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:07:30.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:07:30.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:07:30.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:07:30.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:07:30.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:07:30.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:07:30.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:07:30.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:07:30.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:07:30.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:07:30.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:07:30.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:07:30.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:07:30.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:07:30.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:07:30.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:07:30.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:07:30.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:07:30
2026-05-28T18:07:30.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69655, datetime.datetime(2026, 5, 28, 18, 7, 30), datetime.datetime(2026, 5, 28, 18, 7, 29), 'salt', 10.0, 70.97, None, 8.36, 119.16, 5.02, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:07:30.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:07:30.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:07:30.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:07:29, diff=1.752728s, valid=True
2026-05-28T18:07:30.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:07:30.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:07:30.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:07:12, diff=18.756449s, valid=True
2026-05-28T18:07:30.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:07:30.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:07:24, diff=6.765128s, valid=True
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:07:30.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:07:30.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:07:12, diff=18.769266s, valid=True
2026-05-28T18:07:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:07:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:07:30.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:07:30.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917092.770141s, valid=True
2026-05-28T18:07:30.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:07:30.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:07:30.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:07:30.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:07:30.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:07:30.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:07:30.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:07:30.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:07:30.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:07:30.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:07:31.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:07:31.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:07:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:07:31.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:07:31.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:07:31.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:07:31.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:07:31.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:07:31.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:07:31.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:07:32.214 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:07:32.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:08:02.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:08:02.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:08:02.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:08:02.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:08:02.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:08:02.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:08:02.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-28T18:08:02.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:08:02.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-28T18:08:02.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:08:02.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:08:02.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:08:02.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-28T18:08:05.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:08:05.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:08:05.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:08:05.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:08:05.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:08:05.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:08:05.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:08:05.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:08:05.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:08:05.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:08:05.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:08:05.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:08:05.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:08:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:08:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:08:05.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:08:05.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:08:05.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:08:05.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:08:05.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:08:05.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:08:05.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:08:05.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:08:05.763 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:08:05.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:08:00
2026-05-28T18:08:05.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69656, datetime.datetime(2026, 5, 28, 18, 8), datetime.datetime(2026, 5, 28, 18, 8), 'salt', 10.0, 70.9, None, 8.05, 115.48, 5.03, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:08:05.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:08:05.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:08:05.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:00, diff=5.827754s, valid=True
2026-05-28T18:08:05.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:08:05.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:08:05.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:12, diff=-6.169437s, valid=True
2026-05-28T18:08:05.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:08:05.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:07:56, diff=9.837185s, valid=True
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:08:05.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:08:05.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:12, diff=-6.159739s, valid=True
2026-05-28T18:08:05.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:08:05.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:08:05.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:08:05.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917127.840939s, valid=True
2026-05-28T18:08:05.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:08:05.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:08:05.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:08:05.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:08:05.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:08:05.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:08:05.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:08:05.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:08:05.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:08:06.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:08:06.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:08:06.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:08:06.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:08:06.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:08:06.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:08:06.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:08:06.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:08:06.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:08:06.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-28T18:08:06.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-28T18:08:06.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:08:06.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:08:37.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:08:37.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:08:37.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:08:37.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:08:37.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:08:37.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:08:37.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-28T18:08:37.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:08:37.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:08:37.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:08:37.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:08:37.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:08:37.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-28T18:08:41.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:08:41.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:08:41.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:08:41.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:08:41.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:08:41.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:08:41.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:08:41.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:08:41.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:08:41.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:08:41.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:08:41.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:08:41.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:08:41.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:08:41.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:08:41.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:08:41.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:08:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:08:41.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:08:41.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:08:41.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:08:41.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:08:41.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:08:41.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:08:41.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:08:30
2026-05-28T18:08:41.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69657, datetime.datetime(2026, 5, 28, 18, 8, 30), datetime.datetime(2026, 5, 28, 18, 8, 30), 'salt', 10.0, 71.07, None, 10.16, 108.3, 5.0, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:08:41.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:08:41.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:08:41.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:30, diff=11.63265s, valid=True
2026-05-28T18:08:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:08:41.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:08:41.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:12, diff=29.635511s, valid=True
2026-05-28T18:08:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:08:41.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:28, diff=13.642225s, valid=True
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:08:41.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:08:41.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:12, diff=29.645301s, valid=True
2026-05-28T18:08:41.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:08:41.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:08:41.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:08:41.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917163.645961s, valid=True
2026-05-28T18:08:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:08:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:08:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:08:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:08:41.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:08:41.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:08:41.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:08:41.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:08:41.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:08:41.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:08:41.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:08:41.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:08:41.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:08:41.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:08:42.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:08:42.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:08:42.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:08:42.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:08:42.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-28T18:08:42.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-28T18:08:42.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:08:42.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:09:12.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:09:12.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:09:12.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:09:13.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:09:13.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:09:13.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:09:13.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-28T18:09:13.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:09:13.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:09:13.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:09:13.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:09:13.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:09:13.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-28T18:09:16.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-28T18:09:16.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:09:16.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:09:16.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:09:16.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:09:16.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:09:16.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:09:16.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:09:16.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:09:16.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:09:16.947 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:09:16.947 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:09:16.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:09:17.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:09:17.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:09:17.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:09:17.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:09:17.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:09:17.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:09:17.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:09:17.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:09:17.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:09:17.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:09:17.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:09:17.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:09:00
2026-05-28T18:09:17.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69658, datetime.datetime(2026, 5, 28, 18, 9), datetime.datetime(2026, 5, 28, 18, 9), 'salt', 9.83, 71.1, None, 9.42, 111.05, 4.98, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:09:17.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:09:17.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:09:17.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:00, diff=17.278766s, valid=True
2026-05-28T18:09:17.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:09:17.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:09:17.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:12, diff=5.281644s, valid=True
2026-05-28T18:09:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:09:17.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:08:59, diff=18.288206s, valid=True
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:09:17.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:09:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:12, diff=5.291233s, valid=True
2026-05-28T18:09:17.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:09:17.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:09:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:09:17.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917199.291881s, valid=True
2026-05-28T18:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:09:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:09:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:09:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:09:17.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:09:17.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:09:17.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:09:17.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:09:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:09:17.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:09:17.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:09:17.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:09:18.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:09:18.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:09:18.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:09: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-28T18:09:18.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-28T18:09:18.577 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:09:18.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:09:48.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:09:48.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:09:48.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:09:48.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:09:48.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:09:49.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:09:49.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:09:49.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:09:49.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-28T18:09:49.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:09:49.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:09:49.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:09:49.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-28T18:09:52.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-28T18:09:52.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:09:52.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:09:52.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:09:52.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:09:52.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:09:52.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:09:52.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:09:52.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:09:52.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:09:52.140 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:09:52.140 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:09:52.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:09:52.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:09:52.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:09:52.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:09:52.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:09:52.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:09:52.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:09:52.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:09:52.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:09:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:09:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:09:52.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:09:52.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:09:31
2026-05-28T18:09:52.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69659, datetime.datetime(2026, 5, 28, 18, 9, 31), datetime.datetime(2026, 5, 28, 18, 9, 30), 'salt', 9.9, 71.37, None, 9.07, 106.83, 4.93, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:09:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:09:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:09:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:30, diff=22.466983s, valid=True
2026-05-28T18:09:52.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:09:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:09:52.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:12, diff=40.469845s, valid=True
2026-05-28T18:09:52.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:09:52.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:31, diff=21.476439s, valid=True
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:09:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:09:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:12, diff=40.479513s, valid=True
2026-05-28T18:09:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:09:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:09:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:09:52.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917234.480186s, valid=True
2026-05-28T18:09:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:09:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:09:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:09:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:09:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:09:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:09:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:09:52.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:09:52.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:09:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:09:52.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:09:52.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:09:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:09:52.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:09:53.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:09:53.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:09:53.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:09:53.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:09:53.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-28T18:09:53.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-28T18:09:53.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:09:53.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:10:23.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:10:23.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:10:23.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:10:23.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:10:24.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:10:24.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:10:24.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-28T18:10:24.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:10:24.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-28T18:10:24.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:10:24.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:10:24.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:10:24.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-28T18:10:27.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-28T18:10:27.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:10:27.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:10:27.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:10:27.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:10:27.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:10:27.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:10:27.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:10:27.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:10:27.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:10:27.806 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:10:27.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:10:27.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:10:27.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:10:27.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:10:27.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:10:27.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:10:28.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:10:28.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:10:28.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:10:28.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:10:28.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:10:28.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:10:28.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:10:28.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:10:01
2026-05-28T18:10:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69660, datetime.datetime(2026, 5, 28, 18, 10, 1), datetime.datetime(2026, 5, 28, 18, 10, 1), 'salt', 9.93, 71.43, None, 10.16, 97.73, 4.92, 830.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:10:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:10:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:10:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:01, diff=27.123358s, valid=True
2026-05-28T18:10:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:10:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:10:28.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=16.126223s, valid=True
2026-05-28T18:10:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:10:28.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:09:55, diff=33.133009s, valid=True
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:10:28.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:10:28.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=16.136082s, valid=True
2026-05-28T18:10:28.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:10:28.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:10:28.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:10:28.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917270.13676s, valid=True
2026-05-28T18:10:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:10:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:10:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:10:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:10:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:10:28.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:10:28.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:10:28.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:10:28.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:10:28.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:10:28.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:10:28.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:10:28.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:10:28.457 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:10:28.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:10:29.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:10:29.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:10:29.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:10:29.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-28T18:10:29.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-28T18:10:29.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:10:29.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:10:59.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:10:59.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:10:59.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:10:59.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:10:59.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:11:00.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:11: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-28T18:11:00.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:11:00.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-28T18:11:00.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:11:00.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:11:00.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:11:00.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-28T18:11:03.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-28T18:11:03.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:11:03.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:11:03.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:11:03.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:11:03.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:11:03.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:11:03.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:11:03.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:11:03.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:11:03.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:11:03.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:11:03.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:11:03.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:11:03.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:11:03.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:11:03.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:11:03.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:11:03.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:11:03.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:11:03.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:11:03.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:11:03.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:11:03.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:11:03.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:11:02
2026-05-28T18:11:03.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69662, datetime.datetime(2026, 5, 28, 18, 11, 2), datetime.datetime(2026, 5, 28, 18, 11, 1), 'salt', 9.9, 71.76, None, 10.59, 108.92, 4.85, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:11:03.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:11:03.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:11:03.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:11:01, diff=2.358609s, valid=True
2026-05-28T18:11:03.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:11:03.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:11:03.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=51.361462s, valid=True
2026-05-28T18:11:03.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:11:03.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:56, diff=7.368156s, valid=True
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:11:03.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:11:03.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=51.371211s, valid=True
2026-05-28T18:11:03.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:11:03.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:11:03.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:11:03.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917305.37187s, valid=True
2026-05-28T18:11:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:11:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:11:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:11:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:11:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:11:03.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:11:03.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:11:03.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:11:03.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:11:03.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:11:03.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:11:03.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:11:03.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:11:03.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:11:03.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:11:04.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:11:04.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:11:04.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:11:04.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-28T18:11:04.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-28T18:11:04.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:11:04.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:11:34.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:11:34.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:11:34.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:11:35.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:11:35.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:11:35.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:11:35.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-28T18:11:35.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:11:35.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-28T18:11:35.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:11:35.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:11:35.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:11: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-28T18:11:38.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:11:38.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:11:38.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:11:38.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:11:38.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:11:38.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:11:38.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:11:38.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:11:38.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:11:38.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:11:38.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:11:38.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:11:38.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:11:38.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:11:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:11:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:11:38.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:11:38.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:11:38.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:11:38.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:11:38.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:11:38.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:11:38.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:11:38.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:11:38.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:11:33
2026-05-28T18:11:38.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69663, datetime.datetime(2026, 5, 28, 18, 11, 33), datetime.datetime(2026, 5, 28, 18, 11, 32), 'salt', 9.83, 71.93, None, 10.87, 107.93, 4.81, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:11:38.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:11:38.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:11:38.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:11:32, diff=6.663171s, valid=True
2026-05-28T18:11:38.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:11:38.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:11:38.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=86.666069s, valid=True
2026-05-28T18:11:38.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:11:38.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:11:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:11:26, diff=12.672795s, valid=True
2026-05-28T18:11:38.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:11:38.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:11:38.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:11:38.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:11:38.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:11:38.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:11:38.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=86.675843s, valid=True
2026-05-28T18:11:38.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:11:38.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:11:38.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:11:38.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917340.676496s, valid=True
2026-05-28T18:11:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:11:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:11:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:11:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:11:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:11:38.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:11:38.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:11:38.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:11:38.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:11:38.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:11:38.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:11:38.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:11:38.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:11:39.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:11:39.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:11:39.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:11:39.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:11:39.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:11:39.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-28T18:11:39.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-28T18:11:39.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:11:39.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:12:09.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:12:09.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:12:09.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:12:10.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:12:10.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:12:10.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:12:10.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-28T18:12:10.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:12:10.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-28T18:12:10.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:12:10.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:12:10.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:12: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-28T18:12:13.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-28T18:12:13.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:12:13.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:12:13.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:12:13.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:12:13.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:12:13.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:12:13.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:12:13.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:12:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:12:13.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:12:13.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:12:13.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:12:13.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:12:13.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:12:13.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:12:13.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:12:13.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:12:13.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:12:14.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:12:14.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:12:14.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:12:14.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:12:14.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:12:14.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:12:03
2026-05-28T18:12:14.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69664, datetime.datetime(2026, 5, 28, 18, 12, 3), datetime.datetime(2026, 5, 28, 18, 12, 2), 'salt', 9.73, 71.96, None, 10.73, 105.52, 4.8, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:12:14.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:12:14.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:12:14.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:12:02, diff=12.103201s, valid=True
2026-05-28T18:12:14.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:12:14.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:12:14.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=122.10603s, valid=True
2026-05-28T18:12:14.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:12:14.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:12:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:11:57, diff=17.112599s, valid=True
2026-05-28T18:12:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:12:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:12:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:12:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:12:14.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:12:14.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:12:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=122.115653s, valid=True
2026-05-28T18:12:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:12:14.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:12:14.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:12:14.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917376.116294s, valid=True
2026-05-28T18:12:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:12:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:12:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:12:14.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:12:14.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:12:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:12:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:12:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:12:14.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:12:14.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:12:14.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:12:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:12:14.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:12:14.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:12:14.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:12:15.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:12:15.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:12:15.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:12:15.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-28T18:12:15.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-28T18:12:15.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:12:15.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:12:45.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:12:45.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:12:45.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:12:45.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:12:45.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:12:45.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:12:45.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-28T18:12:45.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:12:45.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-28T18:12:46.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:12:46.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:12:46.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:12:46.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-28T18:12:49.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-28T18:12:49.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:12:49.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:12:49.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:12:49.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:12:49.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:12:49.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:12:49.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:12:49.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:12:49.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:12:49.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:12:49.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:12:49.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:12:49.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:12:49.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:12:49.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:12:49.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:12:49.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:12:49.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:12:49.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:12:49.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:12:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:12:49.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:12:49.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:12:49.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:12:33
2026-05-28T18:12:49.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69665, datetime.datetime(2026, 5, 28, 18, 12, 33), datetime.datetime(2026, 5, 28, 18, 12, 33), 'salt', 9.73, 72.06, None, 11.86, 107.14, 4.78, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:12:49.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:12:49.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:12:49.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:12:33, diff=16.980805s, valid=True
2026-05-28T18:12:49.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:12:49.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:12:49.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=157.983965s, valid=True
2026-05-28T18:12:49.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:12:49.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:12:49.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:12:29, diff=20.990934s, valid=True
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:12:49.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:12:49.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=157.994058s, valid=True
2026-05-28T18:12:49.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:12:49.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:12:49.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:12:49.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917411.994756s, valid=True
2026-05-28T18:12:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:12:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:12:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:12:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:12:49.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:12:50.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:12:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:12:50.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:12:50.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:12:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:12:50.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:12:50.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:12:50.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:12:50.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:12:50.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:12:50.916 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:12:51.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:12:51.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:12:51.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-28T18:12:51.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-28T18:12:51.210 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:12:51.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:13:21.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:13:21.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:13:21.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:13:21.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:13:21.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:13:21.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:13:21.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-28T18:13:21.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:13:21.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-28T18:13:21.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:13:21.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:13:21.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:13:21.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-28T18:13:24.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-28T18:13:24.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:13:24.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:13:24.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:13:24.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:13:24.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:13:24.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:13:24.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:13:24.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:13:24.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:13:24.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:13:24.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:13:24.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:13:24.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:13:24.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:13:24.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:13:24.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:13:24.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:13:24.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:13:24.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:13:24.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:13:24.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:13:24.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:13:24.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:13:25.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:13:03
2026-05-28T18:13:25.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69666, datetime.datetime(2026, 5, 28, 18, 13, 3), datetime.datetime(2026, 5, 28, 18, 13, 3), 'salt', 9.77, 72.33, None, 11.26, 104.98, 4.73, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:13:25.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:13:25.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:13:25.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:13:03, diff=22.041015s, valid=True
2026-05-28T18:13:25.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:13:25.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:13:25.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=193.043858s, valid=True
2026-05-28T18:13:25.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:13:25.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:13:00, diff=25.050478s, valid=True
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:13:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:13:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=193.053515s, valid=True
2026-05-28T18:13:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:13:25.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:13:25.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:13:25.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917447.054179s, valid=True
2026-05-28T18:13:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:13:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:13:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:13:25.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:13:25.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:13:25.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:13:25.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:13:25.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:13:25.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:13:25.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:13:25.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:13:25.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:13:25.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:13:25.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:13:25.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:13:26.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:13:26.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:13:26.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:13:26.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-28T18:13:26.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-28T18:13:26.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:13:26.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:13:56.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:13:56.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:13:56.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:13:56.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:13:56.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:13:57.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:13:57.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-28T18:13:57.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:13:57.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-28T18:13:57.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:13:57.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:13:57.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:13:57.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-28T18:14:00.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:14:00.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:14:00.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:14:00.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:14:00.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:14:00.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:14:00.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:14:00.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:14:00.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:14:00.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:14:00.294 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:14:00.294 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:14:00.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:14:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:14:00.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:14:00.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:14:00.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:14:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:14:00.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:14:00.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:14:00.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:14:00.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:14:00.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:14:00.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:14:00.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:13:34
2026-05-28T18:14:00.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69667, datetime.datetime(2026, 5, 28, 18, 13, 34), datetime.datetime(2026, 5, 28, 18, 13, 33), 'salt', 9.83, 72.3, None, 10.69, 109.65, 4.74, 830.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:14:00.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:14:00.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:14:00.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:13:33, diff=27.611115s, valid=True
2026-05-28T18:14:00.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:14:00.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:14:00.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=228.613966s, valid=True
2026-05-28T18:14:00.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:14:00.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:13:32, diff=28.620564s, valid=True
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:14:00.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:14:00.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:14:00.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:10:12, diff=228.623606s, valid=True
2026-05-28T18:14:00.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:14:00.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:14:00.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:14:00.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917482.624279s, valid=True
2026-05-28T18:14:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:14:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:14:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:14:00.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:14:00.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:14:00.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:14:00.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:14:00.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:14:00.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:14:00.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:14:00.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:14:00.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:14:00.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:14:00.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:14:01.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:14:01.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:14:01.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:14:01.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:14:01.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:14:01.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:14:01.691 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:14:01.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:14:31.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:14:31.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:14:31.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:14:31.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:14:31.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:14:32.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:14:32.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-28T18:14:32.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:14:32.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-28T18:14:32.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:14:32.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:14:32.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:14:32.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-28T18:14:35.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-28T18:14:35.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:14:35.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:14:35.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:14:35.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:14:35.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:14:35.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:14:35.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:14:35.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:14:35.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:14:35.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:14:35.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:14:35.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:14:35.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:14:35.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:14:35.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:14:35.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:14:35.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:14:35.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:14:35.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:14:35.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:14:35.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:14:35.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:14:35.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:14:35.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:14:34
2026-05-28T18:14:35.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69669, datetime.datetime(2026, 5, 28, 18, 14, 34), datetime.datetime(2026, 5, 28, 18, 14, 34), 'salt', 9.9, 72.33, None, 11.4, 110.26, 4.73, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:14:35.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:14:35.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:14:35.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:14:34, diff=1.463212s, valid=True
2026-05-28T18:14:35.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:14:35.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:14:35.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:12, diff=-36.533956s, valid=True
2026-05-28T18:14:35.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:14:35.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:14:28, diff=7.472596s, valid=True
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:14:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:14:35.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:14:35.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:12, diff=-36.52441s, valid=True
2026-05-28T18:14:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:14:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:14:35.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:14:35.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917517.476242s, valid=True
2026-05-28T18:14:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:14:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:14:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:14:35.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:14:35.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:14:35.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:14:35.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:14:35.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:14:35.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:14:35.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:14:35.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:14:35.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:14:35.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:14:35.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:14:36.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:14:36.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:14:36.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:14:36.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:14:36.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:14:36.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-28T18:14:36.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:14:36.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:15:06.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:15:06.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:15:06.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:15:07.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:15:07.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:15:07.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:15:07.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:15:07.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:15:07.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-28T18:15:07.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:15:07.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:15:07.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:15:07.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-28T18:15:10.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-28T18:15:10.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:15:10.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:15:10.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:15:10.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:15:10.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:15:10.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:15:10.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:15:10.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:15:10.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:15:10.421 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:15:10.421 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:15:10.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:15:10.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:15:10.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:15:10.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:15:10.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:15:10.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:15:10.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:15:10.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:15:10.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:15:10.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:15:10.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:15:10.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:15:10.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:15:04
2026-05-28T18:15:10.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69670, datetime.datetime(2026, 5, 28, 18, 15, 4), datetime.datetime(2026, 5, 28, 18, 15, 4), 'salt', 9.8, 72.33, None, 11.93, 109.51, 4.73, 830.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:15:10.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:15:10.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:15:10.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:04, diff=6.738506s, valid=True
2026-05-28T18:15:10.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:15:10.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:15:10.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:12, diff=-1.258613s, valid=True
2026-05-28T18:15:10.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:15:10.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:14:58, diff=12.748068s, valid=True
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:15:10.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:15:10.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:12, diff=-1.248924s, valid=True
2026-05-28T18:15:10.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:15:10.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:15:10.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:15:10.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917552.751747s, valid=True
2026-05-28T18:15:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:15:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:15:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:15:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:15:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:15:10.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:15:10.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:15:10.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:15:10.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:15:10.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:15:10.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:15:10.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:15:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:15:11.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:15:11.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:15:11.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:15:11.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:15:11.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:15:11.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-28T18:15:11.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:15:12.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:15:12.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:15:42.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:15:42.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:15:42.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:15:42.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:15:42.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:15:42.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:15:42.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-28T18:15:42.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:15:42.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-28T18:15:42.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:15:42.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:15:42.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:15:42.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-28T18:15:45.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-28T18:15:45.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:15:45.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:15:45.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:15:45.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:15:45.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:15:45.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:15:45.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:15:45.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:15:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:15:45.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:15:45.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:15:45.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:15:45.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:15:45.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:15:45.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:15:45.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:15:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:15:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:15:45.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:15:45.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:15:45.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:15:45.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:15:45.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:15:46.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:15:35
2026-05-28T18:15:46.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69671, datetime.datetime(2026, 5, 28, 18, 15, 35), datetime.datetime(2026, 5, 28, 18, 15, 34), 'salt', 9.8, 72.5, None, 11.05, 114.36, 4.7, 830.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:15:46.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:15:46.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:15:46.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:34, diff=12.021923s, valid=True
2026-05-28T18:15:46.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:15:46.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:15:46.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:12, diff=-25.975249s, valid=True
2026-05-28T18:15:46.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:15:46.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:28, diff=18.031335s, valid=True
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:15:46.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:15:46.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:12, diff=-25.965718s, valid=True
2026-05-28T18:15:46.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:15:46.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:15:46.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:15:46.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917588.034953s, valid=True
2026-05-28T18:15:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:15:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:15:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:15:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:15:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:15:46.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:15:46.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:15:46.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:15:46.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:15:46.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:15:46.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:15:46.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:15:46.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:15:46.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:15:46.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:15:46.910 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:15:47.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:15:47.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:15:47.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18: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-28T18:15:47.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:15:47.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:16:17.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:16:17.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:16:17.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:16:17.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:16:17.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:16:17.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:16:17.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-28T18:16:17.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:16:17.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-28T18:16:17.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:16:17.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:16:17.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:16:17.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-28T18:16:20.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:16:20.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:16:20.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:16:20.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:16:20.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:16:20.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:16:20.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:16:20.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:16:20.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:16:20.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:16:20.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:16:20.681 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:16:20.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:16:20.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:16:20.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:16:20.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:16:20.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:16:20.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:16:20.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:16:20.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:16:20.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:16:20.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:16:20.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:16:20.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:16:21.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:16:05
2026-05-28T18:16:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69672, datetime.datetime(2026, 5, 28, 18, 16, 5), datetime.datetime(2026, 5, 28, 18, 16, 4), 'salt', 9.8, 72.57, None, 12.21, 116.03, 4.68, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:16:21.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:16:21.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:16:21.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:04, diff=17.013088s, valid=True
2026-05-28T18:16:21.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:16:21.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:16:21.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:12, diff=9.015986s, valid=True
2026-05-28T18:16:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:16:21.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:15:58, diff=23.022564s, valid=True
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:16:21.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:16:21.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:16:21.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:12, diff=9.025579s, valid=True
2026-05-28T18:16:21.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:16:21.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:16:21.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:16:21.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917623.026237s, valid=True
2026-05-28T18:16:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:16:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:16:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:16:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:16:21.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:16:21.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:16:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:16:21.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:16:21.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:16:21.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:16:21.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:16:21.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:16:21.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:16:21.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:16:21.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:16:21.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:16:22.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:16:22.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:16:22.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-28T18:16:22.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-28T18:16:22.226 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:16:22.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:16:52.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:16:52.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:16:52.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:16:52.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:16:52.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:16:52.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:16:52.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-28T18:16:52.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:16:52.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-28T18:16:52.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:16:52.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:16:52.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:16:52.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:16:55.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-28T18:16:55.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:16:55.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:16:55.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:16:55.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:16:55.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:16:55.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:16:55.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:16:55.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:16:55.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:16:55.875 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:16:55.875 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:16:55.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:16:55.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:16:55.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:16:56.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:16:56.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:16:56.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:16:56.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:16:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:16:56.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:16:56.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:16:56.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:16:56.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:16:56.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:16:35
2026-05-28T18:16:56.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69673, datetime.datetime(2026, 5, 28, 18, 16, 35), datetime.datetime(2026, 5, 28, 18, 16, 35), 'salt', 9.77, 72.66, None, 11.82, 114.6, 4.67, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:16:56.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:16:56.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:16:56.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:35, diff=21.191838s, valid=True
2026-05-28T18:16:56.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:16:56.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:16:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:12, diff=-15.805368s, valid=True
2026-05-28T18:16:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:16:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:16:30, diff=26.201146s, valid=True
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:16:56.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:16:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:12, diff=-15.795845s, valid=True
2026-05-28T18:16:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:16:56.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:16:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:16:56.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917658.204816s, valid=True
2026-05-28T18:16:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:16:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:16:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:16:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:16:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:16:56.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:16:56.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:16:56.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:16:56.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:16:56.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:16:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:16:56.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:16:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:16:56.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:16:56.739 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:16:57.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:16:57.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:16:57.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:16:57.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-28T18:16:57.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-28T18:16:57.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:16:57.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:17:27.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:17:27.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:17:27.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:17:27.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:17:27.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:17:27.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:17:27.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:17:27.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:17:27.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-28T18:17:27.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:17:27.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:17:27.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:17:27.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:17:31.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-28T18:17:31.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:17:31.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:17:31.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:17:31.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:17:31.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:17:31.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:17:31.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:17:31.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:17:31.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:17:31.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:17:31.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:17:31.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:17:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:17:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:17:31.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:17:31.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:17:31.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:17:31.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:17:31.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:17:31.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:17:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:17:31.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:17:31.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:17:31.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:17:05
2026-05-28T18:17:31.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69674, datetime.datetime(2026, 5, 28, 18, 17, 5), datetime.datetime(2026, 5, 28, 18, 17, 5), 'salt', 9.77, 72.77, None, 11.29, 121.52, 4.64, 830.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:17:31.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:17:31.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:17:31.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:05, diff=26.439007s, valid=True
2026-05-28T18:17:31.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:17:31.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:17:31.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:12, diff=19.441846s, valid=True
2026-05-28T18:17:31.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:17:31.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:01, diff=30.448349s, valid=True
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:17:31.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:17:31.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:17:12, diff=19.451342s, valid=True
2026-05-28T18:17:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:17:31.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:17:31.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:17:31.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917693.452011s, valid=True
2026-05-28T18:17:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:17:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:17:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:17:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:17:31.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:17:31.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:17:31.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:17:31.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:17:31.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:17:31.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:17:31.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:17:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:17:31.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:17:31.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:17:32.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:17:32.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:17:32.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:17:32.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:17:32.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-28T18:17:32.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-28T18:17:32.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:17:32.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:18:02.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:18:02.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:18:02.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:18:03.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:18:03.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:18:03.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:18:03.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-28T18:18:03.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:18:03.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:18:03.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:18:03.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:18:03.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:18:03.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-28T18:18:06.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-28T18:18:06.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:18:06.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:18:06.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:18:06.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:18:06.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:18:06.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:18:06.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:18:06.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:18:06.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:18:06.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:18:06.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:18:06.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:18:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:18:06.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:18:06.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:18:06.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:18:06.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:18:06.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:18:06.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:18:06.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:18:06.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:18:06.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:18:06.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:18:06.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:18:06
2026-05-28T18:18:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69676, datetime.datetime(2026, 5, 28, 18, 18, 6), datetime.datetime(2026, 5, 28, 18, 18, 6), 'salt', 9.57, 73.13, None, 10.69, 120.44, 4.56, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:18:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:18:06.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:18:06.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:06, diff=0.767455s, valid=True
2026-05-28T18:18:06.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:18:06.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:18:06.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:12, diff=-5.229664s, valid=True
2026-05-28T18:18:06.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:18:06.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:18:06.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:04, diff=2.776954s, valid=True
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:18:06.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:18:06.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:12, diff=-5.220003s, valid=True
2026-05-28T18:18:06.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:18:06.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:18:06.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:18:06.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917728.780658s, valid=True
2026-05-28T18:18:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:18:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:18:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:18:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:18:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:18:06.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:18:06.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:18:06.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:18:06.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:18:06.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:18:06.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:18:07.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:18:07.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:18:07.103 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:18:07.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:18:07.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:18:07.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:18:07.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:18:07.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-28T18:18:07.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-28T18:18:07.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:18:07.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:18:37.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:18:37.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:18:37.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:18:38.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:18:38.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:18:38.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:18:38.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-28T18:18:38.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:18:38.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-28T18:18:38.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:18:38.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:18:38.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:18:38.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:18:41.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-28T18:18:41.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:18:41.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:18:41.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:18:41.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:18:41.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:18:41.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:18:41.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:18:41.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:18:41.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:18:41.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:18:41.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:18:41.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:18:41.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:18:41.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:18:41.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:18:41.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:18:41.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:18:41.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:18:41.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:18:41.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:18:41.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:18:41.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:18:41.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:18:41.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:18:36
2026-05-28T18:18:41.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69677, datetime.datetime(2026, 5, 28, 18, 18, 36), datetime.datetime(2026, 5, 28, 18, 18, 36), 'salt', 9.54, 73.1, None, 10.98, 116.9, 4.57, 830.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:18:41.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:18:41.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:18:41.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:36, diff=5.955135s, valid=True
2026-05-28T18:18:41.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:18:41.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:18:41.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:12, diff=-30.042013s, valid=True
2026-05-28T18:18:41.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:18:41.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:18:41.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:18:36, diff=5.964772s, valid=True
2026-05-28T18:18:41.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:18:41.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:18:41.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:18:41.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:18:41.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:18:41.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:18:41.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:12, diff=-30.032171s, valid=True
2026-05-28T18:18:41.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:18:41.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:18:41.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:18:41.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917763.9685s, valid=True
2026-05-28T18:18:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:18:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:18:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:18:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:18:41.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:18:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:18:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:18:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:18:42.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:18:42.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:18:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:18:42.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:18:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:18:42.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:18:42.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:18:42.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:18:43.027 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:18:43.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:18:43.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-28T18:18:43.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-28T18:18:43.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:18:43.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:19:13.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:19:13.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:19:13.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:19:13.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:19:13.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:19:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:19:13.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-28T18:19:13.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:19:13.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-28T18:19:13.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:19:13.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:19:13.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:19:13.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-28T18:19:16.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-28T18:19:16.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:19:16.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:19:16.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:19:16.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:19:16.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:19:16.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:19:16.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:19:16.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:19:16.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:19:16.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:19:16.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:19:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:19:17.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:19:17.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:19:17.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:19:17.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:19:17.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:19:17.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:19:17.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:19:17.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:19:17.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:19:17.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:19:17.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:19:17.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:19:06
2026-05-28T18:19:17.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69678, datetime.datetime(2026, 5, 28, 18, 19, 6), datetime.datetime(2026, 5, 28, 18, 19, 6), 'salt', 9.54, 73.4, None, 12.6, 121.45, 4.51, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:19:17.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:19:17.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:19:17.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:06, diff=11.289308s, valid=True
2026-05-28T18:19:17.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:19:17.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:19:17.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:12, diff=5.293192s, valid=True
2026-05-28T18:19:17.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:19:17.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:00, diff=17.302254s, valid=True
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:19:17.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:19:17.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:12, diff=5.306471s, valid=True
2026-05-28T18:19:17.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:19:17.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:19:17.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:19:17.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917799.30732s, valid=True
2026-05-28T18:19:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:19:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:19:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:19:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:19:17.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:19:17.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:19:17.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:19:17.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:19:17.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:19:17.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:19:17.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:19:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:19:17.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:19:17.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:19:18.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:19:18.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:19:18.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:19:18.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:19:18.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-28T18:19:18.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-28T18:19:18.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:19:18.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:19:48.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:19:48.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:19:48.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:19:48.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:19:48.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:19:49.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:19:49.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-28T18:19:49.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:19:49.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-28T18:19:49.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:19:49.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:19:49.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:19:49.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:19:52.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-28T18:19:52.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:19:52.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:19:52.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:19:52.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:19:52.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:19:52.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:19:52.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:19:52.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:19:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:19:52.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:19:52.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:19:52.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:19:52.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:19:52.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:19:52.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:19:52.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:19:52.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:19:52.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:19:52.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:19:52.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:19:52.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:19:52.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:19:52.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:19:52.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:19:37
2026-05-28T18:19:52.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69679, datetime.datetime(2026, 5, 28, 18, 19, 37), datetime.datetime(2026, 5, 28, 18, 19, 36), 'salt', 9.47, 73.46, None, 12.99, 122.02, 4.49, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:19:52.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:19:52.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:19:52.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:36, diff=16.574416s, valid=True
2026-05-28T18:19:52.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:19:52.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:19:52.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:12, diff=-19.422695s, valid=True
2026-05-28T18:19:52.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:19:52.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:19:52.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:19:30, diff=22.58394s, valid=True
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:19:52.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:19:52.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:12, diff=-19.413049s, valid=True
2026-05-28T18:19:52.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:19:52.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:19:52.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:19:52.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917834.587607s, valid=True
2026-05-28T18:19:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:19:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:19:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:19:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:19:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:19:52.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:19:52.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:19:52.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:19:52.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:19:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:19:52.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:19:52.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:19:52.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:19:52.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:19:53.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:19:53.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:19:53.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:19:53.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:19:53.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-28T18:19:53.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-28T18:19:53.729 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:19:53.729 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:20:23.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:20:23.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:20:23.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:20:23.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:20:23.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:20:24.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:20:24.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-28T18:20:24.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:20:24.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-28T18:20:24.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:20:24.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:20:24.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:20:24.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-28T18:20:27.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:20:27.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:20:27.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:20:27.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:20:27.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:20:27.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:20:27.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:20:27.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:20:27.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:20:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:20:27.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:20:27.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:20:27.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:20:27.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:20:27.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:20:27.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:20:27.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:20:27.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:20:27.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:20:28.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:20:28.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:20:28.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:20:28.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:20:28.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:20:28.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:20:07
2026-05-28T18:20:28.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69680, datetime.datetime(2026, 5, 28, 18, 20, 7), datetime.datetime(2026, 5, 28, 18, 20, 6), 'salt', 9.64, 73.83, None, 10.66, 121.88, 4.43, 830.39, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:20:28.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:20:28.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:20:28.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:06, diff=22.098435s, valid=True
2026-05-28T18:20:28.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:20:28.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:20:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:12, diff=16.101284s, valid=True
2026-05-28T18:20:28.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:20:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:01, diff=27.108003s, valid=True
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:20:28.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:20:28.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:12, diff=16.111019s, valid=True
2026-05-28T18:20:28.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:20:28.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:20:28.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:20:28.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917870.111686s, valid=True
2026-05-28T18:20:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:20:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:20:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:20:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:20:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:20:28.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:20:28.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:20:28.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:20:28.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:20:28.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:20:28.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:20:28.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:20:28.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:20:28.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:20:28.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:20:28.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:20:29.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:20:29.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:20:29.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-28T18:20:29.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-28T18:20:29.322 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:20:29.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:20:59.352 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:20:59.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:20:59.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:20:59.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:20:59.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:21:00.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:21:00.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-28T18:21:00.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:21:00.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-28T18:21:00.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:21:00.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:21:00.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:21:00.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-28T18:21:03.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:21:03.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:21:03.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:21:03.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:21:03.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:21:03.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:21:03.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:21:03.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:21:03.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:21:03.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:21:03.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:21:03.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:21:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:21:03.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:21:03.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:21:03.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:21:03.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:21:03.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:21:03.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:21:03.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:21:03.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:21:03.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:21:03.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:21:03.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:21:03.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:20:37
2026-05-28T18:21:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69681, datetime.datetime(2026, 5, 28, 18, 20, 37), datetime.datetime(2026, 5, 28, 18, 20, 37), 'salt', 9.57, 73.93, None, 11.61, 126.29, 4.41, 830.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:21:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:21:03.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:21:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:37, diff=26.707703s, valid=True
2026-05-28T18:21:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:21:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:21:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:21:12, diff=-8.289104s, valid=True
2026-05-28T18:21:03.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:21:03.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:20:31, diff=32.718271s, valid=True
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:21:03.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:21:03.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:21:12, diff=-8.278423s, valid=True
2026-05-28T18:21:03.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:21:03.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:21:03.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:21:03.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917905.722319s, valid=True
2026-05-28T18:21:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:21:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:21:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:21:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:21:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:21:03.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:21:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:21:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:21:03.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:21:03.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:21:03.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:21:03.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:21:04.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:21:04.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:21:04.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:21:04.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:21:04.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:21:04.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:21:04.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-28T18:21:04.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-28T18:21:04.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:21:04.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:21:34.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:21:34.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:21:34.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:21:35.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:21:35.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:21:35.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:21:35.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-28T18:21:35.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:21:35.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-28T18:21:35.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:21:35.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:21:35.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:21:35.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:21:38.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:21:38.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:21:38.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:21:38.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:21:38.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:21:38.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:21:38.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:21:38.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:21:38.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:21:38.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:21:38.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:21:38.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:21:38.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:21:38.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:21:38.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:21:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:21:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:21:39.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:21:39.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:21:39.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:21:39.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:21:39.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:21:39.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:21:39.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:21:39.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:21:37
2026-05-28T18:21:39.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69683, datetime.datetime(2026, 5, 28, 18, 21, 37), datetime.datetime(2026, 5, 28, 18, 21, 37), 'salt', 9.57, 74.03, None, 11.05, 126.94, 4.39, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:21:39.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:21:39.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:21:39.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:21:37, diff=2.131748s, valid=True
2026-05-28T18:21:39.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:21:39.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:21:39.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:12, diff=-32.865387s, valid=True
2026-05-28T18:21:39.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:21:39.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:21:34, diff=5.141259s, valid=True
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:21:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:21:39.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:12, diff=-32.855739s, valid=True
2026-05-28T18:21:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:21:39.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:21:39.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:21:39.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917941.144919s, valid=True
2026-05-28T18:21:39.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:21:39.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:21:39.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:21:39.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:21:39.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:21:39.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:21:39.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:21:39.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:21:39.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:21:39.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:21:39.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:21:39.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:21:39.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:21:39.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:21:39.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:21:40.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:21:40.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:21:40.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:21:40.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:21:40.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:21:40.439 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:21:40.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:22:10.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:22:10.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:22:10.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:22:10.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:22:10.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:22:11.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:22:11.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:22:11.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:22:11.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-28T18:22:11.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:22:11.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:22:11.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:22:11.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-28T18:22: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-28T18:22:14.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:22:14.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:22:14.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:22:14.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:22:14.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:22:14.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:22:14.566 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:22:14.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:22:14.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:22:14.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:22:14.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:22:14.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:22:14.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:22:14.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:22:14.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:22:14.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:22:14.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:22:14.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:22:14.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:22:14.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:22:14.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:22:14.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:22:14.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:22:14.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:22:08
2026-05-28T18:22:14.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69684, datetime.datetime(2026, 5, 28, 18, 22, 8), datetime.datetime(2026, 5, 28, 18, 22, 7), 'salt', 9.61, 74.23, None, 10.38, 119.98, 4.36, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:22:14.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:22:14.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:22:14.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:07, diff=7.965785s, valid=True
2026-05-28T18:22:14.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:22:14.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:22:14.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:12, diff=2.969256s, valid=True
2026-05-28T18:22:14.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:22:14.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:05, diff=9.977422s, valid=True
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:22:14.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:22:14.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:22:14.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:12, diff=2.981137s, valid=True
2026-05-28T18:22:14.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:22:14.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:22:14.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:22:14.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=917976.981955s, valid=True
2026-05-28T18:22:14.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:22:14.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:22:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:22:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:22:14.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:22:15.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:22:15.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:22:15.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:22:15.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:22:15.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:22:15.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:22:15.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:22:15.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:22:15.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:22:15.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:22:15.921 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:22:16.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:22:16.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:22:16.023 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:22:16.023 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:22:16.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:22:16.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:22:46.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:22:46.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:22:46.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:22:46.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:22:46.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:22:46.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:22:46.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-28T18:22:46.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:22:46.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-28T18:22:46.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:22:46.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:22:46.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:22:46.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-28T18:22:49.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-28T18:22:49.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:22:49.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:22:49.648 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:22:49.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:22:49.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:22:49.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:22:49.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:22:49.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:22:49.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:22:49.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:22:49.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:22:49.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:22:49.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:22:49.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:22:49.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:22:49.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:22:49.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:22:49.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:22:49.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:22:49.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:22:49.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:22:49.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:22:49.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:22:50.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:22:38
2026-05-28T18:22:50.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69685, datetime.datetime(2026, 5, 28, 18, 22, 38), datetime.datetime(2026, 5, 28, 18, 22, 37), 'salt', 10.04, 74.06, None, 10.38, 131.12, 4.4, 830.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:22:50.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:22:50.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:22:50.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:37, diff=13.010464s, valid=True
2026-05-28T18:22:50.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:22:50.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:22:50.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:12, diff=-21.986538s, valid=True
2026-05-28T18:22:50.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:22:50.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:22:37, diff=13.020353s, valid=True
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:22:50.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:22:50.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:12, diff=-21.976413s, valid=True
2026-05-28T18:22:50.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:22:50.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:22:50.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:22:50.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918012.024274s, valid=True
2026-05-28T18:22:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:22:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:22:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:22:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:22:50.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:22:50.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:22:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:22:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:22:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:22:50.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:22:50.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:22:50.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:22:50.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:22:50.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:22:50.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:22:51.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:22:51.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:22:51.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:22: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-28T18:22: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-28T18:22:51.215 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:22:51.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:23:21.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:23:21.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:23:21.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:23:21.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:23:21.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:23:21.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:23:21.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-28T18:23:21.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:23: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-28T18:23:21.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:23:21.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:23:21.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:23:21.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:23:24.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:23:24.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:23:24.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:23:24.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:23:24.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:23:24.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:23:24.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:23:24.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:23:24.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:23:24.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:23:24.814 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:23:24.814 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:23:24.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:23:24.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:23:24.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:23:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:23:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:23:25.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:23:25.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:23:25.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:23:25.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:23:25.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:23:25.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:23:25.103 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:23:25.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:23:08
2026-05-28T18:23:25.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69686, datetime.datetime(2026, 5, 28, 18, 23, 8), datetime.datetime(2026, 5, 28, 18, 23, 8), 'salt', 9.54, 74.0, None, 11.12, 127.11, 4.39, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:23:25.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:23:25.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:23:25.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:08, diff=17.171533s, valid=True
2026-05-28T18:23:25.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:23:25.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:23:25.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:12, diff=13.174364s, valid=True
2026-05-28T18:23:25.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:23:25.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:08, diff=17.181074s, valid=True
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:23:25.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:23:25.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:12, diff=13.184082s, valid=True
2026-05-28T18:23:25.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:23:25.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:23:25.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:23:25.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918047.184873s, valid=True
2026-05-28T18:23:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:23:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:23:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:23:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:23:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:23:25.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:23:25.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:23:25.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:23:25.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:23:25.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:23:25.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:23:25.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:23:25.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:23:25.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:23:25.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:23:26.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:23:26.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:23:26.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:23:26.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-28T18:23:26.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-28T18:23:26.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:23:26.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:23:56.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:23:56.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:23:56.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:23:56.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:23:56.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:23:56.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:23:56.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-28T18:23:56.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:23:56.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-28T18:23:57.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:23:57.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:23:57.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:23:57.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:24:00.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-28T18:24:00.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:24:00.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:24:00.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:24:00.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:24:00.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:24:00.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:24:00.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:24:00.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:24:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:24:00.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:24:00.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:24:00.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:24:00.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:24:00.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:24:00.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:24:00.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:24:00.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:24:00.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:24:00.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:24:00.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:24:00.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:24:00.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:24:00.407 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:24:00.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:23:38
2026-05-28T18:24:00.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69687, datetime.datetime(2026, 5, 28, 18, 23, 38), datetime.datetime(2026, 5, 28, 18, 23, 38), 'salt', 9.51, 74.03, None, 10.91, 116.25, 4.39, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:24:00.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:24:00.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:24:00.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:38, diff=22.476248s, valid=True
2026-05-28T18:24:00.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:24:00.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:24:00.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:12, diff=-11.520941s, valid=True
2026-05-28T18:24:00.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:24:00.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:23:32, diff=28.485575s, valid=True
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:24:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:24:00.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:24:00.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:12, diff=-11.511428s, valid=True
2026-05-28T18:24:00.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:24:00.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:24:00.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:24:00.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918082.489308s, valid=True
2026-05-28T18:24:00.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:24:00.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:24:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:24:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:24:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:24:00.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:24:00.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:24:00.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:24:00.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:24:00.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:24:00.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:24:00.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:24:00.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:24:00.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:24:01.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:24:01.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:24:01.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:24:01.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:24:01.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-28T18:24:01.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-28T18:24:01.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:24:01.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:24:31.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:24:31.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:24:31.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:24:31.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:24:31.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:24:32.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:24:32.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-28T18:24:32.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:24:32.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-28T18:24:32.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:24:32.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:24:32.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:24:32.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-28T18:24:35.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:24:35.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:24:35.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:24:35.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:24:35.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:24:35.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:24:35.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:24:35.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:24:35.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:24:35.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:24:35.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:24:35.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:24:35.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:24:35.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:24:35.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:24:35.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:24:35.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:24:35.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:24:35.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:24:35.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:24:35.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:24:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:24:35.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:24:35.504 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:24:35.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:24:09
2026-05-28T18:24:35.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69688, datetime.datetime(2026, 5, 28, 18, 24, 9), datetime.datetime(2026, 5, 28, 18, 24, 8), 'salt', 9.48, 74.0, None, 12.21, 122.42, 4.4, 830.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:24:35.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:24:35.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:24:35.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:08, diff=27.615487s, valid=True
2026-05-28T18:24:35.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:24:35.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:24:35.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:12, diff=23.619464s, valid=True
2026-05-28T18:24:35.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:24:35.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:24:35.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:02, diff=33.628519s, valid=True
2026-05-28T18:24:35.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:24:35.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:24:35.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:24:35.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:24:35.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:24:35.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:24:35.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:24:12, diff=23.632877s, valid=True
2026-05-28T18:24:35.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:24:35.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:24:35.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:24:35.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918117.633825s, valid=True
2026-05-28T18:24:35.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:24:35.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:24:35.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:24:35.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:24:35.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:24:35.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:24:35.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:24:35.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:24:35.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:24:35.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:24:35.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:24:35.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:24:35.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:24:35.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:24:36.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:24:36.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:24:36.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:24:36.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:24:36.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:24:36.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:24:36.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:24:36.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:25:06.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:25:06.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:25:06.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:25:07.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:25:07.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:25:07.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:25:07.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-28T18:25:07.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:25:07.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-28T18:25:07.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:25:07.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:25:07.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:25:07.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-28T18:25:10.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-28T18:25:10.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:25:10.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:25:10.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:25:10.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:25:10.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:25:10.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:25:10.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:25:10.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:25:10.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:25:10.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:25:10.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:25:10.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:25:10.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:25:10.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:25:10.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:25:10.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:25:10.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:25:10.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:25:10.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:25:10.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:25:10.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:25:10.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:25:10.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:25:10.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:25:09
2026-05-28T18:25:10.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69690, datetime.datetime(2026, 5, 28, 18, 25, 9), datetime.datetime(2026, 5, 28, 18, 25, 9), 'salt', 9.51, 74.2, None, 10.48, 121.46, 4.36, 830.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:25:10.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:25:10.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:25:10.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:09, diff=1.636405s, valid=True
2026-05-28T18:25:10.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:25:10.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:25:10.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:12, diff=-1.360692s, valid=True
2026-05-28T18:25:10.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:25:10.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:04, diff=6.646066s, valid=True
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:25:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:25:10.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:12, diff=-1.350871s, valid=True
2026-05-28T18:25:10.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:25:10.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:25:10.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:25:10.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918152.649812s, valid=True
2026-05-28T18:25:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:25:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:25:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:25:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:25:10.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:25:10.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:25:10.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:25:10.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:25:10.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:25:10.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:25:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:25:10.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:25:11.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:25:11.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:25:11.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:25:11.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:25:11.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:25:11.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:25:11.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-28T18:25:11.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-28T18:25:11.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:25:11.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:25:41.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:25:41.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:25: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-28T18:25:42.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:25:42.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:25:42.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:25:42.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-28T18:25:42.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:25:42.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-28T18:25:42.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:25:42.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:25:42.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:25:42.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-28T18:25:45.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-28T18:25:45.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:25:45.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:25:45.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:25:45.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:25:45.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:25:45.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:25:45.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:25:45.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:25:45.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:25:45.787 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:25:45.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:25:45.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:25:45.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:25:45.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:25:45.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:25:45.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:25:46.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:25:46.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:25:46.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:25:46.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:25:46.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:25:46.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:25:46.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:25:46.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:25:39
2026-05-28T18:25:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69691, datetime.datetime(2026, 5, 28, 18, 25, 39), datetime.datetime(2026, 5, 28, 18, 25, 39), 'salt', 9.58, 74.23, None, 10.8, 120.1, 4.36, 830.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:25:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:25:46.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:25:46.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:39, diff=7.10764s, valid=True
2026-05-28T18:25:46.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:25:46.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:25:46.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:12, diff=-25.889526s, valid=True
2026-05-28T18:25:46.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:25:46.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:25:35, diff=11.117157s, valid=True
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:25:46.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:25:46.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:12, diff=-25.879848s, valid=True
2026-05-28T18:25:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:25:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:25:46.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:25:46.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918188.120811s, valid=True
2026-05-28T18:25:46.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:25:46.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:25:46.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:25:46.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:25:46.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:25:46.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:25:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:25:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:25:46.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:25:46.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:25:46.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:25:46.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:25:46.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:25:46.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:25:46.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:25:46.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:25:47.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:25:47.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:25:47.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-28T18:25:47.095 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:25:47.250 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:25:47.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:26:17.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:26:17.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:26:17.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:26:17.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:26:17.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:26:17.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:26:17.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-28T18:26:17.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:26:17.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-28T18:26:17.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:26:17.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:26:17.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:26:17.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-28T18:26:20.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-28T18:26:20.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:26:20.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:26:20.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:26:20.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:26:20.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:26:20.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:26:20.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:26:20.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:26:20.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:26:20.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:26:20.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:26:20.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:26:20.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:26:20.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:26:21.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:26:21.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:26:21.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:26:21.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:26:21.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:26:21.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:26:21.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:26:21.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:26:21.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:26:21.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:26:09
2026-05-28T18:26:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69692, datetime.datetime(2026, 5, 28, 18, 26, 9), datetime.datetime(2026, 5, 28, 18, 26, 9), 'salt', 9.51, 74.3, None, 11.01, 117.66, 4.34, 830.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:26:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:26:21.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:26:21.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:09, diff=12.164117s, valid=True
2026-05-28T18:26:21.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:26:21.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:26:21.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:12, diff=9.167421s, valid=True
2026-05-28T18:26:21.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:26:21.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:07, diff=14.174297s, valid=True
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:26:21.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:26:21.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:12, diff=9.177492s, valid=True
2026-05-28T18:26:21.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:26:21.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:26:21.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:26:21.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918223.178178s, valid=True
2026-05-28T18:26:21.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:26:21.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:26:21.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:26:21.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:26:21.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:26:21.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:26:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:26:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:26:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:26:21.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:26:21.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:26:21.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:26:21.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:26:21.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:26:21.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:26:22.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:26:22.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:26:22.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:26:22.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:26:22.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:26:22.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:26:22.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:26:52.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:26:52.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:26:52.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:26:52.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:26:52.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:26:53.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:26:53.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-28T18:26:53.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:26:53.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-28T18:26:53.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:26:53.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:26:53.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:26:53.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-28T18:26:56.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-28T18:26:56.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:26:56.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:26:56.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:26:56.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:26:56.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:26:56.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:26:56.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:26:56.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:26:56.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:26:56.058 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:26:56.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:26:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:26:56.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:26:56.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:26:56.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:26:56.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:26:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:26:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:26:56.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:26:56.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:26:56.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:26:56.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:26:56.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:26:56.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:26:40
2026-05-28T18:26:56.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69693, datetime.datetime(2026, 5, 28, 18, 26, 40), datetime.datetime(2026, 5, 28, 18, 26, 39), 'salt', 9.51, 74.3, None, 12.46, 120.36, 4.34, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:26:56.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:26:56.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:26:56.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:39, diff=17.381392s, valid=True
2026-05-28T18:26:56.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:26:56.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:26:56.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:12, diff=-15.615796s, valid=True
2026-05-28T18:26:56.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:26:56.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:26:56.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:26:38, diff=18.390891s, valid=True
2026-05-28T18:26:56.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:26:56.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:26:56.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:26:56.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:26:56.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:26:56.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:26:56.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:12, diff=-15.606107s, valid=True
2026-05-28T18:26:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:26:56.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:26:56.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:26:56.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918258.394543s, valid=True
2026-05-28T18:26:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:26:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:26:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:26:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:26:56.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:26:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:26:56.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:26:56.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:26:56.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:26:56.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:26:56.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:26:56.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:26:56.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:26:56.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:26:56.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:26:57.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:26:57.372 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:26:57.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:26:57.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-28T18:26:57.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-28T18:26:57.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:26:57.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:27:27.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:27:27.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:27:27.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:27:28.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:27:28.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:27:28.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:27:28.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-28T18:27:28.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:27:28.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:27:28.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:27:28.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:27:28.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:27:28.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-28T18:27:31.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:27:31.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:27:31.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:27:31.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:27:31.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:27:31.407 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:27:31.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:27:31.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:27:31.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:27:31.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:27:31.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:27:31.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:27:31.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:27:31.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:27:31.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:27:31.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:27:31.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:27:31.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:27:31.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:27:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:27:31.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:27:31.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:27:31.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:27:31.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:27:31.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:27:10
2026-05-28T18:27:31.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69694, datetime.datetime(2026, 5, 28, 18, 27, 10), datetime.datetime(2026, 5, 28, 18, 27, 10), 'salt', 9.55, 74.37, None, 11.5, 126.16, 4.33, 830.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:27:31.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:27:31.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:27:31.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:10, diff=21.742807s, valid=True
2026-05-28T18:27:31.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:27:31.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:27:31.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:12, diff=19.74742s, valid=True
2026-05-28T18:27:31.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:27:31.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:27:31.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:10, diff=21.758574s, valid=True
2026-05-28T18:27:31.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:27:31.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:27:31.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:27:31.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:27:31.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:27:31.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:27:31.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:12, diff=19.762671s, valid=True
2026-05-28T18:27:31.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:27:31.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:27:31.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:27:31.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918293.763335s, valid=True
2026-05-28T18:27:31.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:27:31.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:27:31.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:27:31.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:27:31.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:27:31.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:27:31.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:27:31.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:27:31.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:27:31.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:27:31.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:27:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:27:32.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:27:32.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:27:32.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:27:32.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:27:32.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:27:32.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:27:32.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-28T18:27:32.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-28T18:27:32.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:27:32.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:28:03.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:28:03.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:28:03.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:28:03.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:28:03.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:28:03.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:28:03.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-28T18:28:03.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:28:03.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-28T18:28:03.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:28:03.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:28:03.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:28:03.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:28:06.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-28T18:28:06.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:28:06.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:28:06.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:28:06.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:28:06.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:28:06.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:28:06.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:28:06.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:28:06.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:28:06.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:28:06.976 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:28:06.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:28:07.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:28:07.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:28:07.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:28:07.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:28:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:28:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:28:07.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:28:07.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:28:07.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:28:07.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:28:07.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:28:07.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:27:40
2026-05-28T18:28:07.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69695, datetime.datetime(2026, 5, 28, 18, 27, 40), datetime.datetime(2026, 5, 28, 18, 27, 40), 'salt', 9.48, 74.4, None, 10.23, 124.35, 4.32, 830.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:28:07.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:28:07.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:28:07.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:40, diff=27.292561s, valid=True
2026-05-28T18:28:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:28:07.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:28:07.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:28:12, diff=-4.704585s, valid=True
2026-05-28T18:28:07.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:28:07.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:28:07.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:27:34, diff=33.30197s, valid=True
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:28:07.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:28:07.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:28:12, diff=-4.695011s, valid=True
2026-05-28T18:28:07.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:28:07.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:28:07.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:28:07.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918329.305649s, valid=True
2026-05-28T18:28:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:28:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:28:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:28:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:28:07.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:28:07.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:28:07.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:28:07.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:28:07.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:28:07.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:28:07.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:28:07.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:28:07.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:28:07.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:28:07.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:28:08.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:28:08.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:28:08.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:28:08.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-28T18:28:08.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-28T18:28:08.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:28:08.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:28:38.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:28:38.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:28:38.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:28:38.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:28:38.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:28:38.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:28:38.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-28T18:28:38.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:28:38.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-28T18:28:39.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:28:39.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:28:39.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:28:39.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-28T18:28:42.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-28T18:28:43.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:28:43.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:28:43.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:28:43.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:28:43.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:28:43.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:28:43.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:28:43.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:28:43.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:28:43.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:28:43.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:28:43.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:28:43.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:28:43.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:28:43.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:28:43.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:28:43.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:28:43.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:28:43.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:28:43.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:28:43.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:28:43.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:28:43.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:28:43.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:28:41
2026-05-28T18:28:43.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69697, datetime.datetime(2026, 5, 28, 18, 28, 41), datetime.datetime(2026, 5, 28, 18, 28, 40), 'salt', 9.51, 74.5, None, 10.98, 127.73, 4.29, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:28:43.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:28:43.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:28:43.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:28:40, diff=3.828084s, valid=True
2026-05-28T18:28:43.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:28:43.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:28:43.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:12, diff=-28.16903s, valid=True
2026-05-28T18:28:43.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:28:43.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:28:43.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:28:35, diff=8.837637s, valid=True
2026-05-28T18:28:43.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:28:43.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:28:43.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:28:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:28:43.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:28:43.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:28:43.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:12, diff=-28.159231s, valid=True
2026-05-28T18:28:43.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:28:43.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:28:43.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:28:43.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918365.842257s, valid=True
2026-05-28T18:28:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:28:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:28:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:28:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:28:43.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:28:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:28:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:28:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:28:43.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:28:44.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:28:44.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:28:44.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:28:44.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:28:44.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:28:44.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:28:45.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:28:45.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:28:45.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:28:45.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-28T18:28:45.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-28T18:28:48.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:28:48.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:29:18.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:29:18.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:29:18.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:29:18.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:29:18.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:29:18.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:29:18.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-28T18:29:18.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:29:18.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:29:18.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:29:18.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:29:18.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:29:18.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:29: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-28T18:29:21.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:29:21.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:29:21.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:29:21.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:29:21.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:29:21.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:29:21.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:29:21.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:29:21.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:29:21.827 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:29:21.827 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:29:21.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:29:21.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:29:21.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:29:22.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:29:22.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:29:22.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:29:22.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:29:22.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:29:22.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:29:22.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:29:22.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:29:22.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:29:22.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:29:11
2026-05-28T18:29:22.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69698, datetime.datetime(2026, 5, 28, 18, 29, 11), datetime.datetime(2026, 5, 28, 18, 29, 11), 'salt', 9.55, 74.67, None, 10.48, 127.99, 4.27, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:29:22.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:29:22.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:29:22.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:11, diff=11.157633s, valid=True
2026-05-28T18:29:22.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:29:22.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:29:22.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:12, diff=10.160471s, valid=True
2026-05-28T18:29:22.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:29:22.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:05, diff=17.167085s, valid=True
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:29:22.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:29:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:12, diff=10.170084s, valid=True
2026-05-28T18:29:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:29:22.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:29:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:29:22.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918404.170764s, valid=True
2026-05-28T18:29:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:29:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:29:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:29:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:29:22.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:29:22.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:29:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:29:22.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:29:22.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:29:22.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:29:22.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:29:22.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:29:22.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:29:22.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:29:22.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:29:23.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:29:23.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:29:23.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:29:23.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-28T18:29:23.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-28T18:29:23.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:29:23.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:29:53.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:29:53.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:29:53.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:29:53.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:29:53.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:29:53.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:29:53.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:29:53.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:29:53.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-28T18:29:53.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:29:53.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:29:53.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:29:53.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-28T18:29:56.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-28T18:29:56.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:29:56.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:29:56.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:29:56.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:29:56.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:29:56.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:29:56.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:29:56.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:29:56.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:29:56.993 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:29:56.993 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:29:56.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:29:57.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:29:57.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:29:57.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:29:57.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:29:57.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:29:57.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:29:57.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:29:57.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:29:57.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:29:57.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:29:57.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:29:57.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:29:41
2026-05-28T18:29:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69699, datetime.datetime(2026, 5, 28, 18, 29, 41), datetime.datetime(2026, 5, 28, 18, 29, 41), 'salt', 9.55, 74.6, None, 10.55, 130.59, 4.28, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:29:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:29:57.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:29:57.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:41, diff=16.324379s, valid=True
2026-05-28T18:29:57.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:29:57.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:29:57.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:12, diff=-14.672766s, valid=True
2026-05-28T18:29:57.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:29:57.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:29:57.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:29:36, diff=21.333833s, valid=True
2026-05-28T18:29:57.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:29:57.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:29:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:29:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:29:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:29:57.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:29:57.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:12, diff=-14.663161s, valid=True
2026-05-28T18:29:57.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:29:57.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:29:57.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:29:57.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918439.337493s, valid=True
2026-05-28T18:29:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:29:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:29:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:29:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:29:57.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:29:57.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:29:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:29:57.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:29:57.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:29:57.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:29:57.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:29:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:29:57.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:29:57.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:29:57.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:29:58.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:29:58.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:29:58.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:29:58.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-28T18:29:58.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-28T18:29:58.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:29:58.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:30:28.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:30:28.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:30:28.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:30:29.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:30:29.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:30:29.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:30:29.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-28T18:30:29.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:30:29.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-28T18:30:29.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:30:29.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:30:29.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:30:29.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-28T18:30:32.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-28T18:30:32.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:30:32.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:30:32.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:30:32.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:30:32.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:30:32.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:30:32.340 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:30:32.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:30:32.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:30:32.340 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:30:32.340 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:30:32.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:30:32.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:30:32.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:30:32.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:30:32.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:30:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:30:32.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:30:32.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:30:32.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:30:32.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:30:32.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:30:32.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:30:32.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:30:11
2026-05-28T18:30:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69700, datetime.datetime(2026, 5, 28, 18, 30, 11), datetime.datetime(2026, 5, 28, 18, 30, 11), 'salt', 9.51, 74.57, None, 10.66, 127.4, 4.28, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:30:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:30:32.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:30:32.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:11, diff=21.66248s, valid=True
2026-05-28T18:30:32.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:30:32.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:30:32.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:12, diff=20.665382s, valid=True
2026-05-28T18:30:32.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:30:32.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:08, diff=24.67214s, valid=True
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:30:32.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:30:32.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:12, diff=20.675264s, valid=True
2026-05-28T18:30:32.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:30:32.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:30:32.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:30:32.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918474.675949s, valid=True
2026-05-28T18:30:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:30:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:30:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:30:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:30:32.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:30:32.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:30:32.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:30:32.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:30:32.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:30:32.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:30:32.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:30:32.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:30:33.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:30:33.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:30:33.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:30:33.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:30:33.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:30:33.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:30:33.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-28T18:30:33.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-28T18:30:33.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:30:33.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:31:03.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:31:03.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:31:03.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:31:04.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:31:04.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:31:04.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:31:04.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-28T18:31:04.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:31:04.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-28T18:31:04.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:31:04.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:31:04.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:31:04.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-28T18:31:08.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-28T18:31:08.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:31:08.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:31:08.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:31:08.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:31:08.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:31:08.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:31:08.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:31:08.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:31:08.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:31:08.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:31:08.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:31:08.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:31:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:31:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:31:09.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:31:09.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:31:09.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:31:09.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:31:09.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:31:09.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:31:09.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:31:09.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:31:09.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:31:09.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:30:41
2026-05-28T18:31:09.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69701, datetime.datetime(2026, 5, 28, 18, 30, 41), datetime.datetime(2026, 5, 28, 18, 30, 41), 'salt', 9.41, 74.47, None, 11.08, 130.26, 4.3, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:31:09.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:31:09.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:31:09.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:41, diff=28.17526s, valid=True
2026-05-28T18:31:09.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:31:09.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:31:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:31:12, diff=-2.821874s, valid=True
2026-05-28T18:31:09.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:31:09.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:31:09.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:30:40, diff=29.184693s, valid=True
2026-05-28T18:31:09.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:31:09.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:31:09.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:31:09.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:31:09.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:31:09.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:31:09.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:31:12, diff=-2.812324s, valid=True
2026-05-28T18:31:09.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:31:09.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:31:09.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:31:09.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918511.188336s, valid=True
2026-05-28T18:31:09.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:31:09.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:31:09.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:31:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:31:09.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:31:09.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:31:09.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:31:09.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:31:09.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:31:09.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:31:09.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:31:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:31:09.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:31:09.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:31:09.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:31:10.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:31:10.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:31:10.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:31:10.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-28T18:31:10.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-28T18:31:10.396 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:31:10.396 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:31:40.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:31:40.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:31:40.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:31:40.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:31:40.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:31:41.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:31:41.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-28T18:31:41.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:31:41.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-28T18:31:41.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:31:41.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:31:41.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:31:41.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-28T18:31:44.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-28T18:31:44.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:31:44.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:31:44.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:31:44.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:31:44.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:31:44.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:31:44.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:31:44.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:31:44.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:31:44.271 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:31:44.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:31:44.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:31:44.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:31:44.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:31:44.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:31:44.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:31:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:31:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:31:44.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:31:44.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:31:44.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:31:44.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:31:44.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:31:44.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:31:42
2026-05-28T18:31:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69703, datetime.datetime(2026, 5, 28, 18, 31, 42), datetime.datetime(2026, 5, 28, 18, 31, 41), 'salt', 9.35, 74.63, None, 10.98, 127.05, 4.27, 830.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:31:44.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:31:44.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:31:44.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:31:41, diff=3.597296s, valid=True
2026-05-28T18:31:44.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:31:44.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:31:44.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:12, diff=-27.399792s, valid=True
2026-05-28T18:31:44.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:31:44.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:31:44.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:31:36, diff=8.606917s, valid=True
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:31:44.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:31:44.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:12, diff=-27.390041s, valid=True
2026-05-28T18:31:44.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:31:44.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:31:44.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:31:44.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918546.61061s, valid=True
2026-05-28T18:31:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:31:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:31:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:31:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:31:44.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:31:44.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:31:44.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:31:44.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:31:44.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:31:44.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:31:44.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:31:44.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:31:44.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:31:45.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:31:45.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:31:45.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:31:45.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:31:45.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:31:45.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-28T18:31:45.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-28T18:31:45.825 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:31:45.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:32:15.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:32:15.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:32:15.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:32:16.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:32:16.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:32:16.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:32:16.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-28T18:32:16.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:32:16.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-28T18:32:16.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:32:16.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:32:16.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:32:16.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-28T18:32:20.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-28T18:32:20.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:32:20.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:32:20.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:32:20.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:32:20.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:32:20.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:32:20.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:32:20.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:32:20.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:32:20.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:32:20.180 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:32:20.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:32:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:32:20.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:32:20.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:32:20.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:32:20.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:32:20.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:32:20.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T18:32:20.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:32:20.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:32:20.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:32:20.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:32:20.508 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:32:12
2026-05-28T18:32:20.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69704, datetime.datetime(2026, 5, 28, 18, 32, 12), datetime.datetime(2026, 5, 28, 18, 32, 12), 'salt', 9.28, 74.87, None, 11.36, 124.92, 4.22, 830.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:32:20.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:32:20.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:32:20.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:12, diff=8.515107s, valid=True
2026-05-28T18:32:20.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:32:20.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:32:20.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:12, diff=8.517937s, valid=True
2026-05-28T18:32:20.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:32:20.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:32:20.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:07, diff=13.524639s, valid=True
2026-05-28T18:32:20.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:32:20.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:32:20.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:32:20.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:32:20.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:32:20.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T18:32:20.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:12, diff=8.527605s, valid=True
2026-05-28T18:32:20.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:32:20.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:32:20.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:32:20.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918582.528261s, valid=True
2026-05-28T18:32:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:32:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:32:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:32:20.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:32:20.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:32:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:32:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:32:20.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:32:20.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:32:20.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:32:20.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:32:20.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:32:20.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:32:20.856 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:32:21.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:32:21.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:32:21.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:32:21.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:32:21.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-28T18:32:21.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-28T18:32:21.825 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:32:21.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:32:51.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:32:51.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:32:51.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:32:52.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:32:52.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:32:52.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:32:52.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-28T18:32:52.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:32:52.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:32:52.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:32:52.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:32:52.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:32:52.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:32:55.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-28T18:32:55.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:32:55.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:32:55.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:32:55.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:32:55.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:32:55.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:32:55.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:32:55.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:32:55.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:32:55.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:32:55.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:32:55.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:32:55.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:32:55.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:32:56.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:32:56.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:32:56.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:32:56.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:32:56.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:32:56.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:32:56.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:32:56.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:32:56.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:32:56.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:32:42
2026-05-28T18:32:56.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69705, datetime.datetime(2026, 5, 28, 18, 32, 42), datetime.datetime(2026, 5, 28, 18, 32, 42), 'salt', 9.18, 74.97, None, 12.07, 126.23, 4.19, 830.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:32:56.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:32:56.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:32:56.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:42, diff=14.168025s, valid=True
2026-05-28T18:32:56.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:32:56.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:32:56.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:12, diff=-15.829081s, valid=True
2026-05-28T18:32:56.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:32:56.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:32:37, diff=19.177532s, valid=True
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:32:56.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:32:56.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:32:56.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:12, diff=-15.819289s, valid=True
2026-05-28T18:32:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:32:56.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:32:56.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:32:56.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918618.181364s, valid=True
2026-05-28T18:32:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:32:56.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:32:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:32:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:32:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:32:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:32:56.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:32:56.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:32:56.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:32:56.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:32:56.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:32:56.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:32:56.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:32:56.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:32:56.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:32:57.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:32:57.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:32:57.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:32:57.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-28T18:32:57.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-28T18:32:57.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:32:57.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:33:27.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:33:27.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:33:27.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:33:27.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:33:27.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:33:28.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:33:28.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-28T18:33:28.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:33:28.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-28T18:33:28.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:33:28.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:33:28.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:33:28.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:33:32.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:33:32.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:33:32.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:33:32.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:33:32.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:33:32.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:33:32.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:33:32.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:33:32.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:33:32.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:33:32.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:33:32.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:33:32.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:33:32.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:33:32.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:33:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:33:32.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:33:32.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:33:32.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:33:32.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T18:33:32.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:33:32.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:33:32.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:33:32.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:33:32.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:33:13
2026-05-28T18:33:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69706, datetime.datetime(2026, 5, 28, 18, 33, 13), datetime.datetime(2026, 5, 28, 18, 33, 12), 'salt', 9.12, 75.36, None, 10.87, 120.51, 4.12, 830.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:33:32.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:33:32.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:33:32.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:12, diff=20.358716s, valid=True
2026-05-28T18:33:32.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:33:32.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:33:32.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:12, diff=20.361563s, valid=True
2026-05-28T18:33:32.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:33:32.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:07, diff=25.368276s, valid=True
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:33:32.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T18:33:32.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:12, diff=20.371296s, valid=True
2026-05-28T18:33:32.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:33:32.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:33:32.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:33:32.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918654.371965s, valid=True
2026-05-28T18:33:32.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:33:32.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:33:32.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:33:32.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:33:32.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:33:32.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:33:32.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:33:32.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:33:32.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:33:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:33:32.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:33:32.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:33:32.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:33:32.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:33:32.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:33:33.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:33:33.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:33:33.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:33: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-28T18:33: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-28T18:33:33.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:33:33.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:34:03.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:34:03.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:34:03.635 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:34:03.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:34:03.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:34:04.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:34:04.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-28T18:34:04.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:34:04.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-28T18:34:04.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:34:04.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:34:04.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:34:04.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-28T18:34:07.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-28T18:34:07.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:34:07.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:34:07.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:34:07.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:34:07.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:34:07.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:34:07.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:34:07.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:34:07.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:34:07.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:34:07.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:34:07.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:34:07.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:34:07.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:34:07.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:34:07.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:34:07.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:34:07.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:34:07.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:34:07.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:34:07.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:34:07.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:34:07.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:34:07.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:33:43
2026-05-28T18:34:07.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69707, datetime.datetime(2026, 5, 28, 18, 33, 43), datetime.datetime(2026, 5, 28, 18, 33, 42), 'salt', 9.08, 75.5, None, 10.98, 124.19, 4.09, 830.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:34:07.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:34:07.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:34:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:42, diff=25.605704s, valid=True
2026-05-28T18:34:07.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:34:07.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:34:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:12, diff=-4.390902s, valid=True
2026-05-28T18:34:07.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:34:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:34:07.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:33:38, diff=29.615909s, valid=True
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:34:07.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:34:07.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:12, diff=-4.381034s, valid=True
2026-05-28T18:34:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:34:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:34:07.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:34:07.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918689.619614s, valid=True
2026-05-28T18:34:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:34:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:34:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:34:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:34:07.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:34:07.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:34:07.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:34:07.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:34:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:34:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:34:07.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:34:07.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:34:07.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:34:07.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:34:08.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:34:08.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:34:08.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:34:08.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:34:08.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-28T18:34:08.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-28T18:34:08.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:34:08.762 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:34:38.792 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:34:38.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:34:38.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:34:39.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:34:39.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:34:39.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:34:39.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-28T18:34:39.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:34:39.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-28T18:34:39.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:34:39.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:34:39.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:34:39.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-28T18:34:42.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:34:42.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:34:42.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:34:42.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:34:42.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:34:42.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:34:42.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:34:42.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:34:42.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:34:42.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:34:42.653 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:34:42.653 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:34:42.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:34:42.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T18:34:42.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:34:42.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T18:34:42.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:34:42.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:34:42.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:34:42.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T18:34:42.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:34:42.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:34:42.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:34:42.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:34:42.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:34:13
2026-05-28T18:34:42.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69708, datetime.datetime(2026, 5, 28, 18, 34, 13), datetime.datetime(2026, 5, 28, 18, 34, 13), 'salt', 9.22, 75.96, None, 11.58, 125.55, 4.01, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:34:42.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:34:42.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T18:34:42.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:13, diff=29.995906s, valid=True
2026-05-28T18:34:42.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:34:42.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:34:42.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:12, diff=30.99884s, valid=True
2026-05-28T18:34:42.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:34:42.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:09, diff=34.005533s, valid=True
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:34:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:34:43.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T18:34:43.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:34:12, diff=31.008614s, valid=True
2026-05-28T18:34:43.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:34:43.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:34:43.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:34:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918725.00927s, valid=True
2026-05-28T18:34:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:34:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:34:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:34:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:34:43.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:34:43.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:34:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:34:43.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:34:43.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:34:43.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:34:43.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:34:43.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:34:43.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:34:43.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:34:43.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:34:43.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:34:44.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:34:44.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:34:44.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-28T18:34:44.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-28T18:34:44.297 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:34:44.297 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:35:14.327 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:35:14.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:35:14.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:35:14.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:35:14.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:35:14.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:35:14.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-28T18:35:14.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:35:14.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-28T18:35:14.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:35:14.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:35:14.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:35:14.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-28T18:35:17.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-28T18:35:17.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:35:17.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:35:17.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:35:17.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:35:17.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:35:17.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:35:17.654 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:35:17.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:35:17.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:35:17.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:35:17.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:35:17.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:35:17.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:35:17.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:35:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:35:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:35:17.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:35:17.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:35:17.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T18:35:17.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:35:17.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:35:17.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:35:17.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:35:18.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:35:13
2026-05-28T18:35:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69710, datetime.datetime(2026, 5, 28, 18, 35, 13), datetime.datetime(2026, 5, 28, 18, 35, 13), 'salt', 9.15, 76.29, None, 10.66, 121.5, 3.94, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:35:18.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:35:18.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:35:18.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:13, diff=5.051464s, valid=True
2026-05-28T18:35:18.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:35:18.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:35:18.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:12, diff=6.055573s, valid=True
2026-05-28T18:35:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:35:18.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:12, diff=6.065046s, valid=True
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:35:18.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T18:35:18.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:12, diff=6.069466s, valid=True
2026-05-28T18:35:18.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:35:18.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:35:18.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:35:18.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918760.070383s, valid=True
2026-05-28T18:35:18.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:35:18.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:35:18.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:35:18.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:35:18.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:35:18.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:35:18.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:35:18.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:35:18.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:35:18.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:35:18.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:35:18.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:35:18.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:35:18.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:35:18.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:35:19.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:35:19.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:35:19.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:35:19.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-28T18:35:19.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-28T18:35:19.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:35:19.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:35:49.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:35:49.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:35:49.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:35:49.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:35:49.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:35:49.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:35:49.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:35:49.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:35:49.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-28T18:35:49.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:35:49.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:35:49.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:35: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-28T18:35:52.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-28T18:35:52.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:35:52.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:35:52.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:35:52.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:35:52.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:35:52.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:35:52.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:35:52.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:35:52.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:35:52.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:35:52.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:35:52.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:35:53.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:35:53.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:35:53.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:35:53.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:35:53.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:35:53.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:35:53.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:35:53.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:35:53.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:35:53.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:35:53.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:35:53.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:35:44
2026-05-28T18:35:53.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69711, datetime.datetime(2026, 5, 28, 18, 35, 44), datetime.datetime(2026, 5, 28, 18, 35, 43), 'salt', 9.15, 76.43, None, 10.59, 120.14, 3.92, 830.37, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:35:53.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:35:53.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:35:53.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:43, diff=10.288774s, valid=True
2026-05-28T18:35:53.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:35:53.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:35:53.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:12, diff=-18.707981s, valid=True
2026-05-28T18:35:53.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:35:53.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:35:53.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:35:44, diff=9.299833s, valid=True
2026-05-28T18:35:53.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:35:53.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:35:53.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:35:53.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:35:53.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:35:53.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:35:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:12, diff=-18.696582s, valid=True
2026-05-28T18:35:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:35:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:35:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:35:53.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918795.304241s, valid=True
2026-05-28T18:35:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:35:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:35:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:35:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:35:53.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:35:53.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:35:53.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:35:53.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:35:53.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:35:53.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:35:53.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:35:53.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:35:53.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:35:53.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:35:53.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:35:54.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:35:54.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:35:54.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:35:54.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-28T18:35:54.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-28T18:35:54.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:35:54.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:36:24.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:36:24.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:36:24.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:36:24.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:36:24.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:36:25.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:36:25.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-28T18:36:25.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:36:25.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-28T18:36:25.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:36:25.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:36:25.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:36:25.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:36:28.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-28T18:36:28.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:36:28.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:36:28.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:36:28.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:36:28.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:36:28.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:36:28.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:36:28.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:36:28.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:36:28.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:36:28.212 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:36:28.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:36:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:36:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:36:28.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:36:28.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:36:28.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:36:28.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:36:28.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:36:28.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:36:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:36:28.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:36:28.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:36:28.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:36:14
2026-05-28T18:36:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69712, datetime.datetime(2026, 5, 28, 18, 36, 14), datetime.datetime(2026, 5, 28, 18, 36, 14), 'salt', 9.35, 76.39, None, 9.56, 118.89, 3.93, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:36:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:36:28.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:36:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:14, diff=14.537607s, valid=True
2026-05-28T18:36:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:36:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:36:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:12, diff=16.540459s, valid=True
2026-05-28T18:36:28.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:36:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:09, diff=19.547119s, valid=True
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:36:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:36:28.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:12, diff=16.550132s, valid=True
2026-05-28T18:36:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:36:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:36:28.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:36:28.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918830.550789s, valid=True
2026-05-28T18:36:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:36:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:36:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:36:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:36:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:36:28.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:36:28.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:36:28.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:36:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:36:28.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:36:28.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:36:28.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:36:28.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:36:28.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:36:29.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:36:29.430 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:36:29.530 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:36:29.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:36:29.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-28T18:36:29.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-28T18:36:29.681 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:36:29.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:36:59.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:36:59.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:36:59.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:37:00.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:37:00.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:37:00.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:37:00.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-28T18:37:00.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:37:00.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-28T18:37:00.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:37:00.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:37:00.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:37:00.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:37:03.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-28T18:37:03.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:37:03.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:37:03.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:37:03.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:37:03.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:37:03.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:37:03.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:37:03.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:37:03.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:37:03.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:37:03.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:37:03.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:37:03.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:37:03.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:37:03.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:37:03.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:37:03.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:37:03.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:37:03.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:37:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:37:03.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:37:03.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:37:03.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:37:03.654 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:36:44
2026-05-28T18:37:03.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69713, datetime.datetime(2026, 5, 28, 18, 36, 44), datetime.datetime(2026, 5, 28, 18, 36, 44), 'salt', 9.32, 76.2, None, 9.18, 118.8, 3.97, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:37:03.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:37:03.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:37:03.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:44, diff=19.660605s, valid=True
2026-05-28T18:37:03.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:37:03.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:37:03.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:12, diff=-8.336466s, valid=True
2026-05-28T18:37:03.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:37:03.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:36:40, diff=23.670218s, valid=True
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:37:03.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:37:03.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:12, diff=-8.326657s, valid=True
2026-05-28T18:37:03.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:37:03.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:37:03.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:37:03.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918865.674018s, valid=True
2026-05-28T18:37:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:37:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:37:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:37:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:37:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:37:03.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:37:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:37:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:37:03.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:37:03.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:37:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:37:03.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:37:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:37:04.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:37:04.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:37:04.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:37:04.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:37:04.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:37:04.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:37:04.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:37:04.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:37:04.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:37:34.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:37:34.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:37:34.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:37:35.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:37:35.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:37:35.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:37:35.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-28T18:37:35.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:37:35.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-28T18:37:35.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:37:35.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:37:35.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:37: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-28T18:37:37.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:37:37.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:37:37.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:37:37.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:37:37.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:37:37.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:37:37.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:37:37.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:37:37.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:37:37.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:37:37.688 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:37:37.688 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:37:37.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:37:37.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:37:37.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:37:37.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:37:37.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:37:37.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:37:37.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:37:37.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:37:37.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:37:37.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:37:37.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:37:37.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:37:37.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:37:14
2026-05-28T18:37:37.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69714, datetime.datetime(2026, 5, 28, 18, 37, 14), datetime.datetime(2026, 5, 28, 18, 37, 14), 'salt', 9.25, 75.93, None, 9.88, 116.83, 4.01, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:37:37.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:37:37.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:37:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:14, diff=24.00086s, valid=True
2026-05-28T18:37:38.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:37:38.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:37:38.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:12, diff=26.003725s, valid=True
2026-05-28T18:37:38.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:37:38.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:10, diff=28.010363s, valid=True
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:37:38.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:37:38.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:12, diff=26.01342s, valid=True
2026-05-28T18:37:38.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:37:38.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:37:38.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:37:38.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918900.01419s, valid=True
2026-05-28T18:37:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:37:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:37:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:37:38.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:37:38.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:37:38.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:37:38.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:37:38.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:37:38.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:37:38.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:37:38.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:37:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:37:38.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:37:38.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:37:38.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:37:38.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:37:38.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:37:38.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:37:38.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-28T18:37:38.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-28T18:37:39.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:37:39.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:38:09.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:38:09.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:38:09.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:38:09.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:38:09.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:38:09.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:38:09.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-28T18:38:09.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:38:09.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:38:09.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:38:09.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:38:09.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:38:09.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:38:12.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-28T18:38:12.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:38:12.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:38:12.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:38:12.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:38:12.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:38:12.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:38:12.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:38:12.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:38:12.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:38:12.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:38:12.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:38:12.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:38:12.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:38:12.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:38:12.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:38:12.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:38:12.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:38:12.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:38:12.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:38:12.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:38:12.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:38:12.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:38:12.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:38:12.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:37:45
2026-05-28T18:38:12.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69715, datetime.datetime(2026, 5, 28, 18, 37, 45), datetime.datetime(2026, 5, 28, 18, 37, 44), 'salt', 9.29, 76.06, None, 9.81, 118.26, 4.0, 830.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:38:12.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:38:12.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:38:12.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:44, diff=28.589853s, valid=True
2026-05-28T18:38:12.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:38:12.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:38:12.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:38:12, diff=0.59266s, valid=True
2026-05-28T18:38:12.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:38:12.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:37:40, diff=32.599341s, valid=True
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:38:12.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:38:12.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:38:12, diff=0.602382s, valid=True
2026-05-28T18:38:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:38:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:38:12.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:38:12.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918934.603046s, valid=True
2026-05-28T18:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:38:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:38:12.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:38:12.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:38:12.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:38:12.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:38:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:38:12.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:38:12.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:38:12.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:38:12.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:38:13.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:38:13.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:38:13.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:38:13.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:38:13.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-28T18:38:13.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-28T18:38:13.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:38:13.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:38:43.883 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:38:43.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:38:43.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:38:44.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:38:44.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:38:44.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:38:44.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-28T18:38:44.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:38:44.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:38:44.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:38:44.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:38:44.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:38: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-28T18:38:46.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:38:46.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:38:46.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:38:46.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:38:46.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:38:46.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:38:46.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:38:46.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:38:46.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:38:46.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:38:46.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:38:46.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:38:46.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:38:47.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:38:47.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:38:47.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:38:47.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:38:47.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:38:47.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:38:47.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:38:47.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:38:47.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:38:47.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:38:47.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:38:47.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:38:45
2026-05-28T18:38:47.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69717, datetime.datetime(2026, 5, 28, 18, 38, 45), datetime.datetime(2026, 5, 28, 18, 38, 45), 'salt', 9.22, 76.13, None, 9.18, 124.17, 3.98, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:38:47.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:38:47.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:38:47.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:38:45, diff=2.238933s, valid=True
2026-05-28T18:38:47.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:38:47.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:38:47.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:12, diff=-24.758152s, valid=True
2026-05-28T18:38:47.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:38:47.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:38:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:38:42, diff=5.248643s, valid=True
2026-05-28T18:38:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:38:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:38:47.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:38:47.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:38:47.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:38:47.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:38:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:12, diff=-24.748285s, valid=True
2026-05-28T18:38:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:38:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:38:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:38:47.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=918969.252379s, valid=True
2026-05-28T18:38:47.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:38:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:38:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:38:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:38:47.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:38:47.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:38:47.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:38:47.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:38:47.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:38:47.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:38:47.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:38:47.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:38:47.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:38:47.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:38:47.781 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:38:48.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:38:48.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:38:48.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:38:48.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-28T18:38:48.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-28T18:38:48.459 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:38:48.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:39:18.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:39:18.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:39:18.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:39:18.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:39:18.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:39:19.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:39:19.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:39:19.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:39:19.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-28T18:39:19.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:39:19.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:39:19.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:39:19.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-28T18:39:21.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:39:21.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:39:21.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:39:21.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:39:21.661 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:39:21.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:39:21.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:39:21.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:39:21.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:39:21.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:39:21.673 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:39:21.673 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:39:21.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:39:21.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:39:21.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:39:21.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:39:21.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:39:21.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:39:21.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:39:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:39:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:39:21.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:39:21.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:39:21.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:39:21.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:39:15
2026-05-28T18:39:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69718, datetime.datetime(2026, 5, 28, 18, 39, 15), datetime.datetime(2026, 5, 28, 18, 39, 15), 'salt', 9.15, 76.23, None, 10.16, 118.62, 3.95, 830.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:39:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:39:21.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:39:21.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:15, diff=6.987907s, valid=True
2026-05-28T18:39:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:39:21.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:39:21.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:12, diff=9.990691s, valid=True
2026-05-28T18:39:21.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:39:21.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:13, diff=8.997217s, valid=True
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:39:21.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:39:22.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:12, diff=10.000241s, valid=True
2026-05-28T18:39:22.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:39:22.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:39:22.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:39:22.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919004.000894s, valid=True
2026-05-28T18:39:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:39:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:39:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:39:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:39:22.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:39:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:39:22.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:39:22.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:39:22.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:39:22.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:39:22.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:39:22.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:39:22.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:39:22.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:39:22.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:39:22.860 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:39:22.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:39:22.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:39:22.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-28T18:39:22.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-28T18:39:23.130 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:39:23.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:39:53.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:39:53.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:39:53.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:39:53.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:39:53.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:39:54.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:39:54.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-28T18:39:54.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:39:54.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-28T18:39:54.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:39:54.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:39:54.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:39:54.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-28T18:39:56.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-28T18:39:56.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:39:56.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:39:56.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:39:56.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:39:56.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:39:56.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:39:56.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:39:56.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:39:56.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:39:56.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:39:56.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:39:56.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:39:56.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:39:56.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:39:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:39:56.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:39:56.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:39:56.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:39:56.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:39:56.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:39:56.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:39:56.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:39:56.802 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:39:56.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:39:45
2026-05-28T18:39:56.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69719, datetime.datetime(2026, 5, 28, 18, 39, 45), datetime.datetime(2026, 5, 28, 18, 39, 45), 'salt', 9.12, 76.3, None, 11.26, 133.37, 3.94, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:39:56.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:39:56.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:39:56.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:45, diff=11.866943s, valid=True
2026-05-28T18:39:56.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:39:56.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:39:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:12, diff=-15.130199s, valid=True
2026-05-28T18:39:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:39:56.869 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:39:44, diff=12.876523s, valid=True
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:39:56.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:39:56.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:12, diff=-15.120445s, valid=True
2026-05-28T18:39:56.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:39:56.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:39:56.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:39:56.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919038.88022s, valid=True
2026-05-28T18:39:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:39:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:39:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:39:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:39:56.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:39:56.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:39:56.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:39:56.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:39:56.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:39:57.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:39:57.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:39:57.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:39:57.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:39:57.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:39:57.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:39:57.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:39:57.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:39:57.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:39:57.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-28T18:39:57.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-28T18:39:58.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:39:58.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:40:28.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:40:28.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:40:28.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:40:28.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:40:28.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:40:28.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:40:28.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:40:28.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:40:28.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-28T18:40:28.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:40:28.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:40:28.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:40: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-28T18:40:31.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-28T18:40:31.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:40:31.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:40:31.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:40:31.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:40:31.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:40:31.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:40:31.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:40:31.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:40:31.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:40:31.558 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:40:31.558 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:40:31.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:40:31.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:40:31.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:40:31.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:40:31.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:40:31.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:40:31.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:40:31.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:40:31.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:40:31.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:40:31.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:40:31.813 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:40:31.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:40:16
2026-05-28T18:40:31.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69720, datetime.datetime(2026, 5, 28, 18, 40, 16), datetime.datetime(2026, 5, 28, 18, 40, 15), 'salt', 9.16, 76.5, None, 9.6, 127.41, 3.91, 830.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:40:31.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:40:31.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:40:31.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:15, diff=16.87712s, valid=True
2026-05-28T18:40:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:40:31.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:40:31.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:12, diff=19.879944s, valid=True
2026-05-28T18:40:31.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:40:31.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:12, diff=19.886552s, valid=True
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:40:31.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:40:31.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:40:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:12, diff=19.889566s, valid=True
2026-05-28T18:40:31.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:40:31.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:40:31.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:40:31.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919073.890272s, valid=True
2026-05-28T18:40:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:40:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:40:31.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:40:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:40:31.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:40:31.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:40:31.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:40:31.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:40:31.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:40:32.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:40:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:40:32.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:40:32.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:40:32.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:40:32.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:40:32.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:40:32.849 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:40:32.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:40:32.850 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:40:32.850 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:40:33.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:40:33.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:41:03.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:41:03.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:41:03.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:41:03.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:41:03.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:41:03.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:41:03.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-28T18:41:03.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:41:03.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-28T18:41:03.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:41:03.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:41:03.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:41:03.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-28T18:41:05.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-28T18:41:05.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:41:05.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:41:05.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:41:05.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:41:05.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:41:05.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:41:05.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:41:05.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:41:05.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:41:05.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:41:05.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:41:05.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:41:06.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:41:06.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:41:06.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:41:06.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:41:06.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:41:06.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:41:06.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:41:06.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:41:06.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:41:06.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:41:06.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:41:06.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:40:46
2026-05-28T18:41:06.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69721, datetime.datetime(2026, 5, 28, 18, 40, 46), datetime.datetime(2026, 5, 28, 18, 40, 46), 'salt', 9.09, 76.53, None, 10.23, 132.53, 3.9, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:41:06.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:41:06.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:41:06.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:46, diff=20.297088s, valid=True
2026-05-28T18:41:06.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:41:06.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:41:06.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:12, diff=-5.700033s, valid=True
2026-05-28T18:41:06.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:41:06.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:40:42, diff=24.30658s, valid=True
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:41:06.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:41:06.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:41:06.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:12, diff=-5.690355s, valid=True
2026-05-28T18:41:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:41:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:41:06.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:41:06.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919108.310302s, valid=True
2026-05-28T18:41:06.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:41:06.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:41:06.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:41:06.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:41:06.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:41:06.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:41:06.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:41:06.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:41:06.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:41:06.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:41:06.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:41:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:41:06.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:41:06.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:41:06.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:41:07.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:41:07.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:41:07.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:41:07.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-28T18:41:07.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-28T18:41:07.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:41:07.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:41:37.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:41:37.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:41:37.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:41:37.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:41:37.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:41:38.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:41:38.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-28T18:41:38.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:41:38.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-28T18:41:38.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:41:38.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:41:38.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:41:38.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-28T18:41:40.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-28T18:41:40.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:41:40.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:41:40.863 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:41:40.863 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:41:40.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:41:40.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:41:40.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:41:40.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:41:40.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:41:40.883 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:41:40.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:41:40.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:41:40.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:41:40.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:41:41.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:41:41.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:41:41.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:41:41.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:41:41.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:41:41.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:41:41.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:41:41.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:41:41.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:41:41.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:41:16
2026-05-28T18:41:41.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69722, datetime.datetime(2026, 5, 28, 18, 41, 16), datetime.datetime(2026, 5, 28, 18, 41, 16), 'salt', 9.09, 76.53, None, 10.94, 132.15, 3.9, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:41:41.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:41:41.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:41:41.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:16, diff=25.207054s, valid=True
2026-05-28T18:41:41.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:41:41.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:41:41.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:12, diff=29.210978s, valid=True
2026-05-28T18:41:41.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:41:41.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:12, diff=29.220377s, valid=True
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:41:41.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:41:41.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:12, diff=29.223485s, valid=True
2026-05-28T18:41:41.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:41:41.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:41:41.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:41:41.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919143.224169s, valid=True
2026-05-28T18:41:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:41:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:41:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:41:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:41:41.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:41:41.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:41:41.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:41:41.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:41:41.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:41:41.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:41:41.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:41:41.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:41:41.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:41:41.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:41:41.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:41:42.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:41:42.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:41:42.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:41:42.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-28T18:41:42.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-28T18:41:42.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:41:42.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:42:12.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:42:12.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:42:12.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:42:12.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:42:12.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:42:13.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:42:13.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:42:13.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:42:13.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-28T18:42:13.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:42:13.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:42:13.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:42:13.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-28T18:42:15.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-28T18:42:15.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:42:15.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:42:15.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:42:15.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:42:15.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:42:15.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:42:15.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:42:15.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:42:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:42:15.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:42:15.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:42:15.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:42:15.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:42:15.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:42:15.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:42:15.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:42:15.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:42:15.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:42:16.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:42:16.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:42:16.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:42:16.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:42:16.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:42:16.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:41:46
2026-05-28T18:42:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69723, datetime.datetime(2026, 5, 28, 18, 41, 46), datetime.datetime(2026, 5, 28, 18, 41, 46), 'salt', 9.06, 76.76, None, 10.59, 131.08, 3.86, 830.45, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:42:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:42:16.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:42:16.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:46, diff=30.072383s, valid=True
2026-05-28T18:42:16.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:42:16.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:42:16.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:42:12, diff=4.075439s, valid=True
2026-05-28T18:42:16.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:42:16.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:41:43, diff=33.082194s, valid=True
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:42:16.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:42:16.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:42:12, diff=4.085324s, valid=True
2026-05-28T18:42:16.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:42:16.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:42:16.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:42:16.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919178.086062s, valid=True
2026-05-28T18:42:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:42:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:42:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:42:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:42:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:42:16.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:42:16.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:42:16.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:42:16.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:42:16.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:42:16.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:42:16.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:42:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:42:16.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:42:16.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:42:17.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:42:17.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:42:17.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:42:17.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-28T18:42:17.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-28T18:42:17.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:42:17.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:42:47.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:42:47.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:42:47.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:42:47.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:42:47.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:42:47.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:42:47.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-28T18:42:47.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:42:47.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-28T18:42:47.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:42:47.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:42:47.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:42:47.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-28T18:42:50.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-28T18:42:50.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:42:50.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:42:50.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:42:50.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:42:50.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:42:50.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:42:50.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:42:50.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:42:50.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:42:50.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:42:50.457 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:42:50.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:42:50.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:42:50.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:42:50.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:42:50.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:42:50.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:42:50.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:42:50.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:42:50.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:42:50.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:42:50.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:42:50.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:42:50.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:42:47
2026-05-28T18:42:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69725, datetime.datetime(2026, 5, 28, 18, 42, 47), datetime.datetime(2026, 5, 28, 18, 42, 46), 'salt', 8.92, 77.06, None, 10.91, 135.18, 3.79, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:42:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:42:50.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:42:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:42:46, diff=4.77621s, valid=True
2026-05-28T18:42:50.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:42:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:42:50.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:12, diff=-21.220951s, valid=True
2026-05-28T18:42:50.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:42:50.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:42:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:42:43, diff=7.785645s, valid=True
2026-05-28T18:42:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:42:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:42:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:42:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:42:50.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:42:50.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:42:50.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:12, diff=-21.211343s, valid=True
2026-05-28T18:42:50.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:42:50.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:42:50.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:42:50.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919212.789309s, valid=True
2026-05-28T18:42:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:42:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:42:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:42:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:42:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:42:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:42:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:42:50.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:42:50.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:42:50.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:42:50.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:42:51.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:42:51.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:42:51.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:42:51.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:42:51.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:42:51.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:42:51.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:42:51.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-28T18:42:51.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-28T18:42:51.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:42:51.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:43:21.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:43:21.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:43:21.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:43:22.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:43:22.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:43:22.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:43:22.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:43:22.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:43: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-28T18:43:22.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:43:22.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:43:22.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:43:22.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-28T18:43:24.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-28T18:43:24.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:43:24.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:43:24.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:43:24.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:43:24.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:43:24.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:43:24.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:43:24.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:43:24.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:43:24.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:43:24.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:43:24.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:43:25.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:43:25.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:43:25.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:43:25.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:43:25.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:43:25.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:43:25.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:43:25.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:43:25.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:43:25.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:43:25.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:43:25.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:43:17
2026-05-28T18:43:25.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69726, datetime.datetime(2026, 5, 28, 18, 43, 17), datetime.datetime(2026, 5, 28, 18, 43, 17), 'salt', 8.96, 77.16, None, 12.35, 133.73, 3.78, 830.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:43:25.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:43:25.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:43:25.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:17, diff=8.263411s, valid=True
2026-05-28T18:43:25.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:43:25.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:43:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:12, diff=13.266322s, valid=True
2026-05-28T18:43:25.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:43:25.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:15, diff=10.273367s, valid=True
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:43:25.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:43:25.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:12, diff=13.276518s, valid=True
2026-05-28T18:43:25.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:43:25.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:43:25.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:43:25.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919247.277214s, valid=True
2026-05-28T18:43:25.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:43:25.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:43:25.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:43:25.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:43:25.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:43:25.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:43:25.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:43:25.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:43:25.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:43:25.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:43:25.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:43:25.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:43:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:43:25.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:43:25.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:43:26.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:43:26.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:43:26.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:43:26.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-28T18:43:26.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-28T18:43:26.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:43:26.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:43:56.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:43:56.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:43: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-28T18:43:56.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:43:56.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:43:56.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:43:56.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-28T18:43:56.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:43:56.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-28T18:43:56.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:43:56.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:43:56.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:43:56.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-28T18:43:59.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-28T18:43:59.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:43:59.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:43:59.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:43:59.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:43:59.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:43:59.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:43:59.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:43:59.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:43:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:43:59.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:43:59.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:43:59.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:43:59.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:43:59.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:43:59.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:43:59.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:43:59.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:43:59.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:43:59.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:43:59.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:43:59.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:43:59.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:43:59.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:43:59.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:43:47
2026-05-28T18:43:59.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69727, datetime.datetime(2026, 5, 28, 18, 43, 47), datetime.datetime(2026, 5, 28, 18, 43, 47), 'salt', 8.86, 77.3, None, 10.98, 133.17, 3.75, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:43:59.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:43:59.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:43:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:47, diff=12.839244s, valid=True
2026-05-28T18:43:59.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:43:59.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:43:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:12, diff=-12.157346s, valid=True
2026-05-28T18:43:59.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:43:59.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:43:46, diff=13.850154s, valid=True
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:43:59.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:43:59.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:12, diff=-12.146157s, valid=True
2026-05-28T18:43:59.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:43:59.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:43:59.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:43:59.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919281.854547s, valid=True
2026-05-28T18:43:59.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:43:59.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:43:59.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:43:59.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:43:59.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:43:59.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:43:59.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:43:59.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:43:59.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:43:59.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:44:00.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:44:00.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:44:00.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:44:00.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:44:00.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:44:00.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:44:00.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:44:00.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:44:00.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-28T18:44:00.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-28T18:44:01.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:44:01.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:44:31.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:44:31.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:44:31.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:44:31.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:44:31.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:44:31.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:44: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-28T18:44:31.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:44:31.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-28T18:44:31.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:44:31.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:44:31.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:44:31.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-28T18:44:34.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-28T18:44:34.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:44:34.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:44:34.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:44:34.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:44:34.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:44:34.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:44:34.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:44:34.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:44:34.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:44:34.334 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:44:34.334 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:44:34.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:44:34.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:44:34.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:44:34.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:44:34.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:44:34.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:44:34.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:44:34.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:44:34.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:44:34.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:44:34.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:44:34.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:44:34.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:44:17
2026-05-28T18:44:34.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69728, datetime.datetime(2026, 5, 28, 18, 44, 17), datetime.datetime(2026, 5, 28, 18, 44, 17), 'salt', 8.89, 77.46, None, 11.75, 132.49, 3.72, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:44:34.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:44:34.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:44:34.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:17, diff=17.649674s, valid=True
2026-05-28T18:44:34.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:44:34.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:44:34.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:12, diff=22.652584s, valid=True
2026-05-28T18:44:34.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:44:34.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:14, diff=20.659265s, valid=True
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:44:34.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:44:34.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:12, diff=22.662304s, valid=True
2026-05-28T18:44:34.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:44:34.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:44:34.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:44:34.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919316.662978s, valid=True
2026-05-28T18:44:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:44:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:44:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:44:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:44:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:44:34.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:44:34.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:44:34.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:44:34.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:44:34.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:44:34.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:44:34.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:44:34.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:44:34.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:44:35.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:44:35.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:44:35.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:44:35.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:44:35.640 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:44:35.640 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:44:35.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:44:35.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:45:05.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:45:05.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:45:05.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:45:05.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:45:05.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:45:06.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:45:06.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-28T18:45:06.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:45:06.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-28T18:45:06.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:45:06.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:45:06.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:45:06.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-28T18:45:08.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-28T18:45:08.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:45:08.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:45:08.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:45:08.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:45:08.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:45:08.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:45:08.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:45:08.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:45:08.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:45:08.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:45:08.537 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:45:08.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:45:08.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:45:08.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:45:08.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:45:08.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:45:08.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:45:08.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:45:08.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:45:08.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:45:08.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:45:08.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:45:08.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:45:08.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:44:48
2026-05-28T18:45:08.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69729, datetime.datetime(2026, 5, 28, 18, 44, 48), datetime.datetime(2026, 5, 28, 18, 44, 47), 'salt', 8.86, 77.66, None, 11.61, 134.95, 3.68, 830.51, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:45:08.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:45:08.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:45:08.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:47, diff=21.891544s, valid=True
2026-05-28T18:45:08.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:45:08.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:45:08.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:12, diff=-3.10555s, valid=True
2026-05-28T18:45:08.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:45:08.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:45:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:44:44, diff=24.90089s, valid=True
2026-05-28T18:45:08.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:45:08.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:45:08.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:45:08.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:45:08.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:45:08.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:45:08.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:12, diff=-3.096068s, valid=True
2026-05-28T18:45:08.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:45:08.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:45:08.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:45:08.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919350.90457s, valid=True
2026-05-28T18:45:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:45:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:45:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:45:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:45:08.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:45:08.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:45:08.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:45:08.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:45:08.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:45:09.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:45:09.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:45:09.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:45:09.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:45:09.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:45:09.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:45:09.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:45:09.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:45:09.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:45:09.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-28T18:45:09.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-28T18:45:10.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:45:10.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:45:40.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:45:40.868 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:45:40.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:45:41.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:45:41.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:45:41.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:45:41.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-28T18:45:41.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:45:41.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-28T18:45:41.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:45:41.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:45:41.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:45:41.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-28T18:45:44.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-28T18:45:44.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:45:44.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:45:44.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:45:44.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:45:44.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:45:44.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:45:44.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:45:44.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:45:44.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:45:44.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:45:44.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:45:44.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:45:44.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:45:44.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:45:44.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:45:44.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:45:44.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:45:44.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:45:44.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:45:44.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:45:44.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:45:44.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:45:44.558 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:45:44.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:45:18
2026-05-28T18:45:44.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69730, datetime.datetime(2026, 5, 28, 18, 45, 18), datetime.datetime(2026, 5, 28, 18, 45, 18), 'salt', 8.79, 77.83, None, 11.89, 138.54, 3.64, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:45:44.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:45:44.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:45:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:18, diff=26.621662s, valid=True
2026-05-28T18:45:44.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:45:44.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:45:44.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:12, diff=32.62452s, valid=True
2026-05-28T18:45:44.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:45:44.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:15, diff=29.631131s, valid=True
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:45:44.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:45:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:45:12, diff=32.634144s, valid=True
2026-05-28T18:45:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:45:44.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:45:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:45:44.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919386.634803s, valid=True
2026-05-28T18:45:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:45:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:45:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:45:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:45:44.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:45:44.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:45:44.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:45:44.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:45:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:45:44.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:45:44.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:45:44.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:45:44.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:45:44.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:45:45.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:45:45.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:45:45.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:45:45.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:45: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-28T18:45: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-28T18:45:45.691 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:45:45.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:46:15.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:46:15.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:46:15.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:46:16.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:46:16.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:46:16.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:46:16.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-28T18:46:16.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:46:16.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-28T18:46:16.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:46:16.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:46:16.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:46:16.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-28T18:46:18.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-28T18:46:18.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:46:18.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:46:18.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:46:18.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:46:18.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:46:19.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:46:19.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:46:19.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:46:19.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:46:19.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:46:19.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:46:19.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:46:19.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:46:19.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:46:19.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:46:19.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:46:19.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:46:19.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:46:19.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:46:19.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:46:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:46:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:46:19.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:46:19.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:46:18
2026-05-28T18:46:19.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69732, datetime.datetime(2026, 5, 28, 18, 46, 18), datetime.datetime(2026, 5, 28, 18, 46, 18), 'salt', 8.86, 78.33, None, 11.61, 137.53, 3.56, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:46:19.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:46:19.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:46:19.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:18, diff=1.324283s, valid=True
2026-05-28T18:46:19.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:46:19.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:46:19.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:12, diff=7.327142s, valid=True
2026-05-28T18:46:19.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:46:19.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:46:19.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:15, diff=4.333753s, valid=True
2026-05-28T18:46:19.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:46:19.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:46:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:46:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:46:19.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:46:19.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:46:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:12, diff=7.336808s, valid=True
2026-05-28T18:46:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:46:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:46:19.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:46:19.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919421.337472s, valid=True
2026-05-28T18:46:19.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:46:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:46:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:46:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:46:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:46:19.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:46:19.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:46:19.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:46:19.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:46:19.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:46:19.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:46:19.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:46:19.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:46:19.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:46:19.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:46:20.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:46:20.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:46:20.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:46:20.401 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:46:20.401 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:46:20.571 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:46:20.571 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:46:50.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:46:50.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:46:50.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:46:51.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:46:51.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:46:51.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:46:51.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:46:51.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:46:51.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-28T18:46:51.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:46:51.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:46:51.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:46:51.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-28T18:46:53.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-28T18:46:53.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:46:53.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:46:53.818 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:46:53.818 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:46:53.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:46:53.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:46:53.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:46:53.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:46:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:46:53.836 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:46:53.836 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:46:53.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:46:53.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:46:53.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:46:54.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:46:54.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:46:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:46:54.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:46:54.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:46:54.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:46:54.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:46:54.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:46:54.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:46:54.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:46:49
2026-05-28T18:46:54.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69733, datetime.datetime(2026, 5, 28, 18, 46, 49), datetime.datetime(2026, 5, 28, 18, 46, 48), 'salt', 8.86, 78.39, None, 11.33, 139.83, 3.54, 830.58, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:46:54.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:46:54.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:46:54.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:48, diff=6.160954s, valid=True
2026-05-28T18:46:54.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:46:54.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:46:54.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:12, diff=-17.833576s, valid=True
2026-05-28T18:46:54.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:46:54.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:46:46, diff=8.17323s, valid=True
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:46:54.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:46:54.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:12, diff=-17.823704s, valid=True
2026-05-28T18:46:54.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:46:54.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:46:54.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:46:54.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919456.176983s, valid=True
2026-05-28T18:46:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:46:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:46:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:46:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:46:54.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:46:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:46:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:46:54.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:46:54.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:46:54.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:46:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:46:54.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:46:54.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:46:54.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:46:54.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:46:55.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:46:55.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:46:55.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:46:55.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-28T18:46:55.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-28T18:46:55.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:46:55.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:47:25.251 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:47:25.251 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:47:25.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:47:25.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:47:25.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:47:25.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:47:25.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-28T18:47:25.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:47:25.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-28T18:47:25.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:47:25.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:47:25.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:47:25.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-28T18:47:28.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-28T18:47:28.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:47:28.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:47:28.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:47:28.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:47:28.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:47:28.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:47:28.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:47:28.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:47:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:47:28.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:47:28.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:47:28.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:47:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:47:28.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:47:28.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:47:28.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:47:28.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:47:28.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:47:28.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:47:28.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:47:28.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:47:28.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:47:28.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:47:28.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:47:19
2026-05-28T18:47:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69734, datetime.datetime(2026, 5, 28, 18, 47, 19), datetime.datetime(2026, 5, 28, 18, 47, 19), 'salt', 8.73, 78.43, None, 12.28, 135.02, 3.54, 830.7, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:47:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:47:28.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:47:28.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:19, diff=9.914077s, valid=True
2026-05-28T18:47:28.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:47:28.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:47:28.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:12, diff=16.916891s, valid=True
2026-05-28T18:47:28.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:47:28.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:47:28.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:16, diff=12.924898s, valid=True
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:47:28.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:47:28.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:12, diff=16.92974s, valid=True
2026-05-28T18:47:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:47:28.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:47:28.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:47:28.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919490.930882s, valid=True
2026-05-28T18:47:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:47:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:47:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:47:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:47:28.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:47:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:47:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:47:28.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:47:29.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:47:29.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:47:29.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:47:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:47:29.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:47:29.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:47:29.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:47:29.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:47:30.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:47:30.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:47:30.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-28T18:47:30.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-28T18:47:30.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:47:30.238 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:48:00.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:48:00.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:48:00.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:48:00.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:48:00.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:48:01.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:48:01.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-28T18:48:01.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:48:01.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:48:01.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:48:01.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:48:01.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:48:01.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-28T18:48:04.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-28T18:48:04.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:48:04.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:48:04.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:48:04.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:48:04.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:48:04.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:48:04.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:48:04.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:48:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:48:04.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:48:04.144 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:48:04.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:48:04.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:48:04.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:48:04.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:48:04.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:48:04.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:48:04.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:48:04.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:48:04.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:48:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:48:04.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:48:04.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:48:04.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:47:50
2026-05-28T18:48:04.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69735, datetime.datetime(2026, 5, 28, 18, 47, 50), datetime.datetime(2026, 5, 28, 18, 47, 50), 'salt', 8.63, 78.66, None, 10.8, 141.19, 3.49, 830.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:48:04.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:48:04.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:48:04.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:50, diff=14.479864s, valid=True
2026-05-28T18:48:04.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:48:04.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:48:04.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:12, diff=-7.517067s, valid=True
2026-05-28T18:48:04.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:48:04.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:48:04.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:47:47, diff=17.489655s, valid=True
2026-05-28T18:48:04.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:48:04.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:48:04.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:48:04.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:48:04.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:48:04.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:48:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:12, diff=-7.507256s, valid=True
2026-05-28T18:48:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:48:04.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:48:04.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:48:04.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919526.4934s, valid=True
2026-05-28T18:48:04.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:48:04.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:48:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:48:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:48:04.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:48:04.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:48:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:48:04.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:48:04.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:48:04.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:48:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:48:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:48:04.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:48:04.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:48:05.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:48:05.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:48:05.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:48:05.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:48:05.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-28T18:48:05.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-28T18:48:05.650 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:48:05.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:48:35.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:48:35.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:48:35.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:48:36.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:48:36.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:48:36.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:48:36.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:48:36.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:48:36.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-28T18:48:36.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:48:36.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:48:36.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:48:36.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-28T18:48:38.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-28T18:48:38.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:48:38.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:48:38.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:48:38.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:48:38.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:48:38.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:48:38.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:48:38.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:48:38.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:48:38.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:48:38.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:48:38.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:48:38.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:48:38.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:48:39.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:48:39.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:48:39.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:48:39.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:48:39.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:48:39.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:48:39.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:48:39.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:48:39.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:48:39.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:48:20
2026-05-28T18:48:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69736, datetime.datetime(2026, 5, 28, 18, 48, 20), datetime.datetime(2026, 5, 28, 18, 48, 20), 'salt', 8.7, 78.86, None, 10.62, 142.72, 3.46, 830.64, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:48:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:48:39.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:48:39.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:20, diff=19.208145s, valid=True
2026-05-28T18:48:39.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:48:39.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:48:39.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:12, diff=27.211019s, valid=True
2026-05-28T18:48:39.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:48:39.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:48:39.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:19, diff=20.217599s, valid=True
2026-05-28T18:48:39.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:48:39.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:48:39.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:48:39.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:48:39.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:48:39.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:48:39.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:12, diff=27.220697s, valid=True
2026-05-28T18:48:39.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:48:39.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:48:39.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:48:39.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919561.221344s, valid=True
2026-05-28T18:48:39.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:48:39.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:48:39.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:48:39.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:48:39.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:48:39.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:48:39.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:48:39.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:48:39.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:48:39.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:48:39.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:48:39.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:48:39.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:48:39.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:48:39.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:48:40.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:48:40.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:48:40.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:48: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-28T18:48: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-28T18:48:40.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:48:40.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:49:10.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:49:10.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:49:10.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:49:10.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:49:10.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:49:10.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:49: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-28T18:49:10.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:49:10.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-28T18:49:10.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:49:10.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:49:10.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:49:10.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-28T18:49:13.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-28T18:49:13.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:49:13.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:49:13.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:49:13.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:49:13.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:49:13.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:49:13.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:49:13.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:49:13.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:49:13.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:49:13.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:49:13.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:49:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:49:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:49:13.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:49:13.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:49:13.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:49:13.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:49:13.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:49:13.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:49:13.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:49:13.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:49:13.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:49:13.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:48:50
2026-05-28T18:49:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69737, datetime.datetime(2026, 5, 28, 18, 48, 50), datetime.datetime(2026, 5, 28, 18, 48, 50), 'salt', 8.73, 78.96, None, 13.02, 145.98, 3.44, 830.71, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:49:13.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:49:13.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:49:13.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:50, diff=23.992547s, valid=True
2026-05-28T18:49:13.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:49:13.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:49:13.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:12, diff=1.995383s, valid=True
2026-05-28T18:49:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:49:13.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:49:14.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:48:50, diff=24.001963s, valid=True
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:49:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:49:14.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:12, diff=2.004978s, valid=True
2026-05-28T18:49:14.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:49:14.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:49:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:49:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919596.00565s, valid=True
2026-05-28T18:49:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:49:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:49:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:49:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:49:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:49:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:49:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:49:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:49:14.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:49:14.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:49:14.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:49:14.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:49:14.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:49:14.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:49:14.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:49:14.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:49:14.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:49:14.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:49:14.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-28T18:49:14.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-28T18:49:15.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:49:15.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:49:45.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:49:45.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:49:45.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:49:45.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:49:45.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:49:45.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:49:45.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-28T18:49:45.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:49: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-28T18:49:45.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:49:45.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:49:45.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:49:45.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-28T18:49:48.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-28T18:49:48.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:49:48.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:49:48.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:49:48.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:49:48.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:49:48.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:49:48.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:49:48.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:49:48.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:49:48.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:49:48.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:49:48.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:49:48.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:49:48.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:49:48.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:49:48.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:49:48.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:49:48.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:49:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:49:48.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:49:48.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:49:48.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:49:48.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:49:48.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:49:21
2026-05-28T18:49:48.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69738, datetime.datetime(2026, 5, 28, 18, 49, 21), datetime.datetime(2026, 5, 28, 18, 49, 20), 'salt', 8.6, 78.96, None, 11.75, 138.78, 3.44, 830.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:49:48.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:49:48.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:49:48.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:20, diff=28.680309s, valid=True
2026-05-28T18:49:48.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:49:48.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:49:48.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:12, diff=36.683167s, valid=True
2026-05-28T18:49:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:49:48.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:17, diff=31.69012s, valid=True
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:49:48.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:49:48.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:49:12, diff=36.693147s, valid=True
2026-05-28T18:49:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:49:48.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:49:48.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:49:48.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919630.693814s, valid=True
2026-05-28T18:49:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:49:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:49:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:49:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:49:48.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:49:48.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:49:48.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:49:48.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:49:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:49:48.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:49:48.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:49:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:49:49.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:49:49.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:49:49.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:49:49.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:49:49.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:49:49.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:49:49.803 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:49:49.803 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:49:50.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:49:50.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:50:20.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:50:20.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:50:20.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:50:20.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:50:20.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:50:20.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:50:20.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-28T18:50:20.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:50:20.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-28T18:50:20.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:50:20.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:50:20.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:50:20.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-28T18:50:22.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-28T18:50:24.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:50:24.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:50:24.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:50:24.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:50:24.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:50:24.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:50:24.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:50:24.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:50:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:50:24.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:50:24.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:50:24.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:50:24.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:50:24.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:50:24.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:50:24.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:50:24.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:50:24.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:50:24.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:50:24.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:50:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:50:24.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:50:24.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:50:24.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:50:21
2026-05-28T18:50:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69740, datetime.datetime(2026, 5, 28, 18, 50, 21), datetime.datetime(2026, 5, 28, 18, 50, 21), 'salt', 8.66, 78.29, None, 10.76, 152.32, 3.55, 830.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:50:24.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:50:24.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:50:24.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:21, diff=3.783087s, valid=True
2026-05-28T18:50:24.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:50:24.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:50:24.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:12, diff=12.785979s, valid=True
2026-05-28T18:50:24.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:50:24.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:18, diff=6.792585s, valid=True
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:50:24.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:50:24.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:50:24.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:12, diff=12.795595s, valid=True
2026-05-28T18:50:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:50:24.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:50:24.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:50:24.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919666.79625s, valid=True
2026-05-28T18:50:24.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:50:24.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:50:24.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:50:24.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:50:24.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:50:24.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:50:24.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:50:24.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:50:24.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:50:24.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:50:24.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:50:25.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:50:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:50:25.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:50:25.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:50:25.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:50:25.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:50:25.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:50:25.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-28T18:50:25.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-28T18:50:25.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:50:25.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:50:55.880 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:50:55.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:50:55.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:50:55.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:50:55.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:50:56.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:50:56.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-28T18:50:56.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:50:56.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-28T18:50:56.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:50:56.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:50:56.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:50:56.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-28T18:50:58.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-28T18:50:58.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:50:58.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:50:58.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:50:58.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:50:58.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:50:58.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:50:58.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:50:58.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:50:58.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:50:58.756 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:50:58.756 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:50:58.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:50:58.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:50:58.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:50:58.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:50:58.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:50:58.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:50:58.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:50:59.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:50:59.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:50:59.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:50:59.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:50:59.009 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:50:59.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:50:51
2026-05-28T18:50:59.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69741, datetime.datetime(2026, 5, 28, 18, 50, 51), datetime.datetime(2026, 5, 28, 18, 50, 51), 'salt', 8.63, 76.97, None, 12.39, 148.03, 3.8, 830.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:50:59.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:50:59.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:50:59.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:51, diff=8.070809s, valid=True
2026-05-28T18:50:59.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:50:59.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:50:59.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:12, diff=-12.92634s, valid=True
2026-05-28T18:50:59.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:50:59.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:50:48, diff=11.08125s, valid=True
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:50:59.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:50:59.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:12, diff=-12.915241s, valid=True
2026-05-28T18:50:59.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:50:59.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:50:59.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:50:59.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919701.085485s, valid=True
2026-05-28T18:50:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:50:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:50:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:50:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:50:59.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:50:59.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:50:59.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:50:59.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:50:59.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:50:59.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:50:59.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:50:59.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:50:59.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:50:59.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:50:59.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:51:00.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:51:00.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:51:00.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:51:00.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-28T18:51:00.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-28T18:51:00.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:51:00.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:51:30.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:51:30.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:51:30.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:51:30.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:51:30.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:51:30.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:51:30.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-28T18:51:30.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:51:30.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-28T18:51:30.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:51:30.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:51:30.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:51:30.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-28T18:51:33.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-28T18:51:33.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:51:33.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:51:33.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:51:33.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:51:33.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:51:33.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:51:33.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:51:33.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:51:33.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:51:33.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:51:33.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:51:33.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:51:33.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:51:33.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:51:33.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:51:33.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:51:33.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:51:33.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:51:33.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:51:33.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:51:33.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:51:33.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:51:33.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:51:33.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:51:22
2026-05-28T18:51:33.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69742, datetime.datetime(2026, 5, 28, 18, 51, 22), datetime.datetime(2026, 5, 28, 18, 51, 22), 'salt', 8.73, 76.01, None, 12.95, 149.01, 3.98, 830.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:51:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:51:33.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:51:33.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:22, diff=11.575018s, valid=True
2026-05-28T18:51:33.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:51:33.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:51:33.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:12, diff=21.577895s, valid=True
2026-05-28T18:51:33.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:51:33.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:51:33.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:18, diff=15.584611s, valid=True
2026-05-28T18:51:33.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:51:33.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:51:33.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:51:33.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:51:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:51:33.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:51:33.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:12, diff=21.587644s, valid=True
2026-05-28T18:51:33.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:51:33.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:51:33.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:51:33.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919735.588293s, valid=True
2026-05-28T18:51:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:51:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:51:33.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:51:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:51:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:51:33.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:51:33.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:51:33.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:51:33.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:51:33.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:51:33.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:51:33.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:51:33.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:51:33.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:51:34.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:51:34.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:51:34.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:51:34.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:51:34.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-28T18:51:34.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-28T18:51:34.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:51:34.889 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:52:04.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:52:04.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:52:04.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:52:05.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:52:05.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:52:05.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:52:05.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-28T18:52:05.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:52:05.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-28T18:52:05.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:52:05.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:52:05.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:52:05.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-28T18:52:07.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-28T18:52:07.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:52:07.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:52:07.972 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:52:07.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:52:07.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:52:07.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:52:07.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:52:07.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:52:07.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:52:07.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:52:07.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:52:07.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:52:08.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:52:08.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:52:08.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:52:08.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:52:08.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:52:08.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:52:08.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:52:08.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:52:08.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:52:08.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:52:08.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:52:08.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:51:53
2026-05-28T18:52:08.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69743, datetime.datetime(2026, 5, 28, 18, 51, 53), datetime.datetime(2026, 5, 28, 18, 51, 52), 'salt', 8.9, 74.05, None, 12.6, 142.28, 4.37, 830.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:52:08.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:52:08.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:52:08.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:52, diff=16.319346s, valid=True
2026-05-28T18:52:08.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:52:08.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:52:08.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:12, diff=-3.6778s, valid=True
2026-05-28T18:52:08.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:52:08.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:52:08.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:51:49, diff=19.328827s, valid=True
2026-05-28T18:52:08.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:52:08.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:52:08.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:52:08.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:52:08.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:52:08.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:52:08.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:12, diff=-3.668154s, valid=True
2026-05-28T18:52:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:52:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:52:08.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:52:08.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919770.332512s, valid=True
2026-05-28T18:52:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:52:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:52:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:52:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:52:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:52:08.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:52:08.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:52:08.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:52:08.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:52:08.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:52:08.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:52:08.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:52:08.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:52:08.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:52:08.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:52:09.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:52:09.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:52:09.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:52:09.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-28T18:52:09.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-28T18:52:09.554 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:52:09.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:52:39.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:52:39.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:52:39.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:52:40.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:52:40.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:52:40.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:52:40.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-28T18:52:40.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:52:40.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-28T18:52:40.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:52:40.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:52:40.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:52:40.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-28T18:52:42.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-28T18:52:42.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:52:42.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:52:42.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:52:42.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:52:42.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:52:42.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:52:42.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:52:42.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:52:42.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:52:42.778 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:52:42.778 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:52:42.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:52:42.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:52:42.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:52:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:52:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:52:42.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:52:42.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:52:43.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:52:43.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:52:43.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:52:43.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:52:43.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:52:43.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:52:23
2026-05-28T18:52:43.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69744, datetime.datetime(2026, 5, 28, 18, 52, 23), datetime.datetime(2026, 5, 28, 18, 52, 22), 'salt', 9.0, 73.32, None, 13.73, 150.28, 4.51, 830.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:52:43.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:52:43.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:52:43.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:22, diff=21.094039s, valid=True
2026-05-28T18:52:43.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:52:43.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:52:43.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:12, diff=31.096992s, valid=True
2026-05-28T18:52:43.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:52:43.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:20, diff=23.103583s, valid=True
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:52:43.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:52:43.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:52:43.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:12, diff=31.10665s, valid=True
2026-05-28T18:52:43.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:52:43.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:52:43.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:52:43.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919805.107303s, valid=True
2026-05-28T18:52:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:52:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:52:43.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:52:43.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:52:43.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:52:43.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:52:43.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:52:43.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:52:43.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:52:43.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:52:43.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:52:43.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:52:43.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:52:43.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:52:43.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:52:44.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:52:44.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:52:44.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:52:44.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-28T18:52:44.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-28T18:52:44.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:52:44.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:53:14.411 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:53:14.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:53:14.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:53:14.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:53:14.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:53:14.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:53:14.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-28T18:53:14.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:53:14.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-28T18:53:14.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:53:14.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:53:14.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:53:14.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-28T18:53:17.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-28T18:53:17.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:53:17.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:53:17.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:53:17.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:53:17.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:53:17.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:53:17.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:53:17.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:53:17.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:53:17.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:53:17.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:53:17.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:53:17.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:53:17.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:53:17.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:53:17.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:53:17.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:53:17.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:53:17.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:53:17.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:53:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:53:17.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:53:17.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:53:17.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:52:53
2026-05-28T18:53:17.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69745, datetime.datetime(2026, 5, 28, 18, 52, 53), datetime.datetime(2026, 5, 28, 18, 52, 53), 'salt', 9.06, 72.0, None, 14.15, 155.51, 4.77, 830.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:53:17.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:53:17.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:53:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:53, diff=24.685071s, valid=True
2026-05-28T18:53:17.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:53:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:53:17.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:12, diff=5.688116s, valid=True
2026-05-28T18:53:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:53:17.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:52:52, diff=25.69515s, valid=True
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:53:17.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:53:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:12, diff=5.698438s, valid=True
2026-05-28T18:53:17.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:53:17.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:53:17.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:53:17.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919839.699159s, valid=True
2026-05-28T18:53:17.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:53:17.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:53:17.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:53:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:53:17.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:53:17.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:53:17.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:53:17.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:53:17.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:53:17.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:53:17.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:53:17.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:53:17.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:53:18.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:53:18.249 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:53:18.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:53:18.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:53:18.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:53:18.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-28T18:53:18.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-28T18:53:19.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:53:19.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:53:49.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:53:49.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:53:49.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:53:49.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:53:49.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:53:49.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:53:49.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-28T18:53:49.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:53:49.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-28T18:53:49.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:53:49.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:53:49.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:53:49.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-28T18:53:51.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-28T18:53:51.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:53:51.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:53:51.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:53:51.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:53:51.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:53:51.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:53:51.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:53:51.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:53:51.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:53:51.872 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:53:51.872 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:53:51.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:53:51.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T18:53:51.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:53:52.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T18:53:52.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:53:52.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:53:52.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:53:52.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:53:52.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:53:52.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:53:52.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:53:52.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:53:52.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:53:23
2026-05-28T18:53:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69746, datetime.datetime(2026, 5, 28, 18, 53, 23), datetime.datetime(2026, 5, 28, 18, 53, 23), 'salt', 9.16, 70.6, None, 14.36, 141.88, 5.05, 830.77, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:53:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:53:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T18:53:52.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:23, diff=29.201774s, valid=True
2026-05-28T18:53:52.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:53:52.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:53:52.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:12, diff=40.204589s, valid=True
2026-05-28T18:53:52.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:53:52.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:19, diff=33.211213s, valid=True
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:53:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:53:52.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:53:12, diff=40.214185s, valid=True
2026-05-28T18:53:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:53:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:53:52.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:53:52.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919874.214856s, valid=True
2026-05-28T18:53:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:53:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:53:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:53:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:53:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:53:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:53:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:53:52.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:53:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:53:52.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:53:52.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:53:52.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:53:52.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:53:52.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:53:53.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:53:53.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:53:53.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:53:53.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:53:53.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-28T18:53:53.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-28T18:53:53.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:53:53.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:54:23.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:54:23.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:54:23.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:54:24.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:54:24.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:54:24.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:54:24.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-28T18:54:24.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:54:24.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-28T18:54:24.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:54:24.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:54:24.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:54:24.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-28T18:54:26.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-28T18:54:26.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:54:26.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:54:26.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:54:26.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:54:26.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:54:26.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:54:26.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:54:26.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:54:26.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:54:26.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:54:26.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:54:26.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:54:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:54:26.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:54:26.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:54:26.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:54:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:54:26.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:54:26.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:54:26.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:54:26.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:54:26.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:54:26.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:54:27.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:54:24
2026-05-28T18:54:27.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69748, datetime.datetime(2026, 5, 28, 18, 54, 24), datetime.datetime(2026, 5, 28, 18, 54, 23), 'salt', 9.23, 67.65, None, 13.59, 152.16, 5.66, 830.65, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:54:27.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:54:27.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:54:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:23, diff=4.052558s, valid=True
2026-05-28T18:54:27.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:54:27.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:54:27.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:12, diff=15.055401s, valid=True
2026-05-28T18:54:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:54:27.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:54:27.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:20, diff=7.061849s, valid=True
2026-05-28T18:54:27.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:54:27.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:54:27.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:54:27.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:54:27.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:54:27.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:54:27.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:12, diff=15.064844s, valid=True
2026-05-28T18:54:27.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:54:27.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:54:27.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:54:27.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919909.065482s, valid=True
2026-05-28T18:54:27.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:54:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:54:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:54:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:54:27.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:54:27.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:54:27.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:54:27.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:54:27.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:54:27.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:54:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:54:27.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:54:27.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:54:27.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:54:27.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:54:27.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:54:28.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:54:28.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:54:28.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-28T18:54:28.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-28T18:54:28.254 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:54:28.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:54:58.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:54:58.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:54:58.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:54:58.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:54:58.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:54:58.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:54:58.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-28T18:54:58.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:54:58.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:54:58.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:54:58.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:54:58.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:54:58.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-28T18:55:01.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-28T18:55:01.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:55:01.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:55:01.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:55:01.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:55:01.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:55:01.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:55:01.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:55:01.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:55:01.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:55:01.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:55:01.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:55:01.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:55:01.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:55:01.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:55:01.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:55:01.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:55:01.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:55:01.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:55:01.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:55:01.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:55:01.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:55:01.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:55:01.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:55:01.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:54:54
2026-05-28T18:55:01.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69749, datetime.datetime(2026, 5, 28, 18, 54, 54), datetime.datetime(2026, 5, 28, 18, 54, 53), 'salt', 9.39, 66.66, None, 15.0, 156.67, 5.88, 830.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:55:01.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:55:01.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:55:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:53, diff=8.519297s, valid=True
2026-05-28T18:55:01.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:55:01.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:55:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:12, diff=-10.477794s, valid=True
2026-05-28T18:55:01.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:55:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:55:01.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:54:50, diff=11.528863s, valid=True
2026-05-28T18:55:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:55:01.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:55:01.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:55:01.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:55:01.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:55:01.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:55:01.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:12, diff=-10.468092s, valid=True
2026-05-28T18:55:01.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:55:01.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:55:01.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:55:01.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919943.532548s, valid=True
2026-05-28T18:55:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:55:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:55:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:55:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:55:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:55:01.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:55:01.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:55:01.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:55:01.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:55:01.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:55:01.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:55:01.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:55:01.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:55:01.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:55:02.191 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:55:02.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:55:02.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:55:02.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:55:02.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-28T18:55:02.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-28T18:55:02.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:55:02.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:55:32.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:55:32.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:55:32.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:55:33.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:55:33.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:55:33.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:55:33.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:55:33.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:55:33.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-28T18:55:33.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:55:33.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:55:33.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:55:33.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-28T18:55:35.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:55:35.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:55:35.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:55:35.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:55:35.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:55:35.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:55:35.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:55:35.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:55:35.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:55:35.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:55:35.923 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:55:35.923 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:55:35.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:55:36.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:55:36.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:55:36.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:55:36.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:55:36.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:55:36.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:55:36.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:55:36.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:55:36.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:55:36.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:55:36.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:55:36.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:55:24
2026-05-28T18:55:36.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69750, datetime.datetime(2026, 5, 28, 18, 55, 24), datetime.datetime(2026, 5, 28, 18, 55, 24), 'salt', 9.33, 66.29, None, 14.26, 143.9, 5.96, 830.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:55:36.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:55:36.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:55:36.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:24, diff=12.25457s, valid=True
2026-05-28T18:55:36.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:55:36.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:55:36.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:12, diff=24.257427s, valid=True
2026-05-28T18:55:36.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:55:36.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:55:36.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:20, diff=16.263866s, valid=True
2026-05-28T18:55:36.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:55:36.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:55:36.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:55:36.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:55:36.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:55:36.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:55:36.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:12, diff=24.266881s, valid=True
2026-05-28T18:55:36.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:55:36.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:55:36.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:55:36.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=919978.26752s, valid=True
2026-05-28T18:55:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:55:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:55:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:55:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:55:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:55:36.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:55:36.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:55:36.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:55:36.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:55:36.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:55:36.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:55:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:55:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:55:36.596 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:55:36.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:55:37.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:55:37.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:55:37.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:55:37.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-28T18:55:37.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-28T18:55:37.413 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:55:37.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:56:07.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:56:07.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:56:07.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:56:07.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:56:07.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:56:07.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:56:07.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T18:56:07.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:56:07.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-28T18:56:07.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:56:07.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:56:07.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:56:07.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-28T18:56:11.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:56:11.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:56:11.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:56:11.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:56:11.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:56:11.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:56:11.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:56:11.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:56:11.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:56:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:56:11.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:56:11.057 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:56:11.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:56:11.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:56:11.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:56:11.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:56:11.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:56:11.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:56:11.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:56:11.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:56:11.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:56:11.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:56:11.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:56:11.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:56:11.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:55:54
2026-05-28T18:56:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69751, datetime.datetime(2026, 5, 28, 18, 55, 54), datetime.datetime(2026, 5, 28, 18, 55, 54), 'salt', 9.33, 65.27, None, 14.4, 145.54, 6.18, 830.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:56:11.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:56:11.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:56:11.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:54, diff=17.373329s, valid=True
2026-05-28T18:56:11.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:56:11.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:56:11.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:12, diff=-0.623751s, valid=True
2026-05-28T18:56:11.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:56:11.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:55:50, diff=21.383015s, valid=True
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:56:11.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:56:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:12, diff=-0.613928s, valid=True
2026-05-28T18:56:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:56:11.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:56:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:56:11.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920013.386741s, valid=True
2026-05-28T18:56:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:56:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:56:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:56:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:56:11.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:56:11.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:56:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:56:11.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:56:11.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:56:11.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:56:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:56:11.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:56:11.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:56:11.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:56:11.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:56:12.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:56:12.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:56:12.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:56:12.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-28T18:56:12.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-28T18:56:12.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:56:12.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:56:42.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:56:42.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:56:42.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:56:42.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:56:42.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:56:42.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:56: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-28T18:56:42.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:56:42.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T18:56:42.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:56:42.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:56:42.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:56:42.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-28T18:56:45.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:56:45.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:56:45.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:56:45.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:56:45.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:56:45.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:56:45.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:56:45.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:56:45.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:56:45.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:56:45.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:56:45.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:56:45.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:56:45.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:56:45.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:56:45.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:56:45.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:56:45.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:56:45.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:56:45.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:56:45.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:56:45.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:56:45.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:56:45.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:56:45.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:56:25
2026-05-28T18:56:45.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69752, datetime.datetime(2026, 5, 28, 18, 56, 25), datetime.datetime(2026, 5, 28, 18, 56, 24), 'salt', 9.36, 65.13, None, 12.77, 147.47, 6.2, 830.66, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:56:45.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:56:45.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:56:45.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:24, diff=21.893458s, valid=True
2026-05-28T18:56:45.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:56:45.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:56:45.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:12, diff=33.896405s, valid=True
2026-05-28T18:56:45.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:56:45.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:21, diff=24.903144s, valid=True
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:56:45.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:56:45.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:12, diff=33.906299s, valid=True
2026-05-28T18:56:45.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:56:45.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:56:45.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:56:45.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920047.906992s, valid=True
2026-05-28T18:56:45.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:56:45.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:56:45.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:56:45.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:56:45.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:56:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:56:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:56:45.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:56:45.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:56:46.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:56:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:56:46.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:56:46.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:56:46.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:56:46.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:56:46.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:56:46.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:56:46.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:56:46.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-28T18:56:46.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-28T18:56:47.121 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:56:47.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:57:17.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:57:17.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:57:17.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:57:17.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:57:17.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:57:18.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:57:18.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-28T18:57:18.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:57:18.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-28T18:57:18.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:57:18.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:57:18.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:57:18.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T18:57:20.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-28T18:57:20.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:57:20.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:57:20.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:57:20.869 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:57:20.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:57:20.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:57:20.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:57:20.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:57:20.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:57:20.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:57:20.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:57:20.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:57:21.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:57:21.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:57:21.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:57:21.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:57:21.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:57:21.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:57:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:57:21.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:57:21.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:57:21.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:57:21.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:57:21.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:56:55
2026-05-28T18:57:21.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69753, datetime.datetime(2026, 5, 28, 18, 56, 55), datetime.datetime(2026, 5, 28, 18, 56, 54), 'salt', 9.16, 64.9, None, 14.54, 142.21, 6.24, 830.72, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:57:21.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:57:21.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:57:21.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:54, diff=27.283054s, valid=True
2026-05-28T18:57:21.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:57:21.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:57:21.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:12, diff=9.28597s, valid=True
2026-05-28T18:57:21.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:57:21.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:56:53, diff=28.292551s, valid=True
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:57:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:57:21.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:57:21.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:12, diff=9.295598s, valid=True
2026-05-28T18:57:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:57:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:57:21.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:57:21.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920083.296253s, valid=True
2026-05-28T18:57:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:57:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:57:21.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:57:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:57:21.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:57:21.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:57:21.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:57:21.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:57:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:57:21.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:57:21.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:57:21.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:57:21.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:57:21.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:57:21.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:57:22.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:57:22.329 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:57:22.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:57:22.330 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:57:22.330 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:57:22.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:57:22.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:57:52.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:57:52.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:57:52.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:57:52.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:57:52.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:57:53.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:57:53.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-28T18:57:53.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:57:53.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-28T18:57:53.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:57:53.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:57:53.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:57:53.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-28T18:57:55.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-28T18:57:55.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:57:55.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:57:55.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:57:55.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:57:55.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:57:55.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:57:55.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:57:55.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:57:55.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:57:55.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:57:55.502 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:57:55.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:57:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:57:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:57:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:57:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:57:55.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:57:55.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:57:55.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T18:57:55.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:57:55.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:57:55.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:57:55.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:57:55.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:57:25
2026-05-28T18:57:55.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69754, datetime.datetime(2026, 5, 28, 18, 57, 25), datetime.datetime(2026, 5, 28, 18, 57, 25), 'salt', 9.23, 64.3, None, 12.56, 141.04, 6.38, 830.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:57:55.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:57:55.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:57:55.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:55, diff=0.817494s, valid=True
2026-05-28T18:57:55.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:57:55.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:57:55.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:12, diff=43.820332s, valid=True
2026-05-28T18:57:55.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:57:55.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:52, diff=3.82701s, valid=True
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:57:55.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T18:57:55.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:57:12, diff=43.830058s, valid=True
2026-05-28T18:57:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:57:55.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:57:55.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:57:55.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920117.830745s, valid=True
2026-05-28T18:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:57:55.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:57:55.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:57:55.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:57:55.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:57:55.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:57:55.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:57:56.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:57:56.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:57:56.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:57:56.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:57:56.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:57:56.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:57:56.890 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:57:56.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:57:56.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-28T18:57:56.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-28T18:57:57.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:57:57.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:58:27.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:58:27.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:58:27.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:58:27.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:58:27.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:58:27.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:58:27.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-28T18:58:27.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:58:27.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-28T18:58:27.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:58:27.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:58:27.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:58:27.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-28T18:58:32.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-28T18:58:32.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:58:32.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:58:32.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:58:32.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:58:32.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:58:32.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:58:32.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:58:32.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:58:32.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:58:32.535 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:58:32.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:58:32.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:58:32.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:58:32.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:58:32.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:58:32.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:58:32.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:58:32.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:58:32.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:58:32.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:58:32.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:58:32.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:58:32.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:58:32.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:58:27
2026-05-28T18:58:32.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69756, datetime.datetime(2026, 5, 28, 18, 58, 27), datetime.datetime(2026, 5, 28, 18, 58, 27), 'salt', 9.07, 64.04, None, 15.17, 137.83, 6.43, 830.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:58:32.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:58:32.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:58:32.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:27, diff=5.919591s, valid=True
2026-05-28T18:58:32.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:58:32.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:58:32.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:12, diff=20.922547s, valid=True
2026-05-28T18:58:32.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:58:32.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:22, diff=10.929305s, valid=True
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:58:32.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:58:32.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:12, diff=20.932406s, valid=True
2026-05-28T18:58:32.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:58:32.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:58:32.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:58:32.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920154.933084s, valid=True
2026-05-28T18:58:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:58:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:58:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:58:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:58:32.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:58:32.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:58:32.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:58:32.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:58:33.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:58:33.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:58:33.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:58:33.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:58:33.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:58:33.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:58:33.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:58:33.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:58:33.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:58:33.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:58:33.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:58:33.955 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:58:34.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:58:34.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:59:04.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:59:04.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:59:04.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:59:04.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:59:04.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:59:04.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:59:04.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-28T18:59:04.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:59:04.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-28T18:59:04.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:59:04.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:59:04.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:59:04.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-28T18:59:07.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-28T18:59:07.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:59:07.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:59:07.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:59:07.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:59:07.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:59:07.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:59:07.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:59:07.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:59:07.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:59:07.100 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:59:07.100 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:59:07.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:59:07.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:59:07.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:59:07.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:59:07.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:59:07.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:59:07.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:59:07.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:59:07.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:59:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:59:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:59:07.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:59:07.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:58:57
2026-05-28T18:59:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69757, datetime.datetime(2026, 5, 28, 18, 58, 57), datetime.datetime(2026, 5, 28, 18, 58, 57), 'salt', 9.1, 64.47, None, 15.24, 139.35, 6.34, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:59:07.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:59:07.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:59:07.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:57, diff=10.41643s, valid=True
2026-05-28T18:59:07.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:59:07.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:59:07.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:12, diff=-4.580689s, valid=True
2026-05-28T18:59:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:59:07.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:58:52, diff=15.426099s, valid=True
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:59:07.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:59:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:12, diff=-4.570906s, valid=True
2026-05-28T18:59:07.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:59:07.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:59:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:59:07.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920189.429765s, valid=True
2026-05-28T18:59:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:59:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:59:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:59:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:59:07.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:59:07.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:59:07.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:59:07.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:59:07.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:59:07.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:59:07.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:59:07.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:59:07.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:59:07.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:59:08.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:59:08.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:59:08.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:59:08.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:59:08.479 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:59:08.479 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:59:08.634 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:59:08.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T18:59:38.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T18:59:38.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T18:59:38.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T18:59:38.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T18:59:38.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T18:59:39.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T18:59:39.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-28T18:59:39.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T18:59:39.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-28T18:59:39.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T18:59:39.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T18:59:39.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T18:59:39.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-28T18:59:41.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T18:59:41.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T18:59:41.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T18:59:41.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T18:59:41.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T18:59:41.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T18:59:41.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T18:59:41.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T18:59:41.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T18:59:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T18:59:41.632 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T18:59:41.632 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T18:59:41.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T18:59:41.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T18:59:41.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T18:59:41.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T18:59:41.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:59:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:59:41.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T18:59:41.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T18:59:41.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T18:59:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T18:59:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T18:59:41.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T18:59:41.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:59:27
2026-05-28T18:59:41.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69758, datetime.datetime(2026, 5, 28, 18, 59, 27), datetime.datetime(2026, 5, 28, 18, 59, 27), 'salt', 8.93, 64.84, None, 15.35, 138.16, 6.25, 830.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T18:59:41.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T18:59:41.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T18:59:41.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:27, diff=14.944819s, valid=True
2026-05-28T18:59:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T18:59:41.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:59:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:12, diff=29.94765s, valid=True
2026-05-28T18:59:41.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T18:59:41.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:22, diff=19.954245s, valid=True
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T18:59:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T18:59:41.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:12, diff=29.957277s, valid=True
2026-05-28T18:59:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T18:59:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T18:59:41.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T18:59:41.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920223.957932s, valid=True
2026-05-28T18:59:41.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T18:59:41.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T18:59:41.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T18:59:41.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T18:59:41.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T18:59:42.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T18:59:42.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T18:59:42.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T18:59:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T18:59:42.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T18:59:42.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T18:59:42.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T18:59:42.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T18:59:42.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T18:59:42.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:59:42.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T18:59:42.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T18:59:42.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T18:59:42.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T18:59:42.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T18:59:43.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T18:59:43.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:00:13.041 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:00:13.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:00:13.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:00:13.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:00:13.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:00:13.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:00:13.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-28T19:00:13.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:00:13.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-28T19:00:13.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:00:13.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:00:13.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:00:13.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-28T19:00:16.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-28T19:00:16.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:00:16.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:00:16.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:00:16.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:00:16.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:00:16.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:00:16.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:00:16.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:00:16.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:00:16.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:00:16.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:00:16.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:00:16.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:00:16.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:00:16.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:00:16.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:00:16.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:00:16.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:00:16.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:00:16.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:00:16.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:00:16.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:00:16.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:00:16.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 18:59:58
2026-05-28T19:00:16.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69759, datetime.datetime(2026, 5, 28, 18, 59, 58), datetime.datetime(2026, 5, 28, 18, 59, 57), 'salt', 8.9, 65.14, None, 12.67, 142.41, 6.18, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:00:16.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:00:16.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:00:16.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:57, diff=19.709705s, valid=True
2026-05-28T19:00:16.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:00:16.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:00:16.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:12, diff=4.712441s, valid=True
2026-05-28T19:00:16.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:00:16.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:00:16.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 18:59:52, diff=24.718682s, valid=True
2026-05-28T19:00:16.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:00:16.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:00:16.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:00:16.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:00:16.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:00:16.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:00:16.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:12, diff=4.721545s, valid=True
2026-05-28T19:00:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:00:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:00:16.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:00:16.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920258.722173s, valid=True
2026-05-28T19:00:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:00:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:00:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:00:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:00:16.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:00:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:00:16.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:00:16.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:00:16.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:00:16.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:00:16.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:00:16.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:00:16.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:00:17.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:00:17.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:00:17.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:00:17.651 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:00:17.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:00:17.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-28T19:00:17.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-28T19:00:17.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:00:17.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:00:47.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:00:47.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:00:47.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:00:48.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:00:48.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:00:48.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:00:48.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-28T19:00:48.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:00:48.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-28T19:00:48.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:00:48.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:00:48.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:00:48.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-28T19:00:51.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-28T19:00:51.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:00:51.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:00:51.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:00:51.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:00:51.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:00:51.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:00:51.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:00:51.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:00:51.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:00:51.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:00:51.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:00:51.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:00:51.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:00:51.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:00:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:00:51.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:00:51.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:00:51.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:00:51.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:00:51.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:00:51.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:00:51.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:00:51.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:00:51.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:00:28
2026-05-28T19:00:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69760, datetime.datetime(2026, 5, 28, 19, 0, 28), datetime.datetime(2026, 5, 28, 19, 0, 27), 'salt', 8.8, 65.87, None, 13.16, 134.48, 6.02, 830.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:00:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:00:51.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:00:51.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:27, diff=24.76165s, valid=True
2026-05-28T19:00:51.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:00:51.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:00:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:12, diff=39.764521s, valid=True
2026-05-28T19:00:51.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:00:51.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:23, diff=28.771205s, valid=True
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:00:51.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:00:51.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:12, diff=39.774233s, valid=True
2026-05-28T19:00:51.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:00:51.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:00:51.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:00:51.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920293.774891s, valid=True
2026-05-28T19:00:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:00:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:00:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:00:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:00:51.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:00:51.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:00:51.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:00:51.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:00:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:00:51.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:00:51.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:00:52.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:00:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:00:52.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:00:52.304 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:00:52.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:00:52.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:00:52.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:00:52.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-28T19:00:52.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-28T19:00:53.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:00:53.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:01:23.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:01:23.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:01:23.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:01:23.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:01:23.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:01:23.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:01:23.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-28T19:01:23.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:01:23.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-28T19:01:23.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:01:23.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:01:23.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:01:23.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-28T19:01:25.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:01:25.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:01:25.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:01:25.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:01:25.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:01:25.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:01:25.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:01:25.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:01:25.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:01:25.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:01:25.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:01:25.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:01:25.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:01:25.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:01:25.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:01:26.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:01:26.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:01:26.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:01:26.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:01:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:01:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:01:26.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:01:26.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:01:26.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:01:26.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:00:58
2026-05-28T19:01:26.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69761, datetime.datetime(2026, 5, 28, 19, 0, 58), datetime.datetime(2026, 5, 28, 19, 0, 58), 'salt', 8.7, 66.2, None, 11.58, 140.86, 5.94, 830.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:01:26.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:01:26.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:01:26.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:58, diff=28.22455s, valid=True
2026-05-28T19:01:26.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:01:26.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:01:26.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:01:12, diff=14.227379s, valid=True
2026-05-28T19:01:26.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:01:26.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:00:54, diff=32.234069s, valid=True
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:01:26.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:01:26.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:01:12, diff=14.237069s, valid=True
2026-05-28T19:01:26.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:01:26.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:01:26.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:01:26.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920328.237735s, valid=True
2026-05-28T19:01:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:01:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:01:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:01:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:01:26.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:01:26.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:01:26.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:01:26.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:01:26.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:01:26.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:01:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:01:26.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:01:26.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:01:26.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:01:26.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:01:27.123 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:01:27.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:01:27.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:01:27.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-28T19:01:27.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-28T19:01:27.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:01:27.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:01:57.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:01:57.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:01:57.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:01:57.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:01:57.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:01:57.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:01:57.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:01:57.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:01:57.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-28T19:01:57.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:01:57.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:01:57.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:01:57.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-28T19:02:01.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-28T19:02:01.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:02:01.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:02:01.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:02:01.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:02:01.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:02:01.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:02:01.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:02:01.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:02:01.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:02:01.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:02:01.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:02:01.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:02:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:02:01.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:02:01.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:02:01.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:02:01.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:02:01.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:02:01.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:02:01.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:02:01.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:02:01.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:02:01.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:02:01.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:01:59
2026-05-28T19:02:01.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69763, datetime.datetime(2026, 5, 28, 19, 1, 59), datetime.datetime(2026, 5, 28, 19, 1, 58), 'salt', 8.54, 66.73, None, 13.62, 143.93, 5.83, 830.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:02:01.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:02:01.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:02:01.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:01:58, diff=3.591614s, valid=True
2026-05-28T19:02:01.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:02:01.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:02:01.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:12, diff=-10.405564s, valid=True
2026-05-28T19:02:01.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:02:01.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:02:01.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:01:57, diff=4.601885s, valid=True
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:02:01.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:02:01.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:12, diff=-10.395068s, valid=True
2026-05-28T19:02:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:02:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:02:01.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:02:01.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920363.605581s, valid=True
2026-05-28T19:02:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:02:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:02:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:02:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:02:01.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:02:01.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:02:01.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:02:01.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:02:01.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:02:01.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:02:01.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:02:01.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:02:01.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:02:01.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:02:02.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:02:02.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:02:02.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:02:02.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:02:02.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-28T19:02:02.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-28T19:02:02.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:02:02.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:02:33.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:02:33.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:02:33.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:02:33.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:02:33.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:02:33.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:02:33.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-28T19:02:33.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:02:33.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-28T19:02:33.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:02:33.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:02:33.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:02:33.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-28T19:02:35.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-28T19:02:35.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:02:35.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:02:35.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:02:35.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:02:35.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:02:36.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:02:36.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:02:36.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:02:36.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:02:36.004 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:02:36.004 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:02:36.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:02:36.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:02:36.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:02:36.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:02:36.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:02:36.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:02:36.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:02:36.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:02:36.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:02:36.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:02:36.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:02:36.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:02:36.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:02:29
2026-05-28T19:02:36.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69764, datetime.datetime(2026, 5, 28, 19, 2, 29), datetime.datetime(2026, 5, 28, 19, 2, 29), 'salt', 8.44, 66.73, None, 13.8, 142.34, 5.82, 830.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:02:36.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:02:36.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:02:36.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:29, diff=7.329823s, valid=True
2026-05-28T19:02:36.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:02:36.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:02:36.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:12, diff=24.332667s, valid=True
2026-05-28T19:02:36.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:02:36.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:28, diff=8.339187s, valid=True
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:02:36.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:02:36.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:12, diff=24.342195s, valid=True
2026-05-28T19:02:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:02:36.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:02:36.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:02:36.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920398.34286s, valid=True
2026-05-28T19:02:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:02:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:02:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:02:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:02:36.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:02:36.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:02:36.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:02:36.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:02:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:02:36.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:02:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:02:36.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:02:36.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:02:36.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:02:36.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:02:37.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:02:37.320 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:02:37.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:02:37.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-28T19:02:37.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-28T19:02:37.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:02:37.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:03:07.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:03:07.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:03:07.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:03:08.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:03:08.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:03:08.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:03:08.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-28T19:03:08.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:03: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-28T19:03:08.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:03:08.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:03:08.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:03:08.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-28T19:03:11.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-28T19:03:11.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:03:11.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:03:11.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:03:11.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:03:11.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:03:11.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:03:11.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:03:11.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:03:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:03:11.079 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:03:11.079 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:03:11.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:03:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:03:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:03:11.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:03:11.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:03:11.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:03:11.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:03:11.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:03:11.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:03:11.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:03:11.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:03:11.352 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:03:11.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:02:59
2026-05-28T19:03:11.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69765, datetime.datetime(2026, 5, 28, 19, 2, 59), datetime.datetime(2026, 5, 28, 19, 2, 59), 'salt', 8.37, 66.73, None, 14.08, 139.73, 5.82, 830.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:03:11.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:03:11.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:03:11.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:59, diff=12.422175s, valid=True
2026-05-28T19:03:11.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:03:11.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:03:11.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:12, diff=-0.574442s, valid=True
2026-05-28T19:03:11.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:03:11.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:03:11.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:02:54, diff=17.432788s, valid=True
2026-05-28T19:03:11.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:03:11.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:03:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:03:11.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:03:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:03:11.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:03:11.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:12, diff=-0.564096s, valid=True
2026-05-28T19:03:11.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:03:11.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:03:11.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:03:11.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920433.436579s, valid=True
2026-05-28T19:03:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:03:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:03:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:03:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:03:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:03:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:03:11.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:03:11.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:03:11.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:03:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:03:11.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:03:11.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:03:11.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:03:11.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:03:12.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:03:12.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:03:12.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:03:12.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:03:12.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-28T19:03:12.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-28T19:03:12.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:03:12.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:03:42.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:03:42.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:03:42.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:03:43.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:03:43.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:03:43.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:03:43.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-28T19:03:43.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:03:43.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-28T19:03:43.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:03:43.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:03:43.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:03:43.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-28T19:03:45.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-28T19:03:45.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:03:45.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:03:45.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:03:45.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:03:45.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:03:45.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:03:45.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:03:45.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:03:45.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:03:45.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:03:45.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:03:45.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:03:46.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:03:46.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:03:46.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:03:46.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:03:46.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:03:46.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:03:46.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:03:46.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:03:46.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:03:46.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:03:46.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:03:46.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:03:30
2026-05-28T19:03:46.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69766, datetime.datetime(2026, 5, 28, 19, 3, 30), datetime.datetime(2026, 5, 28, 19, 3, 29), 'salt', 8.34, 66.93, None, 13.69, 141.96, 5.78, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:03:46.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:03:46.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:03:46.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:29, diff=17.265188s, valid=True
2026-05-28T19:03:46.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:03:46.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:03:46.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:12, diff=34.26802s, valid=True
2026-05-28T19:03:46.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:03:46.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:24, diff=22.274552s, valid=True
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:03:46.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:03:46.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:03:46.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:12, diff=34.277626s, valid=True
2026-05-28T19:03:46.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:03:46.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:03:46.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:03:46.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920468.278273s, valid=True
2026-05-28T19:03:46.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:03:46.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:03:46.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:03:46.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:03:46.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:03:46.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:03:46.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:03:46.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:03:46.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:03:46.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:03:46.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:03:46.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:03:46.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:03:46.605 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:03:46.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:03:47.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:03:47.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:03:47.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:03:47.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-28T19:03:47.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-28T19:03:47.555 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:03:47.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:04:17.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:04:17.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:04:17.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:04:17.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:04:17.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:04:17.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:04:17.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-28T19:04:17.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:04:17.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-28T19:04:17.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:04:17.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:04:17.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:04:17.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-28T19:04:20.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-28T19:04:20.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:04:20.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:04:20.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:04:20.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:04:20.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:04:20.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:04:20.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:04:20.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:04:20.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:04:20.584 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:04:20.584 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:04:20.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:04:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:04:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:04:20.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:04:20.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:04:20.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:04:20.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:04:20.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:04:20.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:04:20.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:04:20.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:04:20.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:04:20.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:04:00
2026-05-28T19:04:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69767, datetime.datetime(2026, 5, 28, 19, 4), datetime.datetime(2026, 5, 28, 19, 4), 'salt', 8.27, 66.99, None, 12.42, 145.18, 5.76, 830.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:04:20.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:04:20.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:04:20.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:00, diff=20.899955s, valid=True
2026-05-28T19:04:20.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:04:20.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:04:20.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:12, diff=8.902914s, valid=True
2026-05-28T19:04:20.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:04:20.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:03:54, diff=26.909582s, valid=True
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:04:20.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:04:20.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:04:20.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:12, diff=8.912686s, valid=True
2026-05-28T19:04:20.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:04:20.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:04:20.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:04:20.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920502.91336s, valid=True
2026-05-28T19:04:20.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:04:20.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:04:20.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:04:20.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:04:20.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:04:20.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:04:20.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:04:20.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:04:20.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:04:21.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:04:21.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:04:21.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:04:21.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:04:21.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:04:21.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:04:21.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:04:21.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:04:21.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:04:21.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:04:21.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:04:22.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:04:22.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:04:52.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:04:52.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:04:52.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:04:52.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:04:52.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:04:52.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:04:52.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-28T19:04:52.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:04:52.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-28T19:04:52.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:04:52.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:04:52.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:04:52.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-28T19:04:55.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:04:55.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:04:55.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:04:55.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:04:55.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:04:55.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:04:55.553 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:04:55.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:04:55.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:04:55.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:04:55.554 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:04:55.554 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:04:55.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:04:55.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:04:55.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:04:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:04:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:04:55.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:04:55.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:04:55.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:04:55.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:04:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:04:55.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:04:55.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:04:55.880 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:04:30
2026-05-28T19:04:55.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69768, datetime.datetime(2026, 5, 28, 19, 4, 30), datetime.datetime(2026, 5, 28, 19, 4, 30), 'salt', 8.31, 67.06, None, 12.85, 150.65, 5.75, 830.92, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:04:55.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:04:55.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:04:55.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:30, diff=25.886519s, valid=True
2026-05-28T19:04:55.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:04:55.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:04:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:12, diff=43.889395s, valid=True
2026-05-28T19:04:55.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:04:55.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:24, diff=31.896041s, valid=True
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:04:55.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:04:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:12, diff=43.899206s, valid=True
2026-05-28T19:04:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:04:55.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:04:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:04:55.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920537.899909s, valid=True
2026-05-28T19:04:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:04:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:04:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:04:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:04:55.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:04:55.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:04:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:04:55.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:04:55.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:04:56.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:04:56.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:04:56.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:04:56.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:04:56.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:04:56.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:04:56.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:04:56.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:04:56.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:04:56.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-28T19:04:56.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-28T19:04:57.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:04:57.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:05:27.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:05:27.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:05:27.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:05:27.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:05:27.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:05:27.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:05:27.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:05:27.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:05:27.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-28T19:05:27.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:05:27.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:05:27.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:05:27.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-28T19:05:30.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-28T19:05:30.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:05:30.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:05:30.066 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:05:30.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:05:30.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:05:30.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:05:30.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:05:30.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:05:30.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:05:30.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:05:30.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:05:30.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:05:30.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:05:30.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:05:30.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:05:30.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:05:30.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:05:30.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:05:30.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:05:30.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:05:30.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:05:30.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:05:30.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:05:30.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:05:00
2026-05-28T19:05:30.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69769, datetime.datetime(2026, 5, 28, 19, 5), datetime.datetime(2026, 5, 28, 19, 4, 59), 'salt', 8.4, 67.09, None, 12.6, 143.77, 5.74, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:05:30.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:05:30.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:05:30.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:59, diff=31.515885s, valid=True
2026-05-28T19:05:30.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:05:30.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:05:30.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:05:12, diff=18.518845s, valid=True
2026-05-28T19:05:30.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:05:30.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:04:55, diff=35.525498s, valid=True
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:05:30.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:05:30.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:05:12, diff=18.528631s, valid=True
2026-05-28T19:05:30.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:05:30.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:05:30.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:05:30.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920572.529298s, valid=True
2026-05-28T19:05:30.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:05:30.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:05:30.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:05:30.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:05:30.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:05:30.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:05:30.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:05:30.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:05:30.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:05:30.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:05:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:05:30.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:05:30.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:05:30.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:05:31.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:05:31.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:05:31.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:05:31.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:05:31.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-28T19:05:31.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-28T19:05:31.689 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:05:31.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:06:01.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:06:01.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:06:01.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:06:01.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:06:01.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:06:02.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:06:02.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-28T19:06:02.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:06:02.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-28T19:06:02.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:06:02.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:06:02.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:06:02.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-28T19:06:04.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-28T19:06:04.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:06:04.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:06:04.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:06:04.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:06:04.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:06:04.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:06:04.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:06:04.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:06:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:06:04.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:06:04.896 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:06:04.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:06:04.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:06:04.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:06:05.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:06:05.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:06:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:06:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:06:05.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:06:05.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:06:05.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:06:05.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:06:05.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:06:05.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:06:01
2026-05-28T19:06:05.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69771, datetime.datetime(2026, 5, 28, 19, 6, 1), datetime.datetime(2026, 5, 28, 19, 6), 'salt', 8.34, 66.5, None, 11.79, 155.48, 5.87, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:06:05.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:06:05.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:06:05.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:00, diff=5.246227s, valid=True
2026-05-28T19:06:05.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:06:05.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:06:05.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:12, diff=-6.750956s, valid=True
2026-05-28T19:06:05.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:06:05.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:05:58, diff=7.255608s, valid=True
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:06:05.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:06:05.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:06:05.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:12, diff=-6.741412s, valid=True
2026-05-28T19:06:05.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:06:05.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:06:05.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:06:05.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920607.259251s, valid=True
2026-05-28T19:06:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:06:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:06:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:06:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:06:05.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:06:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:06:05.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:06:05.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:06:05.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:06:05.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:06:05.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:06:05.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:06:05.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:06:05.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:06:05.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:06:06.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:06:06.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:06:06.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:06:06.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-28T19:06:06.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-28T19:06:06.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:06:06.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:06:36.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:06:36.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:06:36.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:06:36.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:06:36.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:06:37.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:06:37.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-28T19:06:37.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:06:37.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:06:37.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:06:37.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:06:37.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:06:37.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-28T19:06:39.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-28T19:06:39.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:06:39.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:06:39.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:06:39.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:06:39.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:06:39.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:06:39.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:06:39.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:06:39.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:06:39.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:06:39.457 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:06:39.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:06:39.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:06:39.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:06:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:06:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:06:39.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:06:39.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:06:39.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:06:39.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:06:39.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:06:39.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:06:39.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:06:39.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:06:31
2026-05-28T19:06:39.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69772, datetime.datetime(2026, 5, 28, 19, 6, 31), datetime.datetime(2026, 5, 28, 19, 6, 31), 'salt', 8.57, 66.17, None, 13.55, 145.77, 5.95, 830.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:06:39.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:06:39.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:06:39.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:31, diff=8.76813s, valid=True
2026-05-28T19:06:39.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:06:39.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:06:39.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:12, diff=27.770985s, valid=True
2026-05-28T19:06:39.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:06:39.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:29, diff=10.777522s, valid=True
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:06:39.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:06:39.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:06:12, diff=27.780568s, valid=True
2026-05-28T19:06:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:06:39.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:06:39.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:06:39.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920641.781226s, valid=True
2026-05-28T19:06:39.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:06:39.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:06:39.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:06:39.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:06:39.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:06:39.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:06:39.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:06:39.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:06:39.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:06:39.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:06:39.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:06:40.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:06:40.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:06:40.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:06:40.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:06:40.710 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:06:40.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:06:40.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:06:40.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-28T19:06:40.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-28T19:06:40.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:06:40.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:07:11.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:07:11.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:07:11.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:07:11.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:07:11.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:07:11.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:07:11.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-28T19:07:11.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:07:11.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-28T19:07:11.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:07:11.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:07:11.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:07:11.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:07:13.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-28T19:07:13.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:07:13.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:07:13.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:07:13.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:07:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:07:13.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:07:13.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:07:13.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:07:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:07:13.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:07:13.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:07:13.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:07:13.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:07:13.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:07:13.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:07:13.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:07:14.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:07:14.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:07:14.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:07:14.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:07:14.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:07:14.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:07:14.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:07:14.111 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:07:01
2026-05-28T19:07:14.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69773, datetime.datetime(2026, 5, 28, 19, 7, 1), datetime.datetime(2026, 5, 28, 19, 7, 1), 'salt', 8.6, 65.93, None, 12.7, 146.73, 5.99, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:07:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:07:14.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:07:14.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:01, diff=13.11779s, valid=True
2026-05-28T19:07:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:07:14.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:07:14.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:12, diff=2.120669s, valid=True
2026-05-28T19:07:14.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:07:14.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:01, diff=13.127286s, valid=True
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:07:14.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:07:14.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:12, diff=2.130336s, valid=True
2026-05-28T19:07:14.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:07:14.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:07:14.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:07:14.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920676.13099s, valid=True
2026-05-28T19:07:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:07:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:07:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:07:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:07:14.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:07:14.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:07:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:07:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:07:14.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:07:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:07:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:07:14.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:07:14.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:07:14.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:07:14.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:07:15.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:07:15.191 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:07:15.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:07:15.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-28T19:07:15.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-28T19:07:15.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:07:15.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:07:45.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:07:45.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:07:45.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:07:45.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:07:45.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:07:45.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:07:45.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-28T19:07:45.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:07:45.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-28T19:07:45.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:07:45.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:07:45.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:07:45.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-28T19:07:48.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-28T19:07:48.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:07:48.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:07:48.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:07:48.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:07:48.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:07:48.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:07:48.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:07:48.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:07:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:07:48.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:07:48.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:07:48.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:07:48.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:07:48.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:07:48.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:07:48.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:07:48.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:07:48.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:07:48.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:07:48.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:07:48.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:07:48.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:07:48.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:07:48.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:07:32
2026-05-28T19:07:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69774, datetime.datetime(2026, 5, 28, 19, 7, 32), datetime.datetime(2026, 5, 28, 19, 7, 31), 'salt', 8.67, 65.7, None, 13.23, 147.34, 6.05, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:07:48.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:07:48.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:07:48.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:31, diff=17.549921s, valid=True
2026-05-28T19:07:48.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:07:48.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:07:48.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:12, diff=36.552835s, valid=True
2026-05-28T19:07:48.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:07:48.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:26, diff=22.559541s, valid=True
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:07:48.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:07:48.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:07:48.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:12, diff=36.562583s, valid=True
2026-05-28T19:07:48.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:07:48.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:07:48.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:07:48.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920710.563237s, valid=True
2026-05-28T19:07:48.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:07:48.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:07:48.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:07:48.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:07:48.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:07:48.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:07:48.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:07:48.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:07:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:07:48.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:07:48.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:07:48.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:07:48.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:07:48.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:07:49.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:07:49.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:07:49.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:07:49.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:07:49.559 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:07:49.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-28T19:07:49.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:07:49.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:08:19.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:08:19.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:08:19.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:08:20.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:08:20.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:08:20.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:08:20.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-28T19:08:20.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:08:20.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-28T19:08:20.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:08:20.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:08:20.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:08:20.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-28T19:08:23.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:08:23.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:08:23.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:08:23.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:08:23.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:08:23.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:08:23.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:08:23.634 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:08:23.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:08:23.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:08:23.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:08:23.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:08:23.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:08:23.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:08:23.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:08:23.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:08:23.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:08:23.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:08:23.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:08:23.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 671 rows from lcogt
2026-05-28T19:08:23.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:08:23.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:08:23.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:08:23.892 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:08:23.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:08:02
2026-05-28T19:08:23.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69775, datetime.datetime(2026, 5, 28, 19, 8, 2), datetime.datetime(2026, 5, 28, 19, 8, 1), 'salt', 8.67, 65.57, None, 12.6, 148.16, 6.08, 830.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:08:23.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:08:23.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:08:23.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:01, diff=22.957855s, valid=True
2026-05-28T19:08:23.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:08:23.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:08:23.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=11.96076s, valid=True
2026-05-28T19:08:23.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:08:23.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:08:23.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:07:56, diff=27.968953s, valid=True
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:08:23.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 671 rows. Structure expected: 10 fields
2026-05-28T19:08:23.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=11.972279s, valid=True
2026-05-28T19:08:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:08:23.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:08:23.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:08:23.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920745.97296s, valid=True
2026-05-28T19:08:23.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:08:23.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:08:23.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:08:23.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:08:23.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:08:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:08:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:08:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:08:24.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:08:24.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:08:24.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:08:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:08:24.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:08:24.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:08:24.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:08:24.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:08:25.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:08:25.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:08:25.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-28T19:08:25.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-28T19:08:25.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:08:25.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:08:55.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:08:55.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:08: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-28T19:08:55.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:08:55.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:08:56.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:08:56.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-28T19:08:56.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:08:56.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-28T19:08:56.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:08:56.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:08:56.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:08:56.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:08:58.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-28T19:08:58.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:08:58.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:08:58.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:08:58.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:08:58.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:08:58.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:08:58.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:08:58.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:08:58.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:08:58.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:08:58.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:08:58.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:08:58.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:08:58.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:08:58.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:08:58.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:08:58.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T19:08:58.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:08:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T19:08:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:08:58.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:08:58.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:08:58.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:08:58.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:08:32
2026-05-28T19:08:58.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69776, datetime.datetime(2026, 5, 28, 19, 8, 32), datetime.datetime(2026, 5, 28, 19, 8, 32), 'salt', 8.64, 65.54, None, 14.05, 152.67, 6.09, 830.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:08:58.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:08:58.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:08:58.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:32, diff=26.816894s, valid=True
2026-05-28T19:08:58.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:08:58.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T19:08:58.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=46.819767s, valid=True
2026-05-28T19:08:58.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:08:58.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:26, diff=32.826423s, valid=True
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:08:58.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T19:08:58.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=46.829497s, valid=True
2026-05-28T19:08:58.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:08:58.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:08:58.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:08:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920780.830161s, valid=True
2026-05-28T19:08:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:08:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:08:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:08:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:08:58.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:08:58.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:08:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:08:58.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:08:58.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:08:58.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:08:59.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:08:59.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:08:59.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:08:59.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:08:59.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:08:59.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:08:59.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:08:59.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:08:59.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-28T19:08:59.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-28T19:09:00.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:09:00.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:09:30.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:09:30.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:09:30.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:09:30.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:09:30.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:09:30.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:09:30.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-28T19:09:30.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:09:30.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-28T19:09:30.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:09:30.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:09:30.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:09:30.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-28T19:09:33.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-28T19:09:33.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:09:33.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:09:33.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:09:33.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:09:33.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:09:33.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:09:33.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:09:33.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:09:33.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:09:33.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:09:33.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:09:33.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:09:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:09:33.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:09:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:09:33.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:09:33.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T19:09:33.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:09:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T19:09:33.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:09:33.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:09:33.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:09:33.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:09:33.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:09:32
2026-05-28T19:09:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69778, datetime.datetime(2026, 5, 28, 19, 9, 32), datetime.datetime(2026, 5, 28, 19, 9, 31), 'salt', 8.81, 64.08, None, 14.26, 143.82, 6.41, 830.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:09:33.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:09:33.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:09:33.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:09:31, diff=2.505715s, valid=True
2026-05-28T19:09:33.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:09:33.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T19:09:33.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=81.508562s, valid=True
2026-05-28T19:09:33.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:09:33.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:09:28, diff=5.515234s, valid=True
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:09:33.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T19:09:33.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=81.518282s, valid=True
2026-05-28T19:09:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:09:33.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:09:33.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:09:33.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920815.518958s, valid=True
2026-05-28T19:09:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:09:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:09:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:09:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:09:33.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:09:33.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:09:33.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:09:33.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:09:33.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:09:33.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:09:33.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:09:33.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:09:33.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:09:33.908 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:09:34.148 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:09:34.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:09:34.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:09:34.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:09:34.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-28T19:09:34.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-28T19:09:34.753 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:09:34.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:10:04.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:10:04.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:10:04.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:10:05.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:10:05.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:10:05.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:10:05.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:10:05.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:10:05.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:10:05.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:10:05.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:10:05.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:10:05.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-28T19:10:07.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-28T19:10:07.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:10:07.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:10:07.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:10:07.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:10:07.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:10:07.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:10:07.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:10:07.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:10:07.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:10:07.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:10:07.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:10:07.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:10:07.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:10:07.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:10:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:10:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:10:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:10:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:10:07.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:10:07.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:10:07.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:10:07.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:10:07.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:10:07.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:10:03
2026-05-28T19:10:07.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69779, datetime.datetime(2026, 5, 28, 19, 10, 3), datetime.datetime(2026, 5, 28, 19, 10, 2), 'salt', 8.84, 63.38, None, 16.55, 154.69, 6.57, 830.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:10:07.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:10:07.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:10:07.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:10:02, diff=5.97229s, valid=True
2026-05-28T19:10:07.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:10:07.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:10:07.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=115.975129s, valid=True
2026-05-28T19:10:07.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:10:07.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:09:59, diff=8.981572s, valid=True
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:10:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:10:07.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:10:07.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=115.98458s, valid=True
2026-05-28T19:10:07.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:10:07.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:10:07.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:10:07.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920849.985243s, valid=True
2026-05-28T19:10:07.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:10:07.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:10:07.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:10:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:10:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:10:08.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:10:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:10:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:10:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:10:08.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:10:08.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:10:08.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:10:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:10:08.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:10:08.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:10:08.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:10:08.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:10:08.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:10:08.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-28T19:10:08.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-28T19:10:09.189 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:10:09.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:10:39.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:10:39.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:10: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-28T19:10:39.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:10:39.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:10:39.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:10:39.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-28T19:10:39.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:10:39.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-28T19:10:39.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:10:39.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:10:39.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:10:39.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-28T19:10: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-28T19:10:42.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:10:42.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:10:42.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:10:42.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:10:42.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:10:42.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:10:42.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:10:42.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:10:42.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:10:42.264 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:10:42.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:10:42.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:10:42.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:10:42.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:10:42.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:10:42.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:10:42.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:10:42.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:10:42.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:10:42.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:10:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:10:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:10:42.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:10:42.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:10:33
2026-05-28T19:10:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69780, datetime.datetime(2026, 5, 28, 19, 10, 33), datetime.datetime(2026, 5, 28, 19, 10, 32), 'salt', 8.91, 62.92, None, 17.61, 152.55, 6.68, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:10:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:10:42.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:10:42.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:10:32, diff=10.674254s, valid=True
2026-05-28T19:10:42.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:10:42.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:10:42.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=150.67712s, valid=True
2026-05-28T19:10:42.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:10:42.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:10:42.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:10:31, diff=11.683803s, valid=True
2026-05-28T19:10:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:10:42.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:10:42.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:10:42.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:10:42.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:10:42.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:10:42.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=150.686851s, valid=True
2026-05-28T19:10:42.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:10:42.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:10:42.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:10:42.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920884.687482s, valid=True
2026-05-28T19:10:42.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:10:42.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:10:42.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:10:42.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:10:42.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:10:42.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:10:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:10:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:10:42.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:10:42.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:10:42.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:10:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:10:42.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:10:43.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:10:43.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:10:43.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:10:43.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:10:43.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:10:43.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-28T19:10:43.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-28T19:10:43.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:10:43.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:11:13.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:11:13.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:11: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-28T19:11:14.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:11:14.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:11:14.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:11:14.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-28T19:11:14.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:11:14.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-28T19:11:14.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:11:14.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:11:14.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:11:14.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-28T19:11:18.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-28T19:11:18.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:11:18.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:11:18.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:11:18.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:11:18.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:11:18.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:11:18.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:11:18.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:11:18.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:11:18.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:11:18.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:11:18.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:11:18.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:11:18.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:11:18.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:11:18.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:11:18.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:11:18.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:11:18.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:11:18.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:11:18.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:11:18.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:11:18.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:11:18.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:11:03
2026-05-28T19:11:18.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69781, datetime.datetime(2026, 5, 28, 19, 11, 3), datetime.datetime(2026, 5, 28, 19, 11, 3), 'salt', 9.0, 62.65, None, 17.71, 156.31, 6.73, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:11:18.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:11:18.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:11:18.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:11:03, diff=15.44965s, valid=True
2026-05-28T19:11:18.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:11:18.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:11:18.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=186.452486s, valid=True
2026-05-28T19:11:18.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:11:18.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:11:02, diff=16.459087s, valid=True
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:11:18.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:11:18.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=186.462094s, valid=True
2026-05-28T19:11:18.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:11:18.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:11:18.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:11:18.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920920.462751s, valid=True
2026-05-28T19:11:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:11:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:11:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:11:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:11:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:11:18.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:11:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:11:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:11:18.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:11:18.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:11:18.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:11:18.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:11:18.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:11:18.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:11:19.018 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:11:19.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:11:19.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:11:19.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:11:19.548 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:11:19.548 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:11:19.796 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:11:19.796 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:11:49.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:11:49.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:11:49.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:11:50.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:11:50.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:11:50.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:11:50.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-28T19:11:50.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:11:50.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:11:50.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:11:50.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:11:50.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:11:50.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-28T19:11:53.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-28T19:11:53.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:11:53.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:11:53.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:11:53.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:11:53.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:11:53.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:11:53.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:11:53.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:11:53.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:11:53.244 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:11:53.244 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:11:53.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:11:53.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:11:53.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:11:53.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:11:53.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:11:53.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:11:53.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:11:53.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:11:53.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:11:53.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:11:53.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:11:53.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:11:53.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:11:33
2026-05-28T19:11:53.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69782, datetime.datetime(2026, 5, 28, 19, 11, 33), datetime.datetime(2026, 5, 28, 19, 11, 33), 'salt', 9.0, 62.45, None, 15.6, 151.94, 6.78, 830.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:11:53.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:11:53.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:11:53.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:11:33, diff=20.56538s, valid=True
2026-05-28T19:11:53.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:11:53.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:11:53.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=221.568144s, valid=True
2026-05-28T19:11:53.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:11:53.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:11:53.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:11:28, diff=25.574727s, valid=True
2026-05-28T19:11:53.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:11:53.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:11:53.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:11:53.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:11:53.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:11:53.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:11:53.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=221.577696s, valid=True
2026-05-28T19:11:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:11:53.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:11:53.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:11:53.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920955.578346s, valid=True
2026-05-28T19:11:53.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:11:53.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:11:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:11:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:11:53.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:11:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:11:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:11:53.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:11:53.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:11:53.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:11:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:11:53.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:11:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:11:53.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:11:54.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:11:54.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:11:54.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:11:54.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:11: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-28T19:11: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-28T19:11:54.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:11:54.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:12:24.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:12:24.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:12:24.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:12:25.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:12:25.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:12:25.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:12:25.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:12:25.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:12:25.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-28T19:12:25.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:12:25.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:12:25.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:12:25.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-28T19:12:28.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-28T19:12:28.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:12:28.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:12:28.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:12:28.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:12:28.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:12:28.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:12:28.305 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:12:28.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:12:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:12:28.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:12:28.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:12:28.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:12:28.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:12:28.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:12:28.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:12:28.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:12:28.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:12:28.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:12:28.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:12:28.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:12:28.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:12:28.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:12:28.566 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:12:28.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:12:03
2026-05-28T19:12:28.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69783, datetime.datetime(2026, 5, 28, 19, 12, 3), datetime.datetime(2026, 5, 28, 19, 12, 3), 'salt', 9.04, 62.55, None, 19.3, 154.39, 6.76, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:12:28.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:12:28.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:12:28.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:12:03, diff=25.632525s, valid=True
2026-05-28T19:12:28.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:12:28.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:12:28.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=256.635314s, valid=True
2026-05-28T19:12:28.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:12:28.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:12:28.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:11:58, diff=30.64186s, valid=True
2026-05-28T19:12:28.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:12:28.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:12:28.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:12:28.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:12:28.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:12:28.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:12:28.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=256.644848s, valid=True
2026-05-28T19:12:28.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:12:28.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:12:28.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:12:28.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=920990.645497s, valid=True
2026-05-28T19:12:28.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:12:28.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:12:28.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:12:28.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:12:28.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:12:28.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:12:28.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:12:28.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:12:28.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:12:28.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:12:28.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:12:28.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:12:28.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:12:28.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:12:29.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:12:29.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:12:29.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:12:29.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:12:29.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:12:29.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-28T19:12:29.823 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:12:29.823 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:12:59.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:12:59.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:12:59.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:13:00.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:13:00.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:13:00.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:13:00.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-28T19:13:00.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:13:00.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-28T19:13:00.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:13:00.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:13:00.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:13:00.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-28T19:13:02.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-28T19:13:02.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:13:02.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:13:02.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:13:02.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:13:02.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:13:02.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:13:02.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:13:02.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:13:02.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:13:02.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:13:02.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:13:02.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:13:02.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:13:02.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:13:03.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:13:03.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:13:03.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:13:03.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:13:03.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:13:03.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:13:03.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:13:03.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:13:03.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:13:03.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:12:34
2026-05-28T19:13:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69784, datetime.datetime(2026, 5, 28, 19, 12, 34), datetime.datetime(2026, 5, 28, 19, 12, 32), 'salt', 8.97, 62.39, None, 15.99, 153.33, 6.79, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:13:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:13:03.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:13:03.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:12:32, diff=31.222938s, valid=True
2026-05-28T19:13:03.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:13:03.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:13:03.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=291.225827s, valid=True
2026-05-28T19:13:03.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:13:03.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:12:28, diff=35.232452s, valid=True
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:13:03.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:13:03.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:08:12, diff=291.235517s, valid=True
2026-05-28T19:13:03.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:13:03.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:13:03.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:13:03.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921025.236202s, valid=True
2026-05-28T19:13:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:13:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:13:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:13:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:13:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:13:03.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:13:03.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:13:03.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:13:03.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:13:03.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:13:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:13:03.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:13:03.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:13:03.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:13:03.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:13:04.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:13:04.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:13:04.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:13:04.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-28T19:13:04.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-28T19:13:04.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:13:04.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:13:34.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:13:34.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:13:34.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:13:34.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:13:34.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:13:35.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:13:35.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:13:35.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:13:35.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-28T19:13:35.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:13:35.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:13:35.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:13:35.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:13:37.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-28T19:13:37.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:13:37.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:13:37.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:13:37.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:13:37.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:13:37.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:13:37.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:13:37.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:13:37.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:13:37.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:13:37.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:13:37.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:13:37.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:13:37.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:13:37.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:13:37.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:13:37.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:13:37.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:13:37.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:13:37.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:13:37.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:13:37.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:13:37.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:13:37.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:13:34
2026-05-28T19:13:37.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69786, datetime.datetime(2026, 5, 28, 19, 13, 34), datetime.datetime(2026, 5, 28, 19, 13, 34), 'salt', 9.04, 62.16, None, 16.3, 141.39, 6.85, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:13:37.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:13:37.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:13:37.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:13:34, diff=3.833056s, valid=True
2026-05-28T19:13:37.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:13:37.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:13:37.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:12, diff=-34.164098s, valid=True
2026-05-28T19:13:37.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:13:37.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:13:29, diff=8.842541s, valid=True
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:13:37.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:13:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:12, diff=-34.154462s, valid=True
2026-05-28T19:13:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:13:37.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:13:37.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:13:37.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921059.846209s, valid=True
2026-05-28T19:13:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:13:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:13:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:13:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:13:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:13:37.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:13:37.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:13:37.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:13:37.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:13:37.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:13:38.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:13:38.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:13:38.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:13:38.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:13:38.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:13:38.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:13:38.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:13:38.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:13:38.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-28T19:13:38.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-28T19:13:39.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:13:39.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:14:09.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:14:09.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:14:09.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:14:09.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:14:09.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:14:09.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:14:09.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-28T19:14:09.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:14:09.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-28T19:14:09.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:14:09.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:14:09.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:14:09.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-28T19:14:12.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-28T19:14:12.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:14:12.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:14:12.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:14:12.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:14:12.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:14:12.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:14:12.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:14:12.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:14:12.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:14:12.171 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:14:12.171 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:14:12.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:14:12.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:14:12.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:14:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:14:12.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:14:12.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:14:12.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:14:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:14:12.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:14:12.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:14:12.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:14:12.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:14:12.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:14:04
2026-05-28T19:14:12.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69787, datetime.datetime(2026, 5, 28, 19, 14, 4), datetime.datetime(2026, 5, 28, 19, 14, 4), 'salt', 8.94, 62.19, None, 16.51, 141.74, 6.84, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:14:12.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:14:12.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:14:12.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:04, diff=8.490679s, valid=True
2026-05-28T19:14:12.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:14:12.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:14:12.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:12, diff=0.49356s, valid=True
2026-05-28T19:14:12.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:14:12.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:00, diff=12.500215s, valid=True
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:14:12.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:14:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:12, diff=0.503283s, valid=True
2026-05-28T19:14:12.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:14:12.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:14:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:14:12.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921094.503956s, valid=True
2026-05-28T19:14:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:14:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:14:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:14:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:14:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:14:12.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:14:12.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:14:12.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:14:12.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:14:12.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:14:12.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:14:12.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:14:12.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:14:12.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:14:13.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:14:13.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:14:13.491 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:14:13.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:14:13.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-28T19:14:13.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-28T19:14:13.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:14:13.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:14:43.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:14:43.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:14:43.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:14:44.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:14:44.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:14:44.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:14:44.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-28T19:14:44.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:14:44.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-28T19:14:44.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:14:44.500 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:14:44.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:14:44.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-28T19:14:46.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:14:46.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:14:46.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:14:46.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:14:46.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:14:46.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:14:46.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:14:46.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:14:46.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:14:46.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:14:46.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:14:46.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:14:46.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:14:47.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:14:47.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:14:47.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:14:47.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:14:47.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:14:47.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:14:47.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:14:47.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:14:47.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:14:47.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:14:47.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:14:47.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:14:35
2026-05-28T19:14:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69788, datetime.datetime(2026, 5, 28, 19, 14, 35), datetime.datetime(2026, 5, 28, 19, 14, 34), 'salt', 8.94, 62.06, None, 15.42, 153.5, 6.87, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:14:47.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:14:47.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:14:47.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:34, diff=13.257534s, valid=True
2026-05-28T19:14:47.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:14:47.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:14:47.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:12, diff=-24.739453s, valid=True
2026-05-28T19:14:47.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:14:47.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:14:32, diff=15.267382s, valid=True
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:14:47.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:14:47.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:12, diff=-24.729511s, valid=True
2026-05-28T19:14:47.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:14:47.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:14:47.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:14:47.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921129.271187s, valid=True
2026-05-28T19:14:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:14:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:14:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:14:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:14:47.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:14:47.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:14:47.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:14:47.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:14:47.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:14:47.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:14:47.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:14:47.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:14:47.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:14:47.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:14:48.002 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:14:48.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:14:48.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:14:48.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:14:48.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-28T19:14:48.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-28T19:14:48.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:14:48.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:15:18.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:15:18.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:15:18.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:15:18.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:15:18.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:15:18.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:15:18.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-28T19:15:18.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:15:18.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-28T19:15:18.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:15:18.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:15:18.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:15:18.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-28T19:15:21.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-28T19:15:21.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:15:21.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:15:21.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:15:21.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:15:21.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:15:21.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:15:21.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:15:21.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:15:21.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:15:21.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:15:21.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:15:21.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:15:21.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:15:21.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:15:21.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:15:21.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:15:21.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:15:21.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:15:21.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:15:21.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:15:21.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:15:21.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:15:21.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:15:21.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:15:05
2026-05-28T19:15:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69789, datetime.datetime(2026, 5, 28, 19, 15, 5), datetime.datetime(2026, 5, 28, 19, 15, 4), 'salt', 8.94, 61.89, None, 15.14, 151.57, 6.9, 830.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:15:21.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:15:21.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:15:21.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:04, diff=17.762849s, valid=True
2026-05-28T19:15:21.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:15:21.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:15:21.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:12, diff=9.765768s, valid=True
2026-05-28T19:15:21.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:15:21.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:03, diff=18.772481s, valid=True
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:15:21.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:15:21.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:12, diff=9.775517s, valid=True
2026-05-28T19:15:21.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:15:21.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:15:21.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:15:21.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921163.776216s, valid=True
2026-05-28T19:15:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:15:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:15:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:15:21.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:15:21.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:15:21.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:15:21.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:15:21.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:15:21.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:15:21.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:15:21.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:15:22.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:15:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:15:22.102 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:15:22.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:15:22.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:15:22.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:15:22.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:15:22.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-28T19:15:22.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-28T19:15:22.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:15:22.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:15:52.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:15:52.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:15:52.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:15:53.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:15:53.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:15:53.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:15:53.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-28T19:15:53.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:15:53.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-28T19:15:53.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:15:53.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:15:53.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:15:53.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:15:56.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-28T19:15:56.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:15:56.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:15:56.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:15:56.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:15:56.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:15:56.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:15:56.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:15:56.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:15:56.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:15:56.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:15:56.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:15:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:15:56.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:15:56.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:15:56.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:15:56.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:15:56.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:15:56.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:15:56.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:15:56.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:15:56.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:15:56.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:15:56.446 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:15:56.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:15:35
2026-05-28T19:15:56.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69790, datetime.datetime(2026, 5, 28, 19, 15, 35), datetime.datetime(2026, 5, 28, 19, 15, 35), 'salt', 8.97, 61.99, None, 16.3, 151.97, 6.88, 831.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:15:56.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:15:56.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:15:56.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:35, diff=21.52287s, valid=True
2026-05-28T19:15:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:15:56.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:15:56.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:12, diff=-15.474267s, valid=True
2026-05-28T19:15:56.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:15:56.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:15:34, diff=22.53233s, valid=True
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:15:56.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:15:56.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:12, diff=-15.464637s, valid=True
2026-05-28T19:15:56.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:15:56.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:15:56.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:15:56.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921198.536045s, valid=True
2026-05-28T19:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:15:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:15:56.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:15:56.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:15:56.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:15:56.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:15:56.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:15:56.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:15:56.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:15:56.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:15:57.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:15:57.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:15:57.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:15:57.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:15:57.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-28T19:15:57.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-28T19:15:57.604 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:15:57.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:16:27.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:16:27.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:16:27.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:16:28.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:16:28.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:16:28.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:16:28.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-28T19:16:28.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:16:28.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-28T19:16:28.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:16:28.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:16:28.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:16:28.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-28T19:16:30.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-28T19:16:30.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:16:30.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:16:30.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:16:30.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:16:30.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:16:30.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:16:30.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:16:30.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:16:30.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:16:30.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:16:30.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:16:30.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:16:30.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:16:30.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:16:31.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:16:31.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:16:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:16:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:16:31.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:16:31.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:16:31.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:16:31.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:16:31.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:16:31.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:16:05
2026-05-28T19:16:31.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69791, datetime.datetime(2026, 5, 28, 19, 16, 5), datetime.datetime(2026, 5, 28, 19, 16, 5), 'salt', 8.91, 61.96, None, 15.17, 146.15, 6.89, 830.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:16:31.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:16:31.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:16:31.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:05, diff=26.148851s, valid=True
2026-05-28T19:16:31.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:16:31.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:16:31.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:12, diff=19.151705s, valid=True
2026-05-28T19:16:31.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:16:31.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:01, diff=30.159371s, valid=True
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:16:31.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:16:31.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:12, diff=19.162399s, valid=True
2026-05-28T19:16:31.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:16:31.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:16:31.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:16:31.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921233.16307s, valid=True
2026-05-28T19:16:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:16:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:16:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:16:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:16:31.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:16:31.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:16:31.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:16:31.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:16:31.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:16:31.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:16:31.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:16:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:16:31.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:16:31.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:16:31.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:16:32.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:16:32.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:16:32.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:16:32.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-28T19:16:32.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-28T19:16:32.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:16:32.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:17:02.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:17:02.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:17:02.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:17:02.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:17:02.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:17:03.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:17:03.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-28T19:17:03.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:17:03.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-28T19:17:03.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:17:03.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:17:03.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:17:03.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-28T19:17:05.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-28T19:17:05.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:17:05.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:17:05.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:17:05.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:17:05.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:17:05.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:17:05.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:17:05.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:17:05.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:17:05.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:17:05.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:17:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:17:05.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:17:05.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:17:05.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:17:05.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:17:05.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:17:05.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:17:05.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:17:05.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:17:05.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:17:05.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:17:05.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:17:05.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:16:35
2026-05-28T19:17:05.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69792, datetime.datetime(2026, 5, 28, 19, 16, 35), datetime.datetime(2026, 5, 28, 19, 16, 35), 'salt', 8.91, 62.12, None, 16.48, 151.6, 6.85, 830.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:17:05.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:17:05.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:17:05.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:35, diff=30.69553s, valid=True
2026-05-28T19:17:05.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:17:05.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:17:05.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:17:12, diff=-6.301597s, valid=True
2026-05-28T19:17:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:17:05.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:16:31, diff=34.705075s, valid=True
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:17:05.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:17:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:17:12, diff=-6.291943s, valid=True
2026-05-28T19:17:05.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:17:05.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:17:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:17:05.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921267.708715s, valid=True
2026-05-28T19:17:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:17:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:17:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:17:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:17:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:17:05.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:17:05.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:17:05.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:17:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:17:05.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:17:05.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:17:05.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:17:05.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:17:06.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:17:06.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:17:06.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:17:06.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:17:06.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:17:06.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:17:06.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:17:06.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:17:06.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:17:36.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:17:36.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:17:36.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:17:36.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:17:36.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:17:37.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:17:37.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-28T19:17:37.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:17: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-28T19:17:37.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:17:37.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:17:37.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:17:37.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-28T19:17:39.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-28T19:17:39.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:17:39.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:17:39.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:17:39.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:17:39.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:17:39.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:17:39.643 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:17:39.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:17:39.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:17:39.643 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:17:39.643 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:17:39.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:17:39.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:17:39.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:17:39.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:17:39.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:17:39.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:17:39.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:17:39.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:17:39.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:17:39.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:17:39.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:17:39.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:17:40.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:17:36
2026-05-28T19:17:40.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69794, datetime.datetime(2026, 5, 28, 19, 17, 36), datetime.datetime(2026, 5, 28, 19, 17, 35), 'salt', 8.81, 62.06, None, 14.29, 153.99, 6.86, 830.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:17:40.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:17:40.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:17:40.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:17:35, diff=5.026415s, valid=True
2026-05-28T19:17:40.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:17:40.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:17:40.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:12, diff=-31.97057s, valid=True
2026-05-28T19:17:40.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:17:40.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:17:40.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:17:32, diff=8.0368s, valid=True
2026-05-28T19:17:40.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:17:40.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:17:40.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:17:40.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:17:40.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:17:40.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:17:40.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:12, diff=-31.960053s, valid=True
2026-05-28T19:17:40.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:17:40.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:17:40.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:17:40.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921302.040604s, valid=True
2026-05-28T19:17:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:17:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:17:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:17:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:17:40.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:17:40.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:17:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:17:40.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:17:40.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:17:40.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:17:40.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:17:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:17:40.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:17:40.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:17:40.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:17:41.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:17:41.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:17:41.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:17:41.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-28T19:17:41.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-28T19:17:41.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:17:41.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:18:11.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:18:11.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:18:11.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:18:11.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:18:11.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:18:11.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:18:11.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:18:11.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:18:11.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-28T19:18:11.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:18:11.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:18:11.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:18: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-28T19:18:14.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-28T19:18:14.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:18:14.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:18:14.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:18:14.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:18:14.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:18:14.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:18:14.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:18:14.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:18:14.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:18:14.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:18:14.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:18:14.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:18:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:18:14.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:18:14.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:18:14.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:18:14.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:18:14.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:18:14.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:18:14.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:18:14.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:18:14.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:18:14.761 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:18:14.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:18:06
2026-05-28T19:18:14.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69795, datetime.datetime(2026, 5, 28, 19, 18, 6), datetime.datetime(2026, 5, 28, 19, 18, 6), 'salt', 8.94, 62.03, None, 14.08, 149.16, 6.87, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:18:14.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:18:14.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:18:14.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:06, diff=8.826539s, valid=True
2026-05-28T19:18:14.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:18:14.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:18:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:12, diff=2.829376s, valid=True
2026-05-28T19:18:14.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:18:14.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:18:14.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:02, diff=12.835901s, valid=True
2026-05-28T19:18:14.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:18:14.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:18:14.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:18:14.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:18:14.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:18:14.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:18:14.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:12, diff=2.838875s, valid=True
2026-05-28T19:18:14.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:18:14.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:18:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:18:14.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921336.839537s, valid=True
2026-05-28T19:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:18:14.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:18:14.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:18:14.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:18:14.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:18:14.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:18:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:18:15.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:18:15.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:18:15.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:18:15.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:18:15.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:18:15.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:18:15.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:18:15.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:18:15.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-28T19:18:15.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-28T19:18:15.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:18:15.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:18:45.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:18:45.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:18:45.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:18:46.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:18:46.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:18:46.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:18:46.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-28T19:18:46.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:18:46.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:18:46.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:18:46.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:18:46.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:18:46.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-28T19:18:48.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-28T19:18:48.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:18:49.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:18:49.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:18:49.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:18:49.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:18:49.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:18:49.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:18:49.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:18:49.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:18:49.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:18:49.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:18:49.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:18:49.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:18:49.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:18:49.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:18:49.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:18:49.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:18:49.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:18:49.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:18:49.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:18:49.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:18:49.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:18:49.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:18:49.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:18:37
2026-05-28T19:18:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69796, datetime.datetime(2026, 5, 28, 19, 18, 37), datetime.datetime(2026, 5, 28, 19, 18, 36), 'salt', 8.87, 61.96, None, 13.16, 152.8, 6.88, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:18:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:18:49.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:18:49.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:36, diff=13.353705s, valid=True
2026-05-28T19:18:49.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:18:49.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:18:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:12, diff=-22.643429s, valid=True
2026-05-28T19:18:49.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:18:49.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:18:33, diff=16.36324s, valid=True
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:18:49.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:18:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:12, diff=-22.633794s, valid=True
2026-05-28T19:18:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:18:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:18:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:18:49.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921371.366865s, valid=True
2026-05-28T19:18:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:18:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:18:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:18:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:18:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:18:49.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:18:49.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:18:49.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:18:49.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:18:49.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:18:49.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:18:49.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:18:49.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:18:49.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:18:50.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:18:50.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:18:50.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:18:50.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:18:50.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-28T19:18:50.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-28T19:18:50.565 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:18:50.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:19:20.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:19:20.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:19:20.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:19:20.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:19:20.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:19:20.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:19:20.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:19:20.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:19:20.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-28T19:19:20.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:19:20.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:19:20.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:19:20.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-28T19:19:23.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-28T19:19:23.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:19:23.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:19:23.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:19:23.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:19:23.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:19:23.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:19:23.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:19:23.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:19:23.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:19:23.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:19:23.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:19:23.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:19:23.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:19:23.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:19:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:19:23.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:19:23.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:19:23.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:19:23.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:19:23.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:19:23.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:19:23.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:19:23.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:19:23.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:19:07
2026-05-28T19:19:23.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69797, datetime.datetime(2026, 5, 28, 19, 19, 7), datetime.datetime(2026, 5, 28, 19, 19, 6), 'salt', 8.94, 61.93, None, 16.51, 158.43, 6.89, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:19:23.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:19:23.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:19:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:06, diff=17.735745s, valid=True
2026-05-28T19:19:23.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:19:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:19:23.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:12, diff=11.738678s, valid=True
2026-05-28T19:19:23.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:19:23.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:04, diff=19.745405s, valid=True
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:19:23.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:19:23.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:12, diff=11.748494s, valid=True
2026-05-28T19:19:23.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:19:23.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:19:23.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:19:23.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921405.749171s, valid=True
2026-05-28T19:19:23.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:19:23.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:19:23.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:19:23.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:19:23.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:19:23.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:19:23.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:19:23.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:19:23.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:19:23.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:19:23.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:19:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:19:24.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:19:24.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:19:24.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:19:24.675 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:19:24.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:19:24.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:19:24.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-28T19:19:24.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-28T19:19:24.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:19:24.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:19:54.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:19:54.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:19:54.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:19:55.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:19:55.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:19:55.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:19:55.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-28T19:19:55.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:19:55.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-28T19:19:55.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:19:55.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:19:55.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:19:55.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-28T19:19:57.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-28T19:19:57.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:19:57.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:19:57.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:19:57.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:19:57.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:19:57.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:19:57.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:19:57.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:19:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:19:57.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:19:57.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:19:57.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:19:58.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:19:58.008 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:19:58.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:19:58.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:19:58.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:19:58.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:19:58.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:19:58.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:19:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:19:58.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:19:58.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:19:58.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:19:37
2026-05-28T19:19:58.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69798, datetime.datetime(2026, 5, 28, 19, 19, 37), datetime.datetime(2026, 5, 28, 19, 19, 37), 'salt', 8.87, 61.59, None, 16.06, 151.67, 6.96, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:19:58.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:19:58.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:19:58.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:37, diff=21.24948s, valid=True
2026-05-28T19:19:58.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:19:58.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:19:58.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:12, diff=-13.747191s, valid=True
2026-05-28T19:19:58.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:19:58.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:19:58.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:19:36, diff=22.25959s, valid=True
2026-05-28T19:19:58.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:19:58.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:19:58.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:19:58.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:19:58.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:19:58.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:19:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:12, diff=-13.737309s, valid=True
2026-05-28T19:19:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:19:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:19:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:19:58.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921440.263369s, valid=True
2026-05-28T19:19:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:19:58.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:19:58.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:19:58.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:19:58.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:19:58.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:19:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:19:58.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:19:58.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:19:58.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:19:58.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:19:58.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:19:58.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:19:58.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:19:58.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:19:59.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:19:59.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:19:59.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:19:59.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-28T19:19:59.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-28T19:19:59.533 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:19:59.533 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:20:29.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:20:29.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:20:29.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:20:30.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:20:30.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:20:30.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:20:30.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-28T19:20:30.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:20: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-28T19:20:30.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:20:30.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:20:30.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:20:30.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-28T19:20:32.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-28T19:20:32.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:20:32.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:20:32.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:20:32.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:20:32.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:20:32.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:20:32.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:20:32.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:20:32.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:20:32.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:20:32.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:20:32.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:20:32.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:20:32.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:20:32.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:20:32.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:20:32.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:20:32.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:20:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:20:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:20:32.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:20:32.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:20:32.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:20:33.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:20:07
2026-05-28T19:20:33.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69799, datetime.datetime(2026, 5, 28, 19, 20, 7), datetime.datetime(2026, 5, 28, 19, 20, 7), 'salt', 8.91, 61.33, None, 14.08, 147.61, 7.03, 831.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:20:33.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:20:33.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:20:33.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:07, diff=26.040698s, valid=True
2026-05-28T19:20:33.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:20:33.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:20:33.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:12, diff=21.043507s, valid=True
2026-05-28T19:20:33.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:20:33.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:20:33.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:07, diff=26.049931s, valid=True
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:20:33.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:20:33.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:12, diff=21.052881s, valid=True
2026-05-28T19:20:33.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:20:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:20:33.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:20:33.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921475.053548s, valid=True
2026-05-28T19:20:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:20:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:20:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:20:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:20:33.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:20:33.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:20:33.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:20:33.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:20:33.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:20:33.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:20:33.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:20:33.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:20:33.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:20:33.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:20:33.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:20:33.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:20:34.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:20:34.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:20:34.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-28T19:20:34.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-28T19:20:34.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:20:34.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:21:04.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:21:04.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:21:04.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:21:04.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:21:04.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:21:04.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:21:04.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-28T19:21:04.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:21:04.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:21:04.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:21:04.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:21:04.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:21:04.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-28T19:21:07.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-28T19:21:07.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:21:07.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:21:07.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:21:07.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:21:07.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:21:07.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:21:07.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:21:07.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:21:07.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:21:07.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:21:07.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:21:07.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:21:07.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:21:07.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:21:07.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:21:07.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:21:07.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:21:07.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:21:07.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:21:07.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:21:07.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:21:07.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:21:07.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:21:07.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:20:37
2026-05-28T19:21:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69800, datetime.datetime(2026, 5, 28, 19, 20, 37), datetime.datetime(2026, 5, 28, 19, 20, 37), 'salt', 8.97, 61.2, None, 16.06, 143.34, 7.06, 830.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:21:07.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:21:07.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:21:07.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:37, diff=30.744263s, valid=True
2026-05-28T19:21:07.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:21:07.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:21:07.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:21:12, diff=-4.252879s, valid=True
2026-05-28T19:21:07.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:21:07.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:21:07.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:20:34, diff=33.753722s, valid=True
2026-05-28T19:21:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:21:07.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:21:07.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:21:07.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:21:07.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:21:07.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:21:07.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:21:12, diff=-4.243243s, valid=True
2026-05-28T19:21:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:21:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:21:07.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:21:07.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921509.757409s, valid=True
2026-05-28T19:21:07.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:21:07.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:21:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:21:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:21:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:21:07.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:21:07.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:21:07.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:21:07.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:21:07.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:21:07.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:21:07.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:21:08.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:21:08.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:21:08.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:21:08.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:21:08.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:21:08.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:21:08.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-28T19:21:08.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-28T19:21:08.889 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:21:08.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:21:38.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:21:38.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:21:38.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:21:39.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:21:39.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:21:39.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:21:39.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-28T19:21:39.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:21:39.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-28T19:21:39.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:21:39.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:21:39.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:21:39.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-28T19:21:41.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-28T19:21:41.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:21:41.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:21:41.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:21:41.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:21:41.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:21:41.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:21:41.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:21:41.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:21:41.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:21:41.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:21:41.625 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:21:41.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:21:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:21:41.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:21:41.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:21:41.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:21:41.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:21:41.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:21:41.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:21:41.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:21:41.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:21:41.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:21:41.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:21:41.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:21:38
2026-05-28T19:21:41.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69802, datetime.datetime(2026, 5, 28, 19, 21, 38), datetime.datetime(2026, 5, 28, 19, 21, 37), 'salt', 8.94, 61.03, None, 14.57, 158.15, 7.1, 830.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:21:41.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:21:41.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:21:41.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:21:37, diff=4.941947s, valid=True
2026-05-28T19:21:41.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:21:41.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:21:41.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:12, diff=-30.055184s, valid=True
2026-05-28T19:21:41.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:21:41.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:21:34, diff=7.951512s, valid=True
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:21:41.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:21:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:12, diff=-30.045425s, valid=True
2026-05-28T19:21:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:21:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:21:41.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:21:41.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921543.955231s, valid=True
2026-05-28T19:21:41.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:21:41.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:21:41.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:21:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:21:41.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:21:42.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:21:42.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:21:42.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:21:42.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:21:42.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:21:42.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:21:42.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:21:42.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:21:42.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:21:42.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:21:42.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:21:43.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:21:43.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:21:43.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-28T19:21:43.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-28T19:21:43.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:21:43.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:22:13.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:22:13.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:22:13.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:22:13.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:22:13.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:22:13.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:22:13.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-28T19:22:13.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:22:13.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:22:13.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:22:13.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:22:13.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:22:13.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-28T19:22:17.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-28T19:22:17.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:22:17.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:22:17.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:22:17.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:22:17.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:22:17.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:22:17.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:22:17.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:22:17.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:22:17.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:22:17.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:22:17.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:22:17.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:22:17.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:22:17.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:22:17.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:22:17.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:22:17.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:22:17.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:22:17.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:22:17.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:22:17.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:22:17.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:22:17.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:22:08
2026-05-28T19:22:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69803, datetime.datetime(2026, 5, 28, 19, 22, 8), datetime.datetime(2026, 5, 28, 19, 22, 8), 'salt', 8.94, 61.2, None, 13.16, 171.06, 7.06, 831.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:22:17.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:22:17.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:22:17.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:08, diff=9.459026s, valid=True
2026-05-28T19:22:17.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:22:17.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:22:17.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:12, diff=5.461823s, valid=True
2026-05-28T19:22:17.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:22:17.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:05, diff=12.468327s, valid=True
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:22:17.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:22:17.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:12, diff=5.47131s, valid=True
2026-05-28T19:22:17.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:22:17.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:22:17.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:22:17.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921579.471972s, valid=True
2026-05-28T19:22:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:22:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:22:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:22:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:22:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:22:17.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:22:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:22:17.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:22:17.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:22:17.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:22:17.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:22:17.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:22:17.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:22:17.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:22:18.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:22:18.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:22:18.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:22:18.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:22:18.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-28T19:22:18.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-28T19:22:18.565 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:22:18.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:22:48.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:22:48.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:22:48.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:22:48.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:22:48.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:22:49.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:22:49.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-28T19:22:49.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:22:49.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:22:49.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:22:49.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:22:49.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:22:49.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:22:51.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-28T19:22:51.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:22:51.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:22:51.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:22:51.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:22:51.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:22:51.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:22:51.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:22:51.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:22:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:22:51.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:22:51.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:22:51.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:22:51.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:22:51.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:22:51.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:22:51.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:22:51.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:22:51.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:22:51.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:22:51.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:22:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:22:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:22:51.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:22:51.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:22:38
2026-05-28T19:22:51.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69804, datetime.datetime(2026, 5, 28, 19, 22, 38), datetime.datetime(2026, 5, 28, 19, 22, 38), 'salt', 8.81, 61.4, None, 13.87, 165.92, 7.01, 830.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:22:51.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:22:51.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:22:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:38, diff=13.858501s, valid=True
2026-05-28T19:22:51.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:22:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:22:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:12, diff=-20.138568s, valid=True
2026-05-28T19:22:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:22:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:22:35, diff=16.868071s, valid=True
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:22:51.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:22:51.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:12, diff=-20.128908s, valid=True
2026-05-28T19:22:51.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:22:51.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:22:51.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:22:51.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921613.871764s, valid=True
2026-05-28T19:22:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:22:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:22:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:22:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:22:51.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:22:51.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:22:51.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:22:51.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:22:51.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:22:52.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:22:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:22:52.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:22:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:22:52.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:22:52.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:22:52.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:22:52.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:22:52.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:22:52.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-28T19:22:52.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-28T19:22:53.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:22:53.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:23:23.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:23:23.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:23:23.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:23:23.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:23:23.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:23:23.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:23:23.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:23:23.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:23:23.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-28T19:23:23.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:23:23.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:23:23.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:23:23.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-28T19:23:26.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-28T19:23:26.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:23:26.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:23:26.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:23:26.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:23:26.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:23:26.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:23:26.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:23:26.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:23:26.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:23:26.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:23:26.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:23:26.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:23:26.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:23:26.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:23:26.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:23:26.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:23:26.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:23:26.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:23:26.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:23:26.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:23:26.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:23:26.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:23:26.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:23:26.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:23:08
2026-05-28T19:23:26.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69805, datetime.datetime(2026, 5, 28, 19, 23, 8), datetime.datetime(2026, 5, 28, 19, 23, 8), 'salt', 8.74, 62.06, None, 12.81, 158.5, 6.85, 831.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:23:26.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:23:26.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:23:26.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:08, diff=18.746534s, valid=True
2026-05-28T19:23:26.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:23:26.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:23:26.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:12, diff=14.749369s, valid=True
2026-05-28T19:23:26.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:23:26.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:23:26.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:05, diff=21.755924s, valid=True
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:23:26.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:23:26.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:12, diff=14.758954s, valid=True
2026-05-28T19:23:26.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:23:26.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:23:26.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:23:26.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921648.759605s, valid=True
2026-05-28T19:23:26.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:23:26.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:23:26.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:23:26.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:23:26.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:23:26.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:23:26.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:23:26.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:23:26.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:23:26.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:23:26.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:23:26.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:23:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:23:27.083 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:23:27.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:23:27.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:23:27.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:23:27.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:23:27.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-28T19:23:27.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-28T19:23:27.983 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:23:27.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:23:58.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:23:58.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:23:58.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:23:58.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:23:58.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:23:58.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:23:58.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-28T19:23:58.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:23:58.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-28T19:23:58.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:23:58.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:23:58.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:23:58.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-28T19:24:01.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-28T19:24:01.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:24:01.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:24:01.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:24:01.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:24:01.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:24:01.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:24:01.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:24:01.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:24:01.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:24:01.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:24:01.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:24:01.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:24:01.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:24:01.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:24:01.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:24:01.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:24:01.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:24:01.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:24:01.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:24:01.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:24:01.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:24:01.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:24:01.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:24:01.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:23:39
2026-05-28T19:24:01.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69806, datetime.datetime(2026, 5, 28, 19, 23, 39), datetime.datetime(2026, 5, 28, 19, 23, 38), 'salt', 8.74, 62.46, None, 14.79, 163.08, 6.76, 830.89, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:24:01.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:24:01.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:24:01.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:38, diff=23.638995s, valid=True
2026-05-28T19:24:01.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:24:01.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:24:01.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:12, diff=-10.358102s, valid=True
2026-05-28T19:24:01.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:24:01.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:24:01.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:23:37, diff=24.648696s, valid=True
2026-05-28T19:24:01.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:24:01.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:24:01.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:24:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:24:01.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:24:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:24:01.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:12, diff=-10.348253s, valid=True
2026-05-28T19:24:01.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:24:01.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:24:01.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:24:01.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921683.652411s, valid=True
2026-05-28T19:24:01.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:24:01.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:24:01.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:24:01.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:24:01.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:24:01.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:24:01.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:24:01.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:24:01.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:24:01.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:24:01.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:24:01.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:24:02.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:24:02.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:24:02.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:24:02.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:24:02.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:24:02.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:24:02.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-28T19:24:02.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-28T19:24:02.881 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:24:02.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:24:32.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:24:32.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:24:32.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:24:33.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:24:33.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:24:33.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:24: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-28T19:24:33.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:24:33.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:24:33.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:24:33.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:24:33.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:24:33.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-28T19:24:36.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-28T19:24:36.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:24:36.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:24:36.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:24:36.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:24:36.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:24:36.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:24:36.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:24:36.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:24:36.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:24:36.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:24:36.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:24:36.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:24:36.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T19:24:36.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:24:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T19:24:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:24:36.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:24:36.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:24:36.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:24:36.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:24:36.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:24:36.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:24:36.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:24:36.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:24:09
2026-05-28T19:24:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69807, datetime.datetime(2026, 5, 28, 19, 24, 9), datetime.datetime(2026, 5, 28, 19, 24, 9), 'salt', 8.61, 62.96, None, 15.7, 168.55, 6.65, 831.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:24:36.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:24:36.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T19:24:36.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:09, diff=27.474077s, valid=True
2026-05-28T19:24:36.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:24:36.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:24:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:12, diff=24.476885s, valid=True
2026-05-28T19:24:36.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:24:36.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:08, diff=28.483305s, valid=True
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:24:36.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:24:36.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:24:12, diff=24.486273s, valid=True
2026-05-28T19:24:36.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:24:36.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:24:36.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:24:36.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921718.486925s, valid=True
2026-05-28T19:24:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:24:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:24:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:24:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:24:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:24:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:24:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:24:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:24:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:24:36.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:24:36.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:24:36.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:24:36.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:24:36.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:24:37.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:24:37.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:24:37.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:24:37.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:24:37.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-28T19:24:37.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-28T19:24:37.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:24:37.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:25:07.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:25:07.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:25:07.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:25:08.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:25:08.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:25:08.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:25:08.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-28T19:25:08.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:25:08.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-28T19:25:08.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:25:08.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:25:08.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:25:08.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-28T19:25:11.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-28T19:25:11.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:25:11.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:25:11.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:25:11.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:25:11.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:25:11.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:25:11.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:25:11.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:25:11.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:25:11.093 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:25:11.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:25:11.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:25:11.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:25:11.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:25:11.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:25:11.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:25:11.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:25:11.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:25:11.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:25:11.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:25:11.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:25:11.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:25:11.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:25:11.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:25:09
2026-05-28T19:25:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69809, datetime.datetime(2026, 5, 28, 19, 25, 9), datetime.datetime(2026, 5, 28, 19, 25, 9), 'salt', 8.51, 63.72, None, 15.07, 164.96, 6.47, 831.01, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:25:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:25:11.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:25:11.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:09, diff=2.444715s, valid=True
2026-05-28T19:25:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:25:11.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:25:11.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:12, diff=-0.552421s, valid=True
2026-05-28T19:25:11.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:25:11.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:06, diff=5.454382s, valid=True
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:25:11.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:25:11.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:12, diff=-0.542496s, valid=True
2026-05-28T19:25:11.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:25:11.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:25:11.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:25:11.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921753.45818s, valid=True
2026-05-28T19:25:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:25:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:25:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:25:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:25:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:25:11.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:25:11.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:25:11.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:25:11.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:25:11.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:25:11.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:25:11.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:25:11.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:25:11.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:25:12.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:25:12.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:25:12.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:25:12.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:25:12.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-28T19:25:12.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:25:12.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:25:12.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:25:42.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:25:42.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:25:42.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:25:42.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:25:42.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:25:42.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:25:42.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:25:42.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:25: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-28T19:25:42.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:25:42.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:25:42.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:25:42.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-28T19:25:45.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-28T19:25:45.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:25:45.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:25:45.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:25:45.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:25:45.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:25:45.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:25:45.472 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:25:45.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:25:45.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:25:45.473 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:25:45.473 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:25:45.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:25:45.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:25:45.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:25:45.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:25:45.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:25:45.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:25:45.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:25:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:25:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:25:45.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:25:45.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:25:45.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:25:45.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:25:40
2026-05-28T19:25:45.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69810, datetime.datetime(2026, 5, 28, 19, 25, 40), datetime.datetime(2026, 5, 28, 19, 25, 39), 'salt', 8.41, 64.02, None, 15.81, 159.7, 6.4, 831.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:25:45.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:25:45.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:25:45.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:39, diff=6.81186s, valid=True
2026-05-28T19:25:45.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:25:45.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:25:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:12, diff=-26.185238s, valid=True
2026-05-28T19:25:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:25:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:25:36, diff=9.821407s, valid=True
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:25:45.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:25:45.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:12, diff=-26.175493s, valid=True
2026-05-28T19:25:45.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:25:45.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:25:45.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:25:45.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921787.825184s, valid=True
2026-05-28T19:25:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:25:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:25:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:25:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:25:45.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:25:45.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:25:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:25:45.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:25:45.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:25:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:25:46.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:25:46.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:25:46.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:25:46.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:25:46.368 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:25:46.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:25:46.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:25:46.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:25:46.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-28T19:25:46.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-28T19:25:46.945 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:25:46.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:26:16.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:26:16.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:26:16.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:26:17.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:26:17.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:26:17.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:26:17.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:26:17.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:26: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-28T19:26:17.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:26:17.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:26:17.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:26:17.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-28T19:26:20.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-28T19:26:20.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:26:20.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:26:20.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:26:20.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:26:20.713 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:26:20.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:26:20.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:26:20.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:26:20.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:26:20.728 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:26:20.728 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:26:20.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:26:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:26:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:26:20.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:26:20.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:26:20.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:26:20.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:26:21.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:26:21.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:26:21.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:26:21.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:26:21.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:26:21.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:26:10
2026-05-28T19:26:21.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69811, datetime.datetime(2026, 5, 28, 19, 26, 10), datetime.datetime(2026, 5, 28, 19, 26, 9), 'salt', 8.51, 64.58, None, 14.86, 161.44, 6.28, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:26:21.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:26:21.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:26:21.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:09, diff=12.143555s, valid=True
2026-05-28T19:26:21.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:26:21.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:26:21.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:12, diff=9.14645s, valid=True
2026-05-28T19:26:21.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:26:21.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:06, diff=15.153181s, valid=True
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:26:21.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:26:21.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:12, diff=9.156372s, valid=True
2026-05-28T19:26:21.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:26:21.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:26:21.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:26:21.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921823.15705s, valid=True
2026-05-28T19:26:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:26:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:26:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:26:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:26:21.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:26:21.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:26:21.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:26:21.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:26:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:26:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:26:21.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:26:21.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:26:21.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:26:21.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:26:21.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:26:22.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:26:22.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:26:22.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:26:22.163 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:26:22.163 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:26:23.164 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:26:23.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:26:53.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:26:53.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:26:53.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:26:53.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:26:53.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:26:53.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:26:53.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-28T19:26:53.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:26:53.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-28T19:26:53.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:26:53.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:26:53.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:26:53.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:26:56.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-28T19:26:56.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:26:56.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:26:56.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:26:56.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:26:56.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:26:56.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:26:56.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:26:56.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:26:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:26:56.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:26:56.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:26:56.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:26:56.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:26:56.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:26:56.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:26:56.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:26:56.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:26:56.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:26:56.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:26:56.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:26:56.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:26:56.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:26:56.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:26:56.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:26:40
2026-05-28T19:26:56.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69812, datetime.datetime(2026, 5, 28, 19, 26, 40), datetime.datetime(2026, 5, 28, 19, 26, 40), 'salt', 8.51, 64.65, None, 13.27, 166.44, 6.27, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:26:56.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:26:56.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:26:56.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:40, diff=16.806767s, valid=True
2026-05-28T19:26:56.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:26:56.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:26:56.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:12, diff=-15.190465s, valid=True
2026-05-28T19:26:56.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:26:56.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:26:37, diff=19.8161s, valid=True
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:26:56.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:26:56.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:12, diff=-15.180869s, valid=True
2026-05-28T19:26:56.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:26:56.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:26:56.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:26:56.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921858.819796s, valid=True
2026-05-28T19:26:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:26:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:26:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:26:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:26:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:26:56.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:26:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:26:56.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:26:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:26:56.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:26:57.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:26:57.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:26:57.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:26:57.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:26:57.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:26:57.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:26:57.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:26:57.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:26:57.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-28T19:26:57.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-28T19:26:58.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:26:58.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:27:28.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:27:28.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:27:28.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:27:28.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:27:28.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:27:28.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:27:28.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:27:28.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:27:28.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-28T19:27:28.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:27:28.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:27:28.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:27:28.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-28T19:27:30.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-28T19:27:30.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:27:30.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:27:30.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:27:30.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:27:30.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:27:30.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:27:30.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:27:30.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:27:30.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:27:30.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:27:30.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:27:30.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:27:30.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:27:30.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:27:31.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:27:31.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:27:31.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:27:31.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:27:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:27:31.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:27:31.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:27:31.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:27:31.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:27:31.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:27:10
2026-05-28T19:27:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69813, datetime.datetime(2026, 5, 28, 19, 27, 10), datetime.datetime(2026, 5, 28, 19, 27, 10), 'salt', 8.41, 64.85, None, 13.2, 165.64, 6.22, 831.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:27:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:27:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:27:31.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:10, diff=21.20316s, valid=True
2026-05-28T19:27:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:27:31.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:27:31.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:12, diff=19.206021s, valid=True
2026-05-28T19:27:31.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:27:31.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:27:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:07, diff=24.21283s, valid=True
2026-05-28T19:27:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:27:31.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:27:31.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:27:31.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:27:31.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:27:31.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:27:31.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:12, diff=19.215866s, valid=True
2026-05-28T19:27:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:27:31.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:27:31.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:27:31.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921893.216519s, valid=True
2026-05-28T19:27:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:27:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:27:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:27:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:27:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:27:31.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:27:31.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:27:31.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:27:31.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:27:31.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:27:31.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:27:31.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:27:31.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:27:31.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:27:31.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:27:32.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:27:32.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:27:32.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:27:32.211 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:27:32.211 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:27:32.396 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:27:32.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:28:02.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:28:02.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:28:02.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:28:02.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:28:02.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:28:02.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:28:02.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-28T19:28:02.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:28:02.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-28T19:28:02.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:28:02.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:28:02.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:28:02.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-28T19:28:06.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-28T19:28:06.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:28:06.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:28:06.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:28:06.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:28:06.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:28:06.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:28:06.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:28:06.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:28:06.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:28:06.442 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:28:06.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:28:06.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:28:06.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:28:06.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:28:06.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:28:06.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:28:06.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:28:06.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:28:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:28:06.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:28:06.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:28:06.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:28:06.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:28:06.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:27:40
2026-05-28T19:28:06.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69814, datetime.datetime(2026, 5, 28, 19, 27, 40), datetime.datetime(2026, 5, 28, 19, 27, 40), 'salt', 8.45, 64.88, None, 13.27, 163.46, 6.22, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:28:06.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:28:06.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:28:06.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:40, diff=26.799725s, valid=True
2026-05-28T19:28:06.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:28:06.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:28:06.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:28:12, diff=-5.197472s, valid=True
2026-05-28T19:28:06.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:28:06.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:27:39, diff=27.811025s, valid=True
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:28:06.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:28:06.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:28:12, diff=-5.185036s, valid=True
2026-05-28T19:28:06.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:28:06.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:28:06.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:28:06.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921928.815808s, valid=True
2026-05-28T19:28:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:28:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:28:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:28:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:28:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:28:06.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:28:06.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:28:06.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:28:06.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:28:06.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:28:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:28:07.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:28:07.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:28:07.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:28:07.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:28:07.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:28:07.908 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:28:07.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:28:07.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-28T19:28:07.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-28T19:28:08.155 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:28:08.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:28:38.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:28:38.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:28:38.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:28:38.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:28:38.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:28:38.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:28:38.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-28T19:28:38.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:28:38.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-28T19:28:38.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:28:38.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:28:38.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:28:38.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-28T19:28:40.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:28:40.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:28:40.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:28:40.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:28:40.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:28:40.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:28:41.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:28:41.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:28:41.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:28:41.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:28:41.003 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:28:41.003 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:28:41.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:28:41.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:28:41.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:28:41.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:28:41.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:28:41.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:28:41.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:28:41.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:28:41.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:28:41.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:28:41.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:28:41.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:28:41.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:28:41
2026-05-28T19:28:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69816, datetime.datetime(2026, 5, 28, 19, 28, 41), datetime.datetime(2026, 5, 28, 19, 28, 41), 'salt', 8.41, 65.18, None, 13.3, 174.68, 6.15, 831.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:28:41.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:28:41.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:28:41.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:28:41, diff=0.330705s, valid=True
2026-05-28T19:28:41.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:28:41.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:28:41.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:12, diff=-30.666475s, valid=True
2026-05-28T19:28:41.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:28:41.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:28:38, diff=3.340149s, valid=True
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:28:41.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:28:41.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:12, diff=-30.656833s, valid=True
2026-05-28T19:28:41.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:28:41.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:28:41.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:28:41.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921963.343853s, valid=True
2026-05-28T19:28:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:28:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:28:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:28:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:28:41.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:28:41.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:28:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:28:41.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:28:41.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:28:41.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:28:41.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:28:41.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:28:41.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:28:41.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:28:41.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:28:42.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:28:42.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:28:42.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:28:42.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-28T19:28:42.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-28T19:28:42.426 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:28:42.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:29:12.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:29:12.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:29:12.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:29:12.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:29:12.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:29:12.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:29:12.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-28T19:29:12.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:29:12.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-28T19:29:12.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:29:12.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:29:12.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:29:12.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-28T19:29:15.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-28T19:29:15.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:29:15.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:29:15.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:29:15.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:29:15.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:29:15.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:29:15.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:29:15.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:29:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:29:15.811 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:29:15.811 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:29:15.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:29:15.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:29:15.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:29:15.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:29:15.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:29:16.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:29:16.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:29:16.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:29:16.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:29:16.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:29:16.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:29:16.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:29:16.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:29:11
2026-05-28T19:29:16.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69817, datetime.datetime(2026, 5, 28, 19, 29, 11), datetime.datetime(2026, 5, 28, 19, 29, 11), 'salt', 8.45, 65.35, None, 11.89, 163.67, 6.12, 830.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:29:16.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:29:16.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:29:16.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:11, diff=5.140202s, valid=True
2026-05-28T19:29:16.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:29:16.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:29:16.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:12, diff=4.14305s, valid=True
2026-05-28T19:29:16.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:29:16.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:08, diff=8.1496s, valid=True
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:29:16.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:29:16.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:29:16.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:12, diff=4.152632s, valid=True
2026-05-28T19:29:16.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:29:16.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:29:16.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:29:16.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=921998.153294s, valid=True
2026-05-28T19:29:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:29:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:29:16.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:29:16.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:29:16.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:29:16.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:29:16.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:29:16.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:29:16.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:29:16.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:29:16.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:29:16.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:29:16.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:29:16.545 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:29:16.759 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:29:17.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:29:17.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:29:17.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:29:17.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-28T19:29:17.217 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:29:17.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:29:17.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:29:47.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:29:47.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:29:47.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:29:47.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:29:47.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:29:47.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:29:47.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-28T19:29:47.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:29:47.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-28T19:29:47.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:29:47.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:29:47.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:29:47.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:29:50.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-28T19:29:50.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:29:50.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:29:50.428 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:29:50.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:29:50.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:29:50.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:29:50.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:29:50.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:29:50.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:29:50.450 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:29:50.450 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:29:50.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:29:50.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:29:50.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:29:50.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:29:50.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:29:50.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:29:50.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:29:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:29:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:29:50.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:29:50.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:29:50.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:29:50.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:29:41
2026-05-28T19:29:50.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69818, datetime.datetime(2026, 5, 28, 19, 29, 41), datetime.datetime(2026, 5, 28, 19, 29, 41), 'salt', 8.48, 65.55, None, 14.57, 167.05, 6.08, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:29:50.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:29:50.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:29:50.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:41, diff=9.763511s, valid=True
2026-05-28T19:29:50.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:29:50.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:29:50.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:12, diff=-21.23366s, valid=True
2026-05-28T19:29:50.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:29:50.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:29:50.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:29:39, diff=11.772857s, valid=True
2026-05-28T19:29:50.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:29:50.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:29:50.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:29:50.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:29:50.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:29:50.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:29:50.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:12, diff=-21.224123s, valid=True
2026-05-28T19:29:50.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:29:50.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:29:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:29:50.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922032.776524s, valid=True
2026-05-28T19:29:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:29:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:29:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:29:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:29:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:29:50.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:29:50.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:29:50.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:29:50.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:29:50.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:29:50.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:29:51.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:29:51.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:29:51.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:29:51.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:29:51.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:29:51.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:29:51.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:29:51.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-28T19:29:51.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-28T19:29:52.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:29:52.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:30:22.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:30:22.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:30:22.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:30:22.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:30:22.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:30:22.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:30:22.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-28T19:30:22.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:30:22.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-28T19:30:22.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:30:22.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:30:22.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:30:22.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-28T19:30:25.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:30:25.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:30:25.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:30:25.028 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:30:25.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:30:25.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:30:25.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:30:25.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:30:25.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:30:25.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:30:25.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:30:25.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:30:25.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:30:25.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:30:25.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:30:25.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:30:25.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:30:25.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:30:25.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:30:25.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:30:25.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:30:25.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:30:25.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:30:25.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:30:25.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:30:12
2026-05-28T19:30:25.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69819, datetime.datetime(2026, 5, 28, 19, 30, 12), datetime.datetime(2026, 5, 28, 19, 30, 11), 'salt', 8.41, 65.55, None, 16.13, 169.61, 6.07, 831.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:30:25.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:30:25.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:30:25.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:11, diff=14.392657s, valid=True
2026-05-28T19:30:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:30:25.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:30:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:12, diff=13.395486s, valid=True
2026-05-28T19:30:25.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:30:25.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:30:25.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:09, diff=16.40476s, valid=True
2026-05-28T19:30:25.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:30:25.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:30:25.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:30:25.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:30:25.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:30:25.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:30:25.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:12, diff=13.409382s, valid=True
2026-05-28T19:30:25.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:30:25.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:30:25.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:30:25.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922067.410404s, valid=True
2026-05-28T19:30:25.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:30:25.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:30:25.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:30:25.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:30:25.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:30:25.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:30:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:30:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:30:25.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:30:25.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:30:25.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:30:25.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:30:25.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:30:25.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:30:26.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:30:26.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:30:26.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:30:26.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:30: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-28T19:30: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-28T19:30:26.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:30:26.708 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:30:56.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:30:56.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:30:56.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:30:57.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:30:57.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:30:57.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:30:57.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:30:57.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:30:57.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:30:57.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:30:57.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:30:57.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:30:57.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:31:00.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-28T19:31:00.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:31:00.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:31:00.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:31:00.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:31:00.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:31:00.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:31:00.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:31:00.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:31:00.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:31:00.564 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:31:00.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:31:00.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:31:00.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:31:00.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:31:00.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:31:00.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:31:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:31:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:31:00.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:31:00.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:31:00.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:31:00.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:31:00.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:31:00.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:30:42
2026-05-28T19:31:00.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69820, datetime.datetime(2026, 5, 28, 19, 30, 42), datetime.datetime(2026, 5, 28, 19, 30, 41), 'salt', 8.45, 65.71, None, 13.23, 165.81, 6.04, 831.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:31:00.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:31:00.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:31:00.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:41, diff=19.889069s, valid=True
2026-05-28T19:31:00.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:31:00.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:31:00.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:12, diff=-11.108104s, valid=True
2026-05-28T19:31:00.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:31:00.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:30:39, diff=21.898444s, valid=True
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:31:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:31:00.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:12, diff=-11.09851s, valid=True
2026-05-28T19:31:00.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:31:00.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:31:00.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:31:00.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922102.902169s, valid=True
2026-05-28T19:31:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:31:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:31:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:31:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:31:00.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:31:00.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:31:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:31:00.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:31:00.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:31:01.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:31:01.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:31:01.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:31:01.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:31:01.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:31:01.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:31:01.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:31:01.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:31:01.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:31:01.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-28T19:31:01.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-28T19:31:02.044 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:31:02.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:31:32.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:31:32.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:31: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-28T19:31:32.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:31:32.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:31:32.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:31:32.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-28T19:31:32.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:31:32.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-28T19:31:32.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:31:32.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:31:32.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:31:32.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-28T19:31:35.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-28T19:31:35.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:31:35.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:31:35.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:31:35.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:31:35.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:31:35.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:31:35.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:31:35.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:31:35.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:31:35.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:31:35.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:31:35.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:31:35.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:31:35.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:31:35.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:31:35.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:31:35.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:31:35.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:31:35.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T19:31:35.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:31:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:31:35.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:31:35.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:31:35.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:31:12
2026-05-28T19:31:35.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69821, datetime.datetime(2026, 5, 28, 19, 31, 12), datetime.datetime(2026, 5, 28, 19, 31, 11), 'salt', 8.41, 66.04, None, 14.54, 168.81, 5.96, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:31:35.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:31:35.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:31:35.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:11, diff=24.77158s, valid=True
2026-05-28T19:31:35.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:31:35.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:31:35.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:12, diff=23.774464s, valid=True
2026-05-28T19:31:35.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:31:35.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:09, diff=26.781132s, valid=True
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:31:35.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T19:31:35.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:31:12, diff=23.784141s, valid=True
2026-05-28T19:31:35.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:31:35.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:31:35.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:31:35.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922137.784811s, valid=True
2026-05-28T19:31:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:31:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:31:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:31:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:31:35.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:31:35.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:31:35.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:31:35.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:31:35.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:31:35.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:31:35.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:31:36.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:31:36.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:31:36.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:31:36.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:31:36.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:31:36.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:31:36.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:31:36.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-28T19:31:36.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-28T19:31:40.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:31:40.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:32:10.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:32:10.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:32:10.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:32:10.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:32:10.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:32:10.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:32:10.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-28T19:32:10.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:32:10.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-28T19:32:10.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:32:10.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:32:10.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:32:10.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-28T19:32:13.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:32:13.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:32:13.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:32:13.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:32:13.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:32:13.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:32:13.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:32:13.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:32:13.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:32:13.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:32:13.325 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:32:13.325 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:32:13.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:32:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:32:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:32:13.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:32:13.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:32:13.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:32:13.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:32:13.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T19:32:13.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:32:13.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:32:13.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:32:13.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:32:13.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:32:12
2026-05-28T19:32:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69823, datetime.datetime(2026, 5, 28, 19, 32, 12), datetime.datetime(2026, 5, 28, 19, 32, 12), 'salt', 8.32, 66.41, None, 14.89, 170.85, 5.89, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:32:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:32:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:32:13.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:12, diff=1.670629s, valid=True
2026-05-28T19:32:13.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:32:13.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:32:13.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:12, diff=1.673482s, valid=True
2026-05-28T19:32:13.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:32:13.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:11, diff=2.680071s, valid=True
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:32:13.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T19:32:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:12, diff=1.68308s, valid=True
2026-05-28T19:32:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:32:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:32:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:32:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922175.68374s, valid=True
2026-05-28T19:32:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:32:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:32:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:32:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:32:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:32:13.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:32:13.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:32:13.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:32:13.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:32:13.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:32:13.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:32:13.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:32:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:32:14.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:32:14.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:32:14.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:32:14.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:32:14.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:32:14.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-28T19:32:14.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-28T19:32:15.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:32:15.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:32:45.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:32:45.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:32:45.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:32:45.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:32:45.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:32:45.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:32:45.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:32:45.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:32:45.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-28T19:32:45.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:32:45.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:32:45.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:32:45.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-28T19:32:48.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:32:48.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:32:48.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:32:48.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:32:48.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:32:48.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:32:48.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:32:48.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:32:48.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:32:48.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:32:48.974 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:32:48.974 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:32:48.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:32:49.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:32:49.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:32:49.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:32:49.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:32:49.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:32:49.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:32:49.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:32:49.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:32:49.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:32:49.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:32:49.229 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:32:49.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:32:43
2026-05-28T19:32:49.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69824, datetime.datetime(2026, 5, 28, 19, 32, 43), datetime.datetime(2026, 5, 28, 19, 32, 42), 'salt', 8.38, 66.48, None, 15.42, 170.62, 5.87, 831.02, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:32:49.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:32:49.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:32:49.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:42, diff=7.294682s, valid=True
2026-05-28T19:32:49.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:32:49.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:32:49.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:12, diff=-22.702495s, valid=True
2026-05-28T19:32:49.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:32:49.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:32:40, diff=9.304125s, valid=True
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:32:49.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:32:49.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:12, diff=-22.692875s, valid=True
2026-05-28T19:32:49.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:32:49.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:32:49.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:32:49.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922211.307781s, valid=True
2026-05-28T19:32:49.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:32:49.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:32:49.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:32:49.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:32:49.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:32:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:32:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:32:49.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:32:49.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:32:49.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:32:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:32:49.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:32:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:32:49.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:32:49.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:32:50.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:32:50.366 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:32:50.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:32:50.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-28T19:32:50.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-28T19:32:50.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:32:50.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:33:20.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:33:20.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:33:20.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:33:21.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:33:21.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:33:21.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:33:21.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-28T19:33:21.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:33:21.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:33:21.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:33:21.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:33:21.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:33:21.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:33:23.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-28T19:33:23.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:33:23.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:33:23.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:33:23.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:33:23.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:33:23.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:33:23.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:33:23.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:33:23.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:33:23.827 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:33:23.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:33:23.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:33:23.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:33:23.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:33:24.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:33:24.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:33:24.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:33:24.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:33:24.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T19:33:24.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:33:24.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:33:24.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:33:24.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:33:24.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:33:13
2026-05-28T19:33:24.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69825, datetime.datetime(2026, 5, 28, 19, 33, 13), datetime.datetime(2026, 5, 28, 19, 33, 12), 'salt', 8.35, 66.34, None, 15.28, 170.78, 5.9, 831.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:33:24.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:33:24.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:33:24.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:12, diff=12.162221s, valid=True
2026-05-28T19:33:24.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:33:24.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:33:24.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:12, diff=12.169798s, valid=True
2026-05-28T19:33:24.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:33:24.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:33:24.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:10, diff=14.186844s, valid=True
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:33:24.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T19:33:24.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:12, diff=12.194387s, valid=True
2026-05-28T19:33:24.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:33:24.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:33:24.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:33:24.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922246.1959s, valid=True
2026-05-28T19:33:24.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:33:24.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:33:24.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:33:24.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:33:24.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:33:24.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:33:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:33:24.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:33:24.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:33:24.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:33:24.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:33:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:33:24.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:33:24.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:33:24.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:33:25.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:33:25.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:33:25.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:33:25.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-28T19:33:25.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-28T19:33:25.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:33:25.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:33:55.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:33:55.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:33:55.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:33:55.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:33:55.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:33:56.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:33:56.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-28T19:33:56.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:33:56.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-28T19:33:56.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:33:56.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:33:56.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:33:56.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-28T19:33:58.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-28T19:33:58.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:33:58.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:33:58.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:33:58.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:33:58.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:33:58.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:33:58.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:33:58.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:33:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:33:58.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:33:58.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:33:58.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:33:58.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:33:58.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:33:58.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:33:58.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:33:58.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:33:58.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:33:58.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:33:58.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:33:58.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:33:58.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:33:58.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:33:58.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:33:43
2026-05-28T19:33:58.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69826, datetime.datetime(2026, 5, 28, 19, 33, 43), datetime.datetime(2026, 5, 28, 19, 33, 43), 'salt', 8.32, 66.21, None, 14.57, 171.84, 5.93, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:33:58.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:33:58.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:33:58.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:43, diff=15.829851s, valid=True
2026-05-28T19:33:58.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:33:58.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:33:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:12, diff=-13.167324s, valid=True
2026-05-28T19:33:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:33:58.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:33:41, diff=17.839194s, valid=True
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:33:58.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:33:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:12, diff=-13.15781s, valid=True
2026-05-28T19:33:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:33:58.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:33:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:33:58.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922280.842932s, valid=True
2026-05-28T19:33:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:33:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:33:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:33:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:33:58.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:33:58.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:33:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:33:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:33:58.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:33:58.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:33:59.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:33:59.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:33:59.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:33:59.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:33:59.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:33:59.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:33:59.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:33:59.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:33:59.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-28T19:33:59.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-28T19:33:59.946 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:33:59.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:34:29.976 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:34:29.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:34:29.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:34:30.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:34:30.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:34:30.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:34:30.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-28T19:34:30.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:34:30.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-28T19:34:30.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:34:30.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:34:30.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:34:30.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-28T19:34:33.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-28T19:34:33.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:34:33.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:34:33.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:34:33.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:34:33.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:34:33.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:34:33.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:34:33.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:34:33.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:34:33.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:34:33.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:34:33.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:34:33.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:34:33.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:34:33.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:34:33.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:34:33.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:34:33.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:34:33.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:34:33.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:34:33.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:34:33.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:34:33.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:34:33.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:34:13
2026-05-28T19:34:33.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69827, datetime.datetime(2026, 5, 28, 19, 34, 13), datetime.datetime(2026, 5, 28, 19, 34, 13), 'salt', 8.32, 66.14, None, 14.29, 176.18, 5.95, 831.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:34:33.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:34:33.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:34:33.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:13, diff=20.556356s, valid=True
2026-05-28T19:34:33.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:34:33.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:34:33.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:12, diff=21.559243s, valid=True
2026-05-28T19:34:33.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:34:33.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:11, diff=22.565991s, valid=True
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:34:33.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:34:33.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:12, diff=21.56907s, valid=True
2026-05-28T19:34:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:34:33.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:34:33.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:34:33.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922315.569749s, valid=True
2026-05-28T19:34:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:34:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:34:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:34:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:34:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:34:33.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:34:33.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:34:33.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:34:33.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:34:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:34:33.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:34:33.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:34:33.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:34:33.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:34:34.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:34:34.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:34:34.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:34:34.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:34:34.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-28T19:34:34.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-28T19:34:34.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:34:34.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:35:04.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:35:04.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:35:04.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:35:04.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:35:04.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:35:05.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:35:05.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-28T19:35:05.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:35:05.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-28T19:35:05.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:35:05.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:35:05.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:35:05.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-28T19:35:07.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-28T19:35:07.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:35:07.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:35:07.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:35:07.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:35:07.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:35:07.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:35:07.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:35:07.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:35:07.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:35:07.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:35:07.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:35:07.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:35:07.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:35:07.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:35:07.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:35:07.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:35:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:35:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:35:07.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:35:07.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:35:07.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:35:07.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:35:07.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:35:07.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:34:44
2026-05-28T19:35:07.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69828, datetime.datetime(2026, 5, 28, 19, 34, 44), datetime.datetime(2026, 5, 28, 19, 34, 43), 'salt', 8.38, 66.08, None, 13.69, 167.43, 5.96, 831.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:35:07.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:35:07.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:35:07.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:43, diff=24.757807s, valid=True
2026-05-28T19:35:07.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:35:07.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:35:07.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:12, diff=-4.239374s, valid=True
2026-05-28T19:35:07.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:35:07.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:34:41, diff=26.76712s, valid=True
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:35:07.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:35:07.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:12, diff=-4.229878s, valid=True
2026-05-28T19:35:07.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:35:07.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:35:07.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:35:07.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922349.77078s, valid=True
2026-05-28T19:35:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:35:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:35:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:35:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:35:07.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:35:07.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:35:07.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:35:07.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:35:07.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:35:07.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:35:07.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:35:08.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:35:08.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:35:08.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:35:08.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:35:08.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:35:08.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:35:08.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:35:08.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-28T19:35:08.758 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:35:08.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:35:08.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:35:38.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:35:38.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:35:38.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:35:39.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:35:39.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:35:39.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:35:39.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-28T19:35:39.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:35:39.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-28T19:35:39.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:35:39.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:35:39.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:35:39.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-28T19:35:42.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-28T19:35:42.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:35:42.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:35:42.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:35:42.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:35:42.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:35:42.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:35:42.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:35:42.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:35:42.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:35:42.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:35:42.180 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:35:42.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:35:42.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:35:42.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:35:42.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:35:42.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:35:42.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:35:42.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:35:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:35:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:35:42.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:35:42.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:35:42.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:35:42.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:35:14
2026-05-28T19:35:42.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69829, datetime.datetime(2026, 5, 28, 19, 35, 14), datetime.datetime(2026, 5, 28, 19, 35, 13), 'salt', 8.35, 65.88, None, 12.21, 170.95, 6.0, 831.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:35:42.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:35:42.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:35:42.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:13, diff=29.496227s, valid=True
2026-05-28T19:35:42.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:35:42.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:35:42.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:12, diff=30.49909s, valid=True
2026-05-28T19:35:42.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:35:42.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:35:42.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:12, diff=30.505734s, valid=True
2026-05-28T19:35:42.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:35:42.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:35:42.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:35:42.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:35:42.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:35:42.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:35:42.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:35:12, diff=30.508785s, valid=True
2026-05-28T19:35:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:35:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:35:42.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:35:42.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922384.50943s, valid=True
2026-05-28T19:35:42.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:35:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:35:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:35:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:35:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:35:42.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:35:42.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:35:42.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:35:42.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:35:42.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:35:42.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:35:42.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:35:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:35:42.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:35:43.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:35:43.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:35:43.575 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:35:43.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:35:43.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-28T19:35:43.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-28T19:35:43.659 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:35:43.660 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:36:13.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:36:13.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:36:13.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:36:14.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:36:14.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:36:14.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:36:14.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-28T19:36:14.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:36:14.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-28T19:36:14.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:36:14.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:36:14.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:36:14.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:36:17.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-28T19:36:17.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:36:17.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:36:17.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:36:17.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:36:17.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:36:17.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:36:17.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:36:17.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:36:17.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:36:17.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:36:17.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:36:17.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:36:17.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:36:17.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:36:17.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:36:17.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:36:17.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:36:17.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:36:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:36:17.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:36:17.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:36:17.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:36:17.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:36:17.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:36:14
2026-05-28T19:36:17.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69831, datetime.datetime(2026, 5, 28, 19, 36, 14), datetime.datetime(2026, 5, 28, 19, 36, 14), 'salt', 8.32, 66.24, None, 12.03, 170.88, 5.92, 831.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:36:17.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:36:17.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:36:17.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:14, diff=3.388181s, valid=True
2026-05-28T19:36:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:36:17.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:36:17.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:12, diff=5.391011s, valid=True
2026-05-28T19:36:17.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:36:17.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:13, diff=4.397535s, valid=True
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:36:17.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:36:17.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:36:17.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:12, diff=5.400602s, valid=True
2026-05-28T19:36:17.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:36:17.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:36:17.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:36:17.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922419.401274s, valid=True
2026-05-28T19:36:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:36:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:36:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:36:17.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:36:17.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:36:17.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:36:17.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:36:17.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:36:17.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:36:17.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:36:17.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:36:17.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:36:17.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:36:17.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:36:17.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:36:18.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:36:18.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:36:18.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:36:18.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-28T19:36:18.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-28T19:36:18.546 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:36:18.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:36:48.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:36:48.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:36:48.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:36:49.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:36:49.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:36:49.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:36: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-28T19:36:49.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:36:49.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-28T19:36:49.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:36:49.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:36:49.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:36:49.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-28T19:36:51.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-28T19:36:51.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:36:51.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:36:51.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:36:51.638 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:36:51.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:36:51.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:36:51.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:36:51.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:36:51.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:36:51.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:36:51.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:36:51.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:36:51.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:36:51.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:36:51.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:36:51.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:36:51.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:36:51.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:36:51.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:36:51.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:36:51.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:36:51.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:36:51.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:36:52.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:36:44
2026-05-28T19:36:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69832, datetime.datetime(2026, 5, 28, 19, 36, 44), datetime.datetime(2026, 5, 28, 19, 36, 44), 'salt', 8.35, 66.54, None, 12.81, 164.1, 5.86, 831.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:36:52.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:36:52.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:36:52.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:44, diff=8.058475s, valid=True
2026-05-28T19:36:52.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:36:52.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:36:52.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:12, diff=-19.938655s, valid=True
2026-05-28T19:36:52.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:36:52.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:36:42, diff=10.068003s, valid=True
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:36:52.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:36:52.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:12, diff=-19.928942s, valid=True
2026-05-28T19:36:52.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:36:52.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:36:52.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:36:52.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922454.07174s, valid=True
2026-05-28T19:36:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:36:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:36:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:36:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:36:52.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:36:52.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:36:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:36:52.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:36:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:36:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:36:52.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:36:52.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:36:52.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:36:52.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:36:52.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:36:52.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:36:53.054 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:36:53.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:36:53.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-28T19:36:53.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-28T19:36:53.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:36:53.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:37:23.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:37:23.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:37:23.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:37:24.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:37:24.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:37:24.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:37:24.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-28T19:37:24.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:37:24.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-28T19:37:24.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:37:24.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:37:24.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:37:24.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:37:26.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-28T19:37:26.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:37:26.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:37:26.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:37:26.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:37:26.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:37:26.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:37:26.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:37:26.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:37:26.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:37:26.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:37:26.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:37:26.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:37:26.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:37:26.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:37:26.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:37:26.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:37:27.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:37:27.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:37:27.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:37:27.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:37:27.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:37:27.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:37:27.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:37:27.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:37:15
2026-05-28T19:37:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69833, datetime.datetime(2026, 5, 28, 19, 37, 15), datetime.datetime(2026, 5, 28, 19, 37, 14), 'salt', 8.25, 66.61, None, 13.76, 165.11, 5.84, 831.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:37:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:37:27.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:37:27.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:14, diff=13.119398s, valid=True
2026-05-28T19:37:27.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:37:27.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:37:27.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:12, diff=15.122292s, valid=True
2026-05-28T19:37:27.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:37:27.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:12, diff=15.131071s, valid=True
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:37:27.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:37:27.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:12, diff=15.135851s, valid=True
2026-05-28T19:37:27.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:37:27.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:37:27.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:37:27.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922489.13691s, valid=True
2026-05-28T19:37:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:37:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:37:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:37:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:37:27.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:37:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:37:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:37:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:37:27.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:37:27.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:37:27.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:37:27.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:37:27.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:37:27.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:37:27.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:37:28.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:37:28.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:37:28.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:37:28.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-28T19:37:28.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-28T19:37:28.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:37:28.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:37:58.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:37:58.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:37:58.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:37:58.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:37:58.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:37:59.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:37:59.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:37:59.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:37:59.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:37:59.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:37:59.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:37:59.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:37:59.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-28T19:38:01.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-28T19:38:01.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:38:01.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:38:01.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:38:01.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:38:01.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:38:01.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:38:01.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:38:01.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:38:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:38:01.693 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:38:01.693 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:38:01.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:38:01.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:38:01.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:38:01.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:38:01.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:38:01.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:38:01.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:38:01.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:38:01.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:38:01.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:38:01.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:38:01.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:38:02.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:37:45
2026-05-28T19:38:02.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69834, datetime.datetime(2026, 5, 28, 19, 37, 45), datetime.datetime(2026, 5, 28, 19, 37, 44), 'salt', 8.18, 66.48, None, 13.73, 166.12, 5.86, 831.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:38:02.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:38:02.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:38:02.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:44, diff=18.009996s, valid=True
2026-05-28T19:38:02.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:38:02.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:38:02.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:12, diff=-9.987164s, valid=True
2026-05-28T19:38:02.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:38:02.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:37:43, diff=19.019417s, valid=True
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:38:02.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:38:02.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:12, diff=-9.97757s, valid=True
2026-05-28T19:38:02.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:38:02.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:38:02.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:38:02.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922524.023087s, valid=True
2026-05-28T19:38:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:38:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:38:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:38:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:38:02.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:38:02.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:38:02.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:38:02.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:38:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:38:02.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:38:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:38:02.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:38:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:38:02.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:38:02.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:38:02.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:38:02.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:38:02.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:38:02.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-28T19:38:02.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-28T19:38:03.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:38:03.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:38:33.102 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:38:33.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:38:33.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:38:33.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:38:33.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:38:33.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:38:33.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-28T19:38:33.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:38:33.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-28T19:38:33.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:38:33.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:38:33.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:38:33.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-28T19:38: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-28T19:38:36.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:38:36.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:38:36.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:38:36.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:38:36.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:38:36.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:38:36.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:38:37.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:38:37.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:38:37.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:38:37.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:38:37.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:38:37.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:38:37.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:38:37.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:38:37.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:38:37.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:38:37.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:38:37.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:38:37.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:38:37.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:38:37.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:38:37.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:38:37.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:38:15
2026-05-28T19:38:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69835, datetime.datetime(2026, 5, 28, 19, 38, 15), datetime.datetime(2026, 5, 28, 19, 38, 15), 'salt', 8.25, 66.68, None, 13.13, 166.07, 5.82, 831.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:38:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:38:37.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:38:37.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:15, diff=22.361651s, valid=True
2026-05-28T19:38:37.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:38:37.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:38:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:12, diff=25.364476s, valid=True
2026-05-28T19:38:37.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:38:37.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:13, diff=24.371176s, valid=True
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:38:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:38:37.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:12, diff=25.374186s, valid=True
2026-05-28T19:38:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:38:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:38:37.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:38:37.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922559.374847s, valid=True
2026-05-28T19:38:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:38:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:38:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:38:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:38:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:38:37.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:38:37.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:38:37.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:38:37.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:38:37.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:38:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:38:37.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:38:37.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:38:37.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:38:37.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:38:38.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:38:38.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:38:38.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:38:38.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-28T19:38:38.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-28T19:38:38.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:38:38.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:39:08.703 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:39:08.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:39:08.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:39:09.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:39:09.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:39:09.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:39:09.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-28T19:39:09.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:39: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-28T19:39:09.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:39:09.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:39:09.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:39:09.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-28T19:39:11.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-28T19:39:11.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:39:11.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:39:11.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:39:11.877 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:39:11.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:39:11.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:39:11.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:39:11.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:39:11.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:39:11.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:39:11.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:39:11.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:39:11.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:39:11.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:39:12.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:39:12.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:39:12.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:39:12.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:39:12.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:39:12.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:39:12.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:39:12.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:39:12.156 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:39:12.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:38:45
2026-05-28T19:39:12.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69836, datetime.datetime(2026, 5, 28, 19, 38, 45), datetime.datetime(2026, 5, 28, 19, 38, 45), 'salt', 8.25, 66.64, None, 14.79, 164.26, 5.83, 831.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:39:12.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:39:12.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:39:12.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:45, diff=27.218727s, valid=True
2026-05-28T19:39:12.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:39:12.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:39:12.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:39:12, diff=0.221579s, valid=True
2026-05-28T19:39:12.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:39:12.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:38:43, diff=29.228044s, valid=True
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:39:12.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:39:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:39:12, diff=0.231966s, valid=True
2026-05-28T19:39:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:39:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:39:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:39:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922594.232943s, valid=True
2026-05-28T19:39:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:39:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:39:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:39:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:39:12.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:39:12.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:39:12.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:39:12.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:39:12.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:39:12.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:39:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:39:12.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:39:12.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:39:12.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:39:12.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:39:13.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:39:13.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:39:13.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:39:13.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-28T19:39:13.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-28T19:39:13.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:39:13.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:39:43.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:39:43.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:39:43.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:39:43.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:39:43.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:39:43.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:39:43.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-28T19:39:43.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:39:43.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-28T19:39:44.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:39:44.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:39:44.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:39: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-28T19:39:46.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-28T19:39:46.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:39:46.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:39:46.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:39:46.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:39:46.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:39:46.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:39:46.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:39:46.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:39:46.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:39:46.498 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:39:46.498 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:39:46.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:39:46.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:39:46.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:39:46.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:39:46.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:39:46.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:39:46.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:39:46.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:39:46.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:39:46.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:39:46.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:39:46.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:39:46.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:39:46
2026-05-28T19:39:46.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69838, datetime.datetime(2026, 5, 28, 19, 39, 46), datetime.datetime(2026, 5, 28, 19, 39, 45), 'salt', 8.35, 66.35, None, 15.0, 166.8, 5.9, 831.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:39:46.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:39:46.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:39:46.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:39:45, diff=1.815579s, valid=True
2026-05-28T19:39:46.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:39:46.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:39:46.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:12, diff=-25.181486s, valid=True
2026-05-28T19:39:46.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:39:46.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:39:42, diff=4.825166s, valid=True
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:39:46.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:39:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:12, diff=-25.171814s, valid=True
2026-05-28T19:39:46.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:39:46.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:39:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:39:46.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922628.828851s, valid=True
2026-05-28T19:39:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:39:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:39:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:39:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:39:46.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:39:46.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:39:46.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:39:46.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:39:46.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:39:46.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:39:47.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:39:47.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:39:47.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:39:47.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:39:47.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:39:47.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:39:47.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:39:47.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:39:47.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-28T19:39:47.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-28T19:39:47.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:39:47.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:40:17.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:40:17.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:40:17.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:40:18.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:40:18.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:40:18.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:40:18.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-28T19:40:18.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:40:18.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-28T19:40:18.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:40:18.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:40:18.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:40:18.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-28T19:40:21.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-28T19:40:21.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:40:21.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:40:21.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:40:21.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:40:21.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:40:21.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:40:21.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:40:21.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:40:21.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:40:21.378 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:40:21.378 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:40:21.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:40:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:40:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:40:21.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:40:21.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:40:21.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:40:21.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:40:21.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:40:21.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:40:21.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:40:21.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:40:21.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:40:21.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:40:16
2026-05-28T19:40:21.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69839, datetime.datetime(2026, 5, 28, 19, 40, 16), datetime.datetime(2026, 5, 28, 19, 40, 15), 'salt', 8.22, 66.55, None, 14.61, 166.05, 5.85, 831.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:40:21.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:40:21.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:40:21.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:15, diff=6.69114s, valid=True
2026-05-28T19:40:21.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:40:21.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:40:21.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:12, diff=9.694071s, valid=True
2026-05-28T19:40:21.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:40:21.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:40:21.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:14, diff=7.70081s, valid=True
2026-05-28T19:40:21.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:40:21.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:40:21.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:40:21.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:40:21.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:40:21.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:40:21.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:12, diff=9.703891s, valid=True
2026-05-28T19:40:21.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:40:21.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:40:21.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:40:21.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922663.704548s, valid=True
2026-05-28T19:40:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:40:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:40:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:40:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:40:21.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:40:21.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:40:21.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:40:21.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:40:21.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:40:21.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:40:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:40:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:40:21.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:40:22.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:40:22.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:40:22.567 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:40:22.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:40:22.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:40:22.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-28T19:40:22.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-28T19:40:22.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:40:22.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:40:52.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:40:52.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:40:52.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:40:53.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:40:53.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:40:53.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:40:53.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-28T19:40:53.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:40:53.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-28T19:40:53.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:40:53.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:40:53.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:40:53.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:40:55.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-28T19:40:55.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:40:55.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:40:55.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:40:55.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:40:55.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:40:55.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:40:55.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:40:55.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:40:55.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:40:55.976 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:40:55.976 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:40:55.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:40:56.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:40:56.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:40:56.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:40:56.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:40:56.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:40:56.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:40:56.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:40:56.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:40:56.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:40:56.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:40:56.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:40:56.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:40:46
2026-05-28T19:40:56.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69840, datetime.datetime(2026, 5, 28, 19, 40, 46), datetime.datetime(2026, 5, 28, 19, 40, 46), 'salt', 8.19, 66.91, None, 14.36, 165.09, 5.78, 831.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:40:56.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:40:56.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:40:56.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:46, diff=10.30198s, valid=True
2026-05-28T19:40:56.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:40:56.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:40:56.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:12, diff=-15.695227s, valid=True
2026-05-28T19:40:56.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:40:56.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:40:45, diff=11.311311s, valid=True
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:40:56.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:40:56.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:12, diff=-15.685689s, valid=True
2026-05-28T19:40:56.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:40:56.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:40:56.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:40:56.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922698.314984s, valid=True
2026-05-28T19:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:40:56.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:40:56.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:40:56.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:40:56.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:40:56.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:40:56.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:40:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:40:56.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:40:56.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:40:56.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:40:56.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:40:57.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:40:57.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:40:57.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:40:57.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-28T19:40:57.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-28T19:40:57.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:40:57.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:41:27.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:41:27.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:41: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-28T19:41:27.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:41:27.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:41:28.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:41:28.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:41:28.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:41:28.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-28T19:41:28.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:41:28.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:41:28.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:41:28.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-28T19:41:30.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-28T19:41:30.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:41:30.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:41:30.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:41:30.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:41:30.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:41:30.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:41:30.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:41:30.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:41:30.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:41:30.544 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:41:30.544 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:41:30.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:41:30.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:41:30.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:41:30.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:41:30.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:41:30.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:41:30.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:41:30.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:41:30.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:41:30.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:41:30.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:41:30.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:41:30.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:41:16
2026-05-28T19:41:30.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69841, datetime.datetime(2026, 5, 28, 19, 41, 16), datetime.datetime(2026, 5, 28, 19, 41, 16), 'salt', 8.12, 67.01, None, 14.79, 163.16, 5.75, 831.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:41:30.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:41:30.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:41:30.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:16, diff=14.875828s, valid=True
2026-05-28T19:41:30.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:41:30.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:41:30.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:12, diff=18.878664s, valid=True
2026-05-28T19:41:30.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:41:30.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:15, diff=15.885291s, valid=True
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:41:30.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:41:30.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:12, diff=18.888325s, valid=True
2026-05-28T19:41:30.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:41:30.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:41:30.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:41:30.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922732.888989s, valid=True
2026-05-28T19:41:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:41:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:41:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:41:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:41:30.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:41:30.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:41:30.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:41:30.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:41:30.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:41:31.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:41:31.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:41:31.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:41:31.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:41:31.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:41:31.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:41:31.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:41:31.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:41:31.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:41:31.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-28T19:41:31.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-28T19:41:32.016 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:41:32.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:42:02.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:42:02.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:42:02.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:42:02.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:42:02.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:42:02.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:42:02.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-28T19:42:02.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:42:02.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:42:02.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:42:02.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:42:02.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:42:02.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-28T19:42:05.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-28T19:42:05.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:42:05.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:42:05.332 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:42:05.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:42:05.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:42:05.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:42:05.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:42:05.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:42:05.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:42:05.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:42:05.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:42:05.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:42:05.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:42:05.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:42:05.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:42:05.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:42:05.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:42:05.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:42:05.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:42:05.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:42:05.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:42:05.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:42:05.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:42:05.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:41:47
2026-05-28T19:42:05.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69842, datetime.datetime(2026, 5, 28, 19, 41, 47), datetime.datetime(2026, 5, 28, 19, 41, 46), 'salt', 8.19, 67.18, None, 15.95, 161.29, 5.72, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:42:05.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:42:05.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:42:05.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:46, diff=19.676214s, valid=True
2026-05-28T19:42:05.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:42:05.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:42:05.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:12, diff=-6.32096s, valid=True
2026-05-28T19:42:05.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:42:05.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:42:05.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:41:45, diff=20.685659s, valid=True
2026-05-28T19:42:05.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:42:05.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:42:05.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:42:05.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:42:05.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:42:05.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:42:05.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:12, diff=-6.311302s, valid=True
2026-05-28T19:42:05.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:42:05.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:42:05.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:42:05.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922767.689357s, valid=True
2026-05-28T19:42:05.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:42:05.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:42:05.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:42:05.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:42:05.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:42:05.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:42:05.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:42:05.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:42:05.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:42:05.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:42:05.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:42:05.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:42:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:42:06.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:42:06.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:42:06.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:42:06.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:42:06.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:42:06.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-28T19:42:06.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-28T19:42:06.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:42:06.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:42:37.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:42:37.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:42:37.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:42:37.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:42:37.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:42:37.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:42:37.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:42:37.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:42:37.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-28T19:42:37.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:42:37.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:42:37.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:42:37.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:42:40.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-28T19:42:40.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:42:40.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:42:40.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:42:40.722 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:42:40.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:42:40.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:42:40.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:42:40.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:42:40.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:42:40.743 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:42:40.743 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:42:40.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:42:40.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:42:40.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:42:40.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:42:40.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:42:40.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:42:40.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:42:40.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:42:40.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:42:40.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:42:40.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:42:40.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:42:41.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:42:17
2026-05-28T19:42:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69843, datetime.datetime(2026, 5, 28, 19, 42, 17), datetime.datetime(2026, 5, 28, 19, 42, 16), 'salt', 8.19, 67.14, None, 13.59, 167.32, 5.73, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:42:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:42:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:42:41.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:16, diff=25.057419s, valid=True
2026-05-28T19:42:41.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:42:41.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:42:41.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:12, diff=29.060357s, valid=True
2026-05-28T19:42:41.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:42:41.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:16, diff=25.066995s, valid=True
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:42:41.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:42:41.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:12, diff=29.070068s, valid=True
2026-05-28T19:42:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:42:41.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:42:41.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:42:41.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922803.070746s, valid=True
2026-05-28T19:42:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:42:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:42:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:42:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:42:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:42:41.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:42:41.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:42:41.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:42:41.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:42:41.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:42:41.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:42:41.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:42:41.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:42:41.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:42:41.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:42:41.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:42:42.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:42:42.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:42:42.049 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:42:42.049 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:42:42.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:42:42.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:43:12.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:43:12.325 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:43:12.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:43:12.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:43:12.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:43:12.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:43:12.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-28T19:43:12.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:43:12.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-28T19:43:12.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:43:12.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:43:12.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:43:12.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-28T19:43:15.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-28T19:43:15.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:43:15.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:43:15.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:43:15.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:43:15.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:43:15.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:43:15.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:43:15.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:43:15.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:43:15.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:43:15.351 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:43:15.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:43:15.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:43:15.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:43:15.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:43:15.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:43:15.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:43:15.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:43:15.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:43:15.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:43:15.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:43:15.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:43:15.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:43:15.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:42:47
2026-05-28T19:43:15.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69844, datetime.datetime(2026, 5, 28, 19, 42, 47), datetime.datetime(2026, 5, 28, 19, 42, 47), 'salt', 8.19, 66.94, None, 14.68, 163.52, 5.77, 831.16, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:43:15.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:43:15.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:43:15.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:47, diff=28.666525s, valid=True
2026-05-28T19:43:15.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:43:15.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:43:15.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:43:12, diff=3.669374s, valid=True
2026-05-28T19:43:15.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:43:15.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:43:15.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:42:46, diff=29.675948s, valid=True
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:43:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:43:15.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:43:12, diff=3.678997s, valid=True
2026-05-28T19:43:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:43:15.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:43:15.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:43:15.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922837.679663s, valid=True
2026-05-28T19:43:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:43:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:43:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:43:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:43:15.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:43:15.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:43:15.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:43:15.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:43:15.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:43:15.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:43:15.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:43:15.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:43:16.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:43:16.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:43:16.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:43:16.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:43:16.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:43:16.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:43:16.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-28T19:43:16.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-28T19:43:17.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:43:17.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:43:47.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:43:47.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:43:47.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:43:47.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:43:47.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:43:47.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:43:47.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-28T19:43:47.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:43:47.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-28T19:43:47.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:43:47.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:43:47.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:43:47.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-28T19:43:50.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-28T19:43:50.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:43:50.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:43:50.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:43:50.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:43:50.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:43:50.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:43:50.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:43:50.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:43:50.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:43:50.227 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:43:50.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:43:50.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:43:50.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:43:50.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:43:50.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:43:50.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:43:50.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:43:50.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:43:50.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:43:50.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:43:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:43:50.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:43:50.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:43:50.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:43:47
2026-05-28T19:43:50.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69846, datetime.datetime(2026, 5, 28, 19, 43, 47), datetime.datetime(2026, 5, 28, 19, 43, 47), 'salt', 8.09, 66.75, None, 13.69, 164.1, 5.81, 831.22, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:43:50.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:43:50.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:43:50.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:43:47, diff=3.538836s, valid=True
2026-05-28T19:43:50.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:43:50.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:43:50.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:12, diff=-21.458299s, valid=True
2026-05-28T19:43:50.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:43:50.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:43:46, diff=4.548262s, valid=True
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:43:50.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:43:50.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:12, diff=-21.448723s, valid=True
2026-05-28T19:43:50.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:43:50.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:43:50.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:43:50.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922872.55194s, valid=True
2026-05-28T19:43:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:43:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:43:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:43:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:43:50.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:43:50.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:43:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:43:50.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:43:50.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:43:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:43:50.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:43:50.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:43:50.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:43:50.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:43:51.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:43:51.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:43:51.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:43:51.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:43:51.521 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:43:51.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-28T19:43:51.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:43:51.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:44:21.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:44:21.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:44:21.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:44:21.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:44:21.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:44:22.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:44:22.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-28T19:44:22.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:44:22.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-28T19:44:22.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:44:22.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:44:22.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:44:22.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-28T19:44:24.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:44:24.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:44:24.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:44:24.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:44:24.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:44:24.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:44:24.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:44:24.632 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:44:24.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:44:24.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:44:24.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:44:24.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:44:24.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:44:24.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:44:24.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:44:24.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:44:24.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:44:24.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:44:24.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:44:24.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:44:24.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:44:24.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:44:24.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:44:24.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:44:24.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:44:18
2026-05-28T19:44:24.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69847, datetime.datetime(2026, 5, 28, 19, 44, 18), datetime.datetime(2026, 5, 28, 19, 44, 17), 'salt', 8.15, 66.85, None, 14.26, 167.53, 5.78, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:44:24.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:44:24.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:44:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:17, diff=7.960069s, valid=True
2026-05-28T19:44:24.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:44:24.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:44:24.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:12, diff=12.962956s, valid=True
2026-05-28T19:44:24.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:44:24.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:15, diff=9.96956s, valid=True
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:44:24.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:44:24.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:44:24.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:12, diff=12.972598s, valid=True
2026-05-28T19:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:44:24.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:44:24.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:44:24.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922906.973254s, valid=True
2026-05-28T19:44:24.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:44:24.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:44:24.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:44:24.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:44:24.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:44:25.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:44:25.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:44:25.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:44:25.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:44:25.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:44:25.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:44:25.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:44:25.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:44:25.337 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:44:25.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:44:25.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:44:25.985 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:44:25.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:44:25.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-28T19:44:25.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-28T19:44:26.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:44:26.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:44:56.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:44:56.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:44:56.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:44:56.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:44:56.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:44:56.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:44:56.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-28T19:44:56.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:44:56.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-28T19:44:56.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:44:56.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:44:56.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:44:56.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-28T19:44:58.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-28T19:44:58.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:44:58.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:44:58.950 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:44:58.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:44:58.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:44:58.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:44:58.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:44:58.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:44:58.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:44:58.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:44:58.971 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:44:58.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:44:59.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:44:59.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:44:59.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:44:59.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:44:59.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:44:59.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:44:59.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:44:59.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:44:59.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:44:59.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:44:59.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:44:59.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:44:48
2026-05-28T19:44:59.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69848, datetime.datetime(2026, 5, 28, 19, 44, 48), datetime.datetime(2026, 5, 28, 19, 44, 47), 'salt', 8.25, 66.91, None, 14.68, 159.15, 5.77, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:44:59.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:44:59.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:44:59.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:47, diff=12.301151s, valid=True
2026-05-28T19:44:59.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:44:59.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:44:59.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:12, diff=-12.695914s, valid=True
2026-05-28T19:44:59.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:44:59.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:44:59.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:44:47, diff=12.310752s, valid=True
2026-05-28T19:44:59.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:44:59.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:44:59.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:44:59.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:44:59.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:44:59.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:44:59.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:12, diff=-12.686196s, valid=True
2026-05-28T19:44:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:44:59.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:44:59.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:44:59.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922941.314459s, valid=True
2026-05-28T19:44:59.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:44:59.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:44:59.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:44:59.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:44:59.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:44:59.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:44:59.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:44:59.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:44:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:44:59.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:44:59.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:44:59.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:44:59.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:44:59.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:44:59.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:45:00.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:45:00.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:45:00.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:45:00.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-28T19:45:00.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-28T19:45:00.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:45:00.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:45:30.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:45:30.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:45:30.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:45:30.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:45:30.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:45:31.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:45:31.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-28T19:45:31.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:45:31.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-28T19:45:31.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:45:31.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:45:31.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:45:31.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-28T19:45:33.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-28T19:45:33.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:45:33.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:45:33.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:45:33.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:45:33.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:45:33.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:45:33.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:45:33.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:45:33.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:45:33.543 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:45:33.543 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:45:33.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:45:33.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:45:33.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:45:33.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:45:33.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:45:33.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:45:33.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:45:33.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:45:33.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:45:33.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:45:33.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:45:33.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:45:33.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:45:18
2026-05-28T19:45:33.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69849, datetime.datetime(2026, 5, 28, 19, 45, 18), datetime.datetime(2026, 5, 28, 19, 45, 18), 'salt', 8.19, 66.78, None, 14.96, 163.07, 5.8, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:45:33.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:45:33.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:45:33.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:18, diff=15.863134s, valid=True
2026-05-28T19:45:33.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:45:33.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:45:33.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:12, diff=21.865998s, valid=True
2026-05-28T19:45:33.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:45:33.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:18, diff=15.87256s, valid=True
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:45:33.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:45:33.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:45:33.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:12, diff=21.875586s, valid=True
2026-05-28T19:45:33.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:45:33.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:45:33.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:45:33.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=922975.876241s, valid=True
2026-05-28T19:45:33.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:45:33.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:45:33.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:45:33.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:45:33.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:45:33.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:45:33.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:45:33.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:45:33.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:45:34.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:45:34.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:45:34.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:45:34.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:45:34.203 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:45:34.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:45:34.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:45:34.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:45:34.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:45:34.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-28T19:45:34.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-28T19:45:35.176 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:45:35.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:46:05.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:46:05.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:46:05.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:46:05.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:46:05.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:46:05.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:46:05.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:46:05.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:46:05.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-28T19:46:05.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:46:05.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:46:05.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:46:05.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-28T19:46:08.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-28T19:46:08.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:46:08.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:46:08.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:46:08.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:46:08.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:46:08.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:46:08.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:46:08.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:46:08.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:46:08.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:46:08.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:46:08.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:46:08.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:46:08.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:46:08.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:46:08.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:46:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:46:08.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:46:08.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:46:08.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:46:08.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:46:08.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:46:08.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:46:08.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:45:48
2026-05-28T19:46:08.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69850, datetime.datetime(2026, 5, 28, 19, 45, 48), datetime.datetime(2026, 5, 28, 19, 45, 48), 'salt', 8.19, 66.55, None, 14.86, 167.25, 5.85, 831.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:46:08.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:46:08.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:46:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:48, diff=20.560806s, valid=True
2026-05-28T19:46:08.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:46:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:46:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:12, diff=-3.43634s, valid=True
2026-05-28T19:46:08.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:46:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:45:48, diff=20.570273s, valid=True
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:46:08.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:46:08.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:12, diff=-3.426688s, valid=True
2026-05-28T19:46:08.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:46:08.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:46:08.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:46:08.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923010.57397s, valid=True
2026-05-28T19:46:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:46:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:46:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:46:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:46:08.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:46:08.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:46:08.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:46:08.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:46:08.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:46:08.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:46:08.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:46:08.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:46:08.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:46:08.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:46:09.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:46:09.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:46:09.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:46:09.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:46:09.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-28T19:46:09.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-28T19:46:09.925 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:46:09.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:46:39.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:46:39.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:46:39.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:46:40.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:46:40.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:46:40.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:46:40.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-28T19:46:40.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:46:40.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:46:40.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:46:40.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:46:40.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:46:40.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-28T19:46:42.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-28T19:46:42.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:46:42.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:46:42.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:46:42.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:46:42.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:46:42.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:46:42.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:46:42.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:46:42.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:46:42.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:46:42.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:46:42.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:46:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:46:43.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:46:43.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:46:43.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:46:43.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:46:43.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:46:43.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:46:43.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:46:43.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:46:43.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:46:43.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:46:43.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:46:18
2026-05-28T19:46:43.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69851, datetime.datetime(2026, 5, 28, 19, 46, 18), datetime.datetime(2026, 5, 28, 19, 46, 18), 'salt', 8.15, 66.28, None, 13.45, 168.87, 5.9, 831.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:46:43.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:46:43.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:46:43.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:18, diff=25.313012s, valid=True
2026-05-28T19:46:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:46:43.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:46:43.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:12, diff=31.315842s, valid=True
2026-05-28T19:46:43.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:46:43.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:18, diff=25.32244s, valid=True
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:46:43.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:46:43.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:12, diff=31.325428s, valid=True
2026-05-28T19:46:43.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:46:43.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:46:43.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:46:43.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923045.326083s, valid=True
2026-05-28T19:46:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:46:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:46:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:46:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:46:43.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:46:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:46:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:46:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:46:43.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:46:43.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:46:43.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:46:43.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:46:43.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:46:43.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:46:43.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:46:44.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:46:44.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:46:44.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:46:44.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-28T19:46:44.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-28T19:46:44.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:46:44.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:47:14.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:47:14.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:47:14.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:47:14.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:47:14.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:47:14.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:47:14.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-28T19:47:14.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:47:14.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-28T19:47:14.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:47:14.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:47:14.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:47:14.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:47:17.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-28T19:47:17.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:47:17.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:47:17.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:47:17.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:47:17.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:47:17.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:47:17.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:47:17.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:47:17.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:47:17.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:47:17.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:47:17.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:47:17.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:47:17.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:47:17.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:47:17.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:47:17.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:47:17.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:47:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:47:17.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:47:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:47:17.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:47:17.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:47:17.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:46:49
2026-05-28T19:47:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69852, datetime.datetime(2026, 5, 28, 19, 46, 49), datetime.datetime(2026, 5, 28, 19, 46, 48), 'salt', 8.19, 66.08, None, 13.94, 165.19, 5.95, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:47:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:47:17.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:47:17.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:48, diff=29.759574s, valid=True
2026-05-28T19:47:17.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:47:17.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:47:17.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:47:12, diff=5.76248s, valid=True
2026-05-28T19:47:17.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:47:17.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:46:48, diff=29.769105s, valid=True
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:47:17.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:47:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:47:12, diff=5.772211s, valid=True
2026-05-28T19:47:17.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:47:17.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:47:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:47:17.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923079.772911s, valid=True
2026-05-28T19:47:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:47:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:47:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:47:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:47:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:47:17.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:47:17.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:47:17.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:47:17.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:47:17.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:47:17.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:47:18.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:47:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:47:18.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:47:18.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:47:18.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:47:18.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:47:18.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:47:18.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-28T19:47:18.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-28T19:47:19.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:47:19.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:47:49.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:47:49.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:47:49.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:47:49.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:47:49.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:47:49.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:47:49.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-28T19:47:49.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:47:49.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-28T19:47:49.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:47:49.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:47:49.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:47:49.661 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:47:52.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-28T19:47:52.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:47:52.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:47:52.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:47:52.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:47:52.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:47:52.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:47:52.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:47:52.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:47:52.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:47:52.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:47:52.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:47:52.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:47:52.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:47:52.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:47:52.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:47:52.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:47:52.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:47:52.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:47:52.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:47:52.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:47:52.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:47:52.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:47:52.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:47:52.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:47:49
2026-05-28T19:47:52.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69854, datetime.datetime(2026, 5, 28, 19, 47, 49), datetime.datetime(2026, 5, 28, 19, 47, 49), 'salt', 8.22, 65.52, None, 15.81, 167.09, 6.07, 831.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:47:52.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:47:52.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:47:52.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:47:49, diff=3.392943s, valid=True
2026-05-28T19:47:52.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:47:52.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:47:52.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:12, diff=-19.60423s, valid=True
2026-05-28T19:47:52.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:47:52.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:47:49, diff=3.402323s, valid=True
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:47:52.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:47:52.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:12, diff=-19.594651s, valid=True
2026-05-28T19:47:52.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:47:52.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:47:52.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:47:52.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923114.406021s, valid=True
2026-05-28T19:47:52.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:47:52.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:47:52.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:47:52.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:47:52.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:47:52.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:47:52.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:47:52.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:47:52.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:47:52.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:47:52.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:47:52.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:47:52.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:47:52.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:47:52.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:47:53.276 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:47:53.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:47:53.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:47:53.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-28T19:47:53.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-28T19:47:53.639 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:47:53.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:48:23.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:48:23.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:48:23.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:48:24.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:48:24.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:48:24.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:48:24.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-28T19:48:24.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:48:24.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-28T19:48:24.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:48:24.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:48:24.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:48:24.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-28T19:48:26.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-28T19:48:26.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:48:26.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:48:26.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:48:26.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:48:26.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:48:26.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:48:26.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:48:26.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:48:26.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:48:26.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:48:26.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:48:26.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:48:26.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:48:26.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:48:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:48:26.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:48:27.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:48:27.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:48:27.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:48:27.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:48:27.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:48:27.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:48:27.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:48:27.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:48:19
2026-05-28T19:48:27.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69855, datetime.datetime(2026, 5, 28, 19, 48, 19), datetime.datetime(2026, 5, 28, 19, 48, 19), 'salt', 8.19, 65.49, None, 16.06, 163.76, 6.08, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:48:27.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:48:27.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:48:27.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:19, diff=8.156444s, valid=True
2026-05-28T19:48:27.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:48:27.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:48:27.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:12, diff=15.159371s, valid=True
2026-05-28T19:48:27.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:48:27.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:19, diff=8.166057s, valid=True
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:48:27.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:48:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:12, diff=15.16913s, valid=True
2026-05-28T19:48:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:48:27.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:48:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:48:27.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923149.169816s, valid=True
2026-05-28T19:48:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:48:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:48:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:48:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:48:27.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:48:27.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:48:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:48:27.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:48:27.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:48:27.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:48:27.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:48:27.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:48:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:48:27.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:48:27.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:48:28.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:48:28.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:48:28.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:48: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-28T19:48: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-28T19:48:28.408 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:48:28.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:48:58.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:48:58.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:48:58.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:48:58.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:48:58.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:48:59.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:48:59.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-28T19:48:59.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:48:59.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-28T19:48:59.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:48:59.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:48:59.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:48:59.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-28T19:49:01.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-28T19:49:01.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:49:01.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:49:01.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:49:01.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:49:01.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:49:01.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:49:01.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:49:01.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:49:01.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:49:01.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:49:01.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:49:01.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:49:02.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:49:02.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:49:02.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:49:02.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:49:02.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:49:02.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:49:02.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:49:02.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:49:02.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:49:02.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:49:02.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:49:02.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:48:50
2026-05-28T19:49:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69856, datetime.datetime(2026, 5, 28, 19, 48, 50), datetime.datetime(2026, 5, 28, 19, 48, 49), 'salt', 8.25, 65.35, None, 12.42, 166.53, 6.1, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:49:02.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:49:02.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:49:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:49, diff=13.262449s, valid=True
2026-05-28T19:49:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:49:02.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:49:02.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:12, diff=-9.734114s, valid=True
2026-05-28T19:49:02.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:49:02.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:49:02.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:48:48, diff=14.273604s, valid=True
2026-05-28T19:49:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:49:02.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:49:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:49:02.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:49:02.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:49:02.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:49:02.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:12, diff=-9.722947s, valid=True
2026-05-28T19:49:02.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:49:02.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:49:02.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:49:02.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923184.277795s, valid=True
2026-05-28T19:49:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:49:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:49:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:49:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:49:02.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:49:02.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:49:02.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:49:02.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:49:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:49:02.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:49:02.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:49:02.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:49:02.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:49:02.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:49:02.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:49:03.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:49:03.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:49:03.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:49:03.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-28T19:49:03.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-28T19:49:03.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:49:03.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:49:33.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:49:33.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:49:33.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:49:33.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:49:33.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:49:34.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:49: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-28T19:49:34.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:49:34.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-28T19:49:34.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:49:34.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:49:34.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:49:34.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T19:49:36.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:49:36.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:49:36.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:49:36.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:49:36.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:49:36.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:49:36.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:49:36.604 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:49:36.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:49:36.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:49:36.604 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:49:36.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:49:36.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:49:36.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:49:36.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:49:36.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:49:36.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:49:36.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:49:36.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:49:36.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:49:36.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:49:36.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:49:36.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:49:36.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:49:36.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:49:20
2026-05-28T19:49:36.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69857, datetime.datetime(2026, 5, 28, 19, 49, 20), datetime.datetime(2026, 5, 28, 19, 49, 19), 'salt', 8.29, 65.25, None, 14.43, 170.44, 6.13, 831.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:49:36.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:49:36.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:49:37.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:19, diff=18.003051s, valid=True
2026-05-28T19:49:37.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:49:37.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:49:37.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:12, diff=25.005915s, valid=True
2026-05-28T19:49:37.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:49:37.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:19, diff=18.012508s, valid=True
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:49:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:49:37.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:12, diff=25.015541s, valid=True
2026-05-28T19:49:37.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:49:37.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:49:37.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:49:37.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923219.016208s, valid=True
2026-05-28T19:49:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:49:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:49:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:49:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:49:37.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:49:37.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:49:37.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:49:37.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:49:37.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:49:37.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:49:37.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:49:37.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:49:37.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:49:37.336 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:49:37.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:49:37.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:49:37.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:49:37.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:49:37.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-28T19:49:37.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-28T19:49:38.256 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:49:38.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:50:08.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:50:08.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:50:08.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:50:08.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:50:08.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:50:08.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:50:08.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:50:08.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:50:08.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-28T19:50:08.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:50:08.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:50:08.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:50:08.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-28T19:50:11.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-28T19:50:11.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:50:11.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:50:11.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:50:11.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:50:11.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:50:11.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:50:11.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:50:11.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:50:11.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:50:11.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:50:11.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:50:11.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:50:11.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:50:11.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:50:11.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:50:11.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:50:11.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:50:11.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:50:11.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:50:11.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:50:11.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:50:11.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:50:11.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:50:11.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:49:50
2026-05-28T19:50:11.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69858, datetime.datetime(2026, 5, 28, 19, 49, 50), datetime.datetime(2026, 5, 28, 19, 49, 50), 'salt', 8.29, 65.22, None, 13.23, 167.77, 6.14, 831.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:50:11.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:50:11.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:50:11.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:50, diff=21.473607s, valid=True
2026-05-28T19:50:11.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:50:11.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:50:11.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:12, diff=-0.523013s, valid=True
2026-05-28T19:50:11.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:50:11.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:50:11.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:49:40, diff=31.48367s, valid=True
2026-05-28T19:50:11.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:50:11.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:50:11.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:50:11.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:50:11.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:50:11.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:50:11.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:12, diff=-0.513288s, valid=True
2026-05-28T19:50:11.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:50:11.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:50:11.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:50:11.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923253.487367s, valid=True
2026-05-28T19:50:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:50:11.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:50:11.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:50:11.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:50:11.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:50:11.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:50:11.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:50:11.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:50:11.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:50:11.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:50:11.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:50:11.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:50:11.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:50:11.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:50:12.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:50:12.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:50:12.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:50:12.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:50:12.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-28T19:50:12.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-28T19:50:12.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:50:12.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:50:42.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:50:42.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:50:42.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:50:43.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:50:43.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:50:43.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:50:43.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-28T19:50:43.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:50:43.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:50:43.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:50:43.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:50:43.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:50:43.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-28T19:50:45.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-28T19:50:45.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:50:45.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:50:45.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:50:45.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:50:45.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:50:45.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:50:45.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:50:45.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:50:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:50:45.837 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:50:45.837 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:50:45.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:50:45.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:50:45.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:50:46.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:50:46.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:50:46.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:50:46.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:50:46.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:50:46.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:50:46.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:50:46.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:50:46.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:50:46.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:50:20
2026-05-28T19:50:46.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69859, datetime.datetime(2026, 5, 28, 19, 50, 20), datetime.datetime(2026, 5, 28, 19, 50, 20), 'salt', 8.29, 65.25, None, 15.32, 166.17, 6.13, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:50:46.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:50:46.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:50:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:20, diff=26.165681s, valid=True
2026-05-28T19:50:46.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:50:46.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:50:46.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:12, diff=34.168547s, valid=True
2026-05-28T19:50:46.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:50:46.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:12, diff=34.17509s, valid=True
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:50:46.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:50:46.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:12, diff=34.178099s, valid=True
2026-05-28T19:50:46.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:50:46.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:50:46.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:50:46.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923288.178748s, valid=True
2026-05-28T19:50:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:50:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:50:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:50:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:50:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:50:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:50:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:50:46.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:50:46.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:50:46.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:50:46.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:50:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:50:46.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:50:46.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:50:46.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:50:47.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:50:47.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:50:47.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:50:47.190 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:50:47.190 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:50:47.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:50:47.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:51:17.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:51:17.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:51:17.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:51:17.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:51:17.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:51:17.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:51:17.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-28T19:51:17.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:51:17.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-28T19:51:18.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:51:18.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:51:18.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:51:18.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-28T19:51:20.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-28T19:51:20.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:51:20.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:51:20.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:51:20.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:51:20.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:51:20.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:51:20.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:51:20.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:51:20.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:51:20.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:51:20.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:51:20.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:51:20.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:51:20.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:51:20.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:51:20.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:51:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:51:20.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:51:20.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:51:20.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:51:20.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:51:20.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:51:20.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:51:20.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:50:51
2026-05-28T19:51:20.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69860, datetime.datetime(2026, 5, 28, 19, 50, 51), datetime.datetime(2026, 5, 28, 19, 50, 50), 'salt', 8.32, 65.29, None, 15.28, 166.15, 6.12, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:51:20.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:51:20.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:51:20.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:50, diff=30.774245s, valid=True
2026-05-28T19:51:20.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:51:20.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:51:20.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:51:12, diff=8.777111s, valid=True
2026-05-28T19:51:20.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:51:20.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:51:20.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:50:43, diff=37.783775s, valid=True
2026-05-28T19:51:20.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:51:20.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:51:20.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:51:20.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:51:20.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:51:20.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:51:20.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:51:12, diff=8.786821s, valid=True
2026-05-28T19:51:20.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:51:20.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:51:20.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:51:20.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923322.78747s, valid=True
2026-05-28T19:51:20.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:51:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:51:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:51:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:51:20.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:51:20.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:51:20.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:51:20.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:51:20.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:51:20.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:51:20.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:51:21.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:51:21.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:51:21.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:51:21.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:51:21.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:51:21.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:51:21.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:51:21.874 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:51:21.874 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:51:22.061 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:51:22.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:51:52.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:51:52.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:51:52.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:51:52.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:51:52.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:51:52.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:51:52.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-28T19:51:52.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:51:52.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:51:52.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:51:52.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:51:52.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:51:52.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-28T19:51:54.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-28T19:51:54.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:51:54.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:51:54.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:51:54.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:51:55.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:51:55.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:51:55.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:51:55.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:51:55.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:51:55.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:51:55.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:51:55.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:51:55.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:51:55.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:51:55.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:51:55.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:51:55.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:51:55.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:51:55.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:51:55.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:51:55.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:51:55.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:51:55.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:51:55.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:51:51
2026-05-28T19:51:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69862, datetime.datetime(2026, 5, 28, 19, 51, 51), datetime.datetime(2026, 5, 28, 19, 51, 51), 'salt', 8.22, 65.39, None, 14.75, 169.56, 6.1, 831.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:51:55.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:51:55.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:51:55.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:51:51, diff=4.34619s, valid=True
2026-05-28T19:51:55.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:51:55.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:51:55.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:12, diff=-16.650885s, valid=True
2026-05-28T19:51:55.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:51:55.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:51:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:51:46, diff=9.355774s, valid=True
2026-05-28T19:51:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:51:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:51:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:51:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:51:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:51:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:51:55.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:12, diff=-16.641149s, valid=True
2026-05-28T19:51:55.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:51:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:51:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:51:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923357.359538s, valid=True
2026-05-28T19:51:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:51:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:51:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:51:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:51:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:51:55.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:51:55.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:51:55.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:51:55.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:51:55.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:51:55.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:51:55.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:51:55.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:51:55.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:51:55.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:51:56.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:51:56.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:51:56.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:51:56.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-28T19:51:56.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-28T19:51:56.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:51:56.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:52:26.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:52:26.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:52:26.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:52:26.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:52:26.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:52:27.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:52:27.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-28T19:52:27.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:52:27.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-28T19:52:27.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:52:27.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:52:27.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:52:27.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-28T19:52:29.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:52:29.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:52:29.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:52:29.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:52:29.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:52:29.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:52:29.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:52:29.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:52:29.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:52:29.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:52:29.602 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:52:29.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:52:29.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:52:29.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:52:29.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:52:29.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:52:29.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:52:29.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:52:29.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:52:29.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:52:29.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:52:29.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:52:29.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:52:29.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:52:29.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:52:21
2026-05-28T19:52:29.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69863, datetime.datetime(2026, 5, 28, 19, 52, 21), datetime.datetime(2026, 5, 28, 19, 52, 21), 'salt', 8.25, 65.35, None, 14.01, 168.59, 6.1, 831.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:52:29.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:52:29.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:52:29.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:21, diff=8.961225s, valid=True
2026-05-28T19:52:29.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:52:29.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:52:29.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:12, diff=17.964223s, valid=True
2026-05-28T19:52:29.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:52:29.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:18, diff=11.972145s, valid=True
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:52:29.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:52:29.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:12, diff=17.975335s, valid=True
2026-05-28T19:52:29.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:52:29.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:52:29.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:52:29.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923391.976083s, valid=True
2026-05-28T19:52:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:52:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:52:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:52:29.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:52:29.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:52:30.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:52:30.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:52:30.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:52:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:52:30.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:52:30.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:52:30.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:52:30.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:52:30.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:52:30.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:52:30.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:52:31.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:52:31.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:52:31.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-28T19:52:31.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:52:31.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:52:31.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:53:01.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:53:01.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:53:01.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:53:01.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:53:01.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:53:01.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:53:01.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-28T19:53:01.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:53:01.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-28T19:53:01.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:53:01.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:53:01.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:53:01.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-28T19:53:04.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-28T19:53:04.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:53:04.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:53:04.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:53:04.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:53:04.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:53:04.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:53:04.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:53:04.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:53:04.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:53:04.315 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:53:04.315 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:53:04.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:53:04.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:53:04.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:53:04.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:53:04.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:53:04.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:53:04.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:53:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:53:04.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:53:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:53:04.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:53:04.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:53:04.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:52:52
2026-05-28T19:53:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69864, datetime.datetime(2026, 5, 28, 19, 52, 52), datetime.datetime(2026, 5, 28, 19, 52, 51), 'salt', 8.22, 65.69, None, 13.37, 167.87, 6.03, 831.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:53:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:53:04.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:53:04.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:51, diff=13.635002s, valid=True
2026-05-28T19:53:04.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:53:04.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:53:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:12, diff=-7.362169s, valid=True
2026-05-28T19:53:04.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:53:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:52:49, diff=15.644324s, valid=True
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:53:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:53:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:12, diff=-7.352665s, valid=True
2026-05-28T19:53:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:53:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:53:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:53:04.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923426.647986s, valid=True
2026-05-28T19:53:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:53:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:53:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:53:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:53:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:53:04.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:53:04.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:53:04.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:53:04.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:53:04.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:53:04.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:53:04.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:53:04.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:53:04.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:53:05.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:53:05.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:53:05.625 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:53:05.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:53:05.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-28T19:53:05.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-28T19:53:05.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:53:05.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:53:35.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:53:35.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:53:35.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:53:36.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:53:36.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:53:36.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:53:36.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-28T19:53:36.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:53:36.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-28T19:53:36.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:53:36.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:53:36.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:53:36.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-28T19:53:38.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-28T19:53:38.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:53:38.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:53:38.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:53:38.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:53:38.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:53:38.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:53:38.795 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:53:38.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:53:38.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:53:38.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:53:38.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:53:38.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:53:38.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:53:38.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:53:38.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:53:38.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:53:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:53:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:53:39.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:53:39.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:53:39.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:53:39.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:53:39.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:53:39.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:53:22
2026-05-28T19:53:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69865, datetime.datetime(2026, 5, 28, 19, 53, 22), datetime.datetime(2026, 5, 28, 19, 53, 21), 'salt', 8.15, 65.62, None, 14.5, 167.35, 6.04, 831.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:53:39.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:53:39.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:53:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:21, diff=18.148332s, valid=True
2026-05-28T19:53:39.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:53:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:53:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:12, diff=27.151191s, valid=True
2026-05-28T19:53:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:53:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:53:39.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:20, diff=19.157786s, valid=True
2026-05-28T19:53:39.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:53:39.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:53:39.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:53:39.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:53:39.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:53:39.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:53:39.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:12, diff=27.16081s, valid=True
2026-05-28T19:53:39.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:53:39.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:53:39.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:53:39.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923461.16146s, valid=True
2026-05-28T19:53:39.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:53:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:53:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:53:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:53:39.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:53:39.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:53:39.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:53:39.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:53:39.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:53:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:53:39.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:53:39.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:53:39.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:53:39.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:53:39.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:53:40.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:53:40.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:53:40.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:53:40.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:53:40.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T19:53:40.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:53:40.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:54:10.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:54:10.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:54:10.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:54:10.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:54:10.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:54:10.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:54:10.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-28T19:54:10.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:54:10.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-28T19:54:10.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:54:10.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:54:10.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:54:10.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-28T19:54:13.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-28T19:54:13.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:54:13.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:54:13.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:54:13.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:54:13.598 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:54:13.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:54:13.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:54:13.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:54:13.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:54:13.611 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:54:13.611 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:54:13.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:54:13.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:54:13.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:54:13.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:54:13.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:54:13.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:54:13.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:54:13.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:54:13.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:54:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:54:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:54:13.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:54:13.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:53:52
2026-05-28T19:54:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69866, datetime.datetime(2026, 5, 28, 19, 53, 52), datetime.datetime(2026, 5, 28, 19, 53, 52), 'salt', 8.25, 65.78, None, 13.8, 167.68, 6.01, 831.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:54:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:54:13.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:54:13.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:52, diff=21.933387s, valid=True
2026-05-28T19:54:13.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:54:13.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:54:13.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:12, diff=1.936228s, valid=True
2026-05-28T19:54:13.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:54:13.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:54:13.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:53:52, diff=21.942881s, valid=True
2026-05-28T19:54:13.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:54:13.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:54:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:54:13.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:54:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:54:13.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:54:13.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:12, diff=1.945913s, valid=True
2026-05-28T19:54:13.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:54:13.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:54:13.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:54:13.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923495.946564s, valid=True
2026-05-28T19:54:13.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:54:13.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:54:13.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:54:13.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:54:13.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:54:14.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:54:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:54:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:54:14.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:54:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:54:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:54:14.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:54:14.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:54:14.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:54:14.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:54:14.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:54:14.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:54:14.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:54:14.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-28T19:54:14.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-28T19:54:15.166 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:54:15.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:54:45.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:54:45.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:54:45.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:54:45.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:54:45.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:54:45.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:54:45.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:54:45.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:54:45.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-28T19:54:45.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:54:45.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:54:45.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:54:45.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-28T19:54:48.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-28T19:54:48.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:54:48.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:54:48.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:54:48.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:54:48.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:54:48.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:54:48.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:54:48.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:54:48.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:54:48.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:54:48.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:54:48.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:54:48.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:54:48.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:54:48.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:54:48.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:54:48.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:54:48.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:54:48.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:54:48.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:54:48.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:54:48.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:54:48.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:54:48.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:54:22
2026-05-28T19:54:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69867, datetime.datetime(2026, 5, 28, 19, 54, 22), datetime.datetime(2026, 5, 28, 19, 54, 21), 'salt', 8.15, 65.88, None, 15.35, 169.25, 5.98, 831.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:54:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:54:48.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:54:48.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:21, diff=27.639706s, valid=True
2026-05-28T19:54:48.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:54:48.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:54:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:12, diff=36.642534s, valid=True
2026-05-28T19:54:48.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:54:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:13, diff=35.649104s, valid=True
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:54:48.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:54:48.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:54:12, diff=36.652088s, valid=True
2026-05-28T19:54:48.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:54:48.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:54:48.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:54:48.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923530.652749s, valid=True
2026-05-28T19:54:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:54:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:54:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:54:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:54:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:54:48.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:54:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:54:48.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:54:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:54:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:54:48.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:54:48.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:54:49.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:54:49.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:54:49.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:54:49.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:54:49.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:54:49.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:54:49.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-28T19:54:49.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-28T19:54:49.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:54:49.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:55:20.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:55:20.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:55:20.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:55:20.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:55:20.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:55:20.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:55: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-28T19:55:20.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:55: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-28T19:55:20.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:55:20.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:55:20.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:55:20.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-28T19:55:23.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-28T19:55:23.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:55:23.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:55:23.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:55:23.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:55:23.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:55:23.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:55:23.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:55:23.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:55:23.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:55:23.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:55:23.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:55:23.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:55:23.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T19:55:23.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:55:23.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T19:55:23.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:55:23.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:55:23.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:55:23.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:55:23.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:55:23.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:55:23.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:55:23.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:55:23.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:55:23
2026-05-28T19:55:23.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69869, datetime.datetime(2026, 5, 28, 19, 55, 23), datetime.datetime(2026, 5, 28, 19, 55, 22), 'salt', 8.12, 65.78, None, 14.79, 162.61, 6.01, 831.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:55:23.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:55:23.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T19:55:23.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:22, diff=1.721474s, valid=True
2026-05-28T19:55:23.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:55:23.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:55:23.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:12, diff=11.724473s, valid=True
2026-05-28T19:55:23.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:55:23.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T19:55:23.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:16, diff=7.731614s, valid=True
2026-05-28T19:55:23.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:55:23.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:55:23.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:55:23.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:55:23.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:55:23.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:55:23.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:12, diff=11.734795s, valid=True
2026-05-28T19:55:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:55:23.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:55:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:55:23.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923565.735467s, valid=True
2026-05-28T19:55:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:55:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:55:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:55:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:55:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:55:23.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:55:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:55:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:55:23.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:55:23.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:55:23.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:55:23.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:55:24.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:55:24.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:55:24.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:55:24.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:55:24.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:55:24.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:55:24.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-28T19:55:24.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-28T19:55:24.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:55:24.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:55:54.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:55:54.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:55:54.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:55:55.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:55:55.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:55:55.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:55:55.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T19:55:55.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:55:55.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T19:55:55.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:55:55.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:55:55.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:55: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-28T19:55:57.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:55:57.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:55:57.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:55:57.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:55:57.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:55:57.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:55:57.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:55:57.998 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:55:57.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:55:57.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:55:57.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:55:57.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:55:58.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:55:58.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:55:58.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:55:58.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:55:58.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:55:58.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:55:58.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:55:58.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:55:58.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:55:58.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:55:58.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:55:58.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:55:58.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:55:53
2026-05-28T19:55:58.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69870, datetime.datetime(2026, 5, 28, 19, 55, 53), datetime.datetime(2026, 5, 28, 19, 55, 53), 'salt', 8.12, 65.85, None, 13.45, 165.52, 5.99, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:55:58.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:55:58.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:55:58.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:53, diff=5.401345s, valid=True
2026-05-28T19:55:58.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:55:58.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:55:58.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:12, diff=-13.595792s, valid=True
2026-05-28T19:55:58.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:55:58.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:55:58.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:55:48, diff=10.410832s, valid=True
2026-05-28T19:55:58.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:55:58.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:55:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:55:58.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:55:58.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:55:58.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:55:58.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:12, diff=-13.586119s, valid=True
2026-05-28T19:55:58.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:55:58.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:55:58.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:55:58.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923600.414525s, valid=True
2026-05-28T19:55:58.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:55:58.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:55:58.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:55:58.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:55:58.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:55:58.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:55:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:55:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:55:58.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:55:58.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:55:58.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:55:58.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:55:58.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:55:58.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:55:58.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:55:59.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:55:59.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:55:59.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:55:59.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-28T19:55:59.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-28T19:55:59.488 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:55:59.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:56:29.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:56:29.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:56:29.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:56:29.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:56:29.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:56:29.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:56:29.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-28T19:56:29.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:56:29.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-28T19:56:29.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:56:29.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:56:29.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:56:29.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-28T19:56: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-28T19:56:32.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:56:32.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:56:32.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:56:32.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:56:32.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:56:32.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:56:32.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:56:32.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:56:32.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:56:32.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:56:32.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:56:32.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:56:32.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:56:32.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:56:32.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:56:32.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:56:32.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:56:32.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:56:32.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:56:32.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:56:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:56:32.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:56:32.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:56:32.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:56:23
2026-05-28T19:56:32.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69871, datetime.datetime(2026, 5, 28, 19, 56, 23), datetime.datetime(2026, 5, 28, 19, 56, 23), 'salt', 8.19, 65.82, None, 15.28, 163.27, 6.01, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:56:32.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:56:32.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:56:32.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:23, diff=9.684441s, valid=True
2026-05-28T19:56:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:56:32.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:56:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:12, diff=20.69013s, valid=True
2026-05-28T19:56:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:56:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:19, diff=13.70337s, valid=True
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:56:32.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:56:32.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:56:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:12, diff=20.708436s, valid=True
2026-05-28T19:56:32.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:56:32.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:56:32.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:56:32.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923634.709129s, valid=True
2026-05-28T19:56:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:56:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:56:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:56:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:56:32.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:56:32.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:56:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:56:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:56:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:56:32.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:56:32.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:56:32.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:56:32.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:56:33.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:56:33.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:56:33.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:56:33.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:56:33.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:56:33.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-28T19:56:33.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-28T19:56:33.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:56:33.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:57:03.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:57:03.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:57:03.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:57:04.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:57:04.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:57:04.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:57:04.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-28T19:57:04.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:57:04.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-28T19:57:04.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:57:04.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:57:04.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:57:04.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-28T19:57:06.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-28T19:57:06.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:57:06.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:57:06.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:57:06.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:57:06.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:57:06.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:57:06.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:57:06.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:57:06.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:57:06.955 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:57:06.955 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:57:06.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:57:07.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:57:07.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:57:07.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:57:07.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:57:07.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:57:07.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:57:07.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:57:07.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:57:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:57:07.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:57:07.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:57:07.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:56:53
2026-05-28T19:57:07.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69872, datetime.datetime(2026, 5, 28, 19, 56, 53), datetime.datetime(2026, 5, 28, 19, 56, 53), 'salt', 8.16, 65.75, None, 14.05, 166.23, 6.02, 831.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:57:07.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:57:07.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:57:07.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:53, diff=14.278048s, valid=True
2026-05-28T19:57:07.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:57:07.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:57:07.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:12, diff=-4.719138s, valid=True
2026-05-28T19:57:07.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:57:07.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:56:51, diff=16.287396s, valid=True
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:57:07.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:57:07.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:12, diff=-4.709618s, valid=True
2026-05-28T19:57:07.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:57:07.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:57:07.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:57:07.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923669.291033s, valid=True
2026-05-28T19:57:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:57:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:57:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:57:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:57:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:57:07.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:57:07.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:57:07.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:57:07.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:57:07.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:57:07.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:57:07.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:57:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:57:07.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:57:07.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:57:08.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:57:08.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:57:08.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:57:08.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-28T19:57:08.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-28T19:57:08.567 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:57:08.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:57:38.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:57:38.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:57:38.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:57:39.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:57:39.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:57:39.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:57:39.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-28T19:57:39.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:57:39.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-28T19:57:39.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:57:39.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:57:39.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:57:39.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-28T19:57:41.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-28T19:57:41.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:57:41.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:57:41.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:57:41.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:57:41.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:57:41.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:57:41.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:57:41.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:57:41.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:57:41.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:57:41.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:57:41.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:57:42.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:57:42.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:57:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:57:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:57:42.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:57:42.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:57:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:57:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:57:42.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:57:42.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:57:42.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:57:42.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:57:24
2026-05-28T19:57:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69873, datetime.datetime(2026, 5, 28, 19, 57, 24), datetime.datetime(2026, 5, 28, 19, 57, 23), 'salt', 8.16, 65.82, None, 14.96, 161.25, 6.01, 831.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:57:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:57:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:57:42.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:23, diff=19.271913s, valid=True
2026-05-28T19:57:42.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:57:42.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:57:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:12, diff=30.274756s, valid=True
2026-05-28T19:57:42.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:57:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:22, diff=20.281362s, valid=True
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:57:42.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:57:42.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:12, diff=30.28438s, valid=True
2026-05-28T19:57:42.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:57:42.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:57:42.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:57:42.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923704.285051s, valid=True
2026-05-28T19:57:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:57:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:57:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:57:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:57:42.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:57:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:57:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:57:42.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:57:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:57:42.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:57:42.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:57:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:57:42.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:57:42.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:57:42.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:57:43.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:57:43.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:57:43.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:57:43.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T19:57:43.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-28T19:57:43.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:57:43.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:58:13.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:58:13.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:58:13.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:58:13.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:58:13.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:58:13.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:58:13.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-28T19:58:13.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:58:13.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-28T19:58:14.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:58:14.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:58:14.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:58:14.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-28T19:58:16.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-28T19:58:16.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:58:16.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:58:16.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:58:16.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:58:16.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:58:16.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:58:16.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:58:16.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:58:16.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:58:16.992 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:58:16.992 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:58:16.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:58:17.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:58:17.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:58:17.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:58:17.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:58:17.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:58:17.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:58:17.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:58:17.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:58:17.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:58:17.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:58:17.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:58:17.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:57:54
2026-05-28T19:58:17.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69874, datetime.datetime(2026, 5, 28, 19, 57, 54), datetime.datetime(2026, 5, 28, 19, 57, 54), 'salt', 8.19, 65.88, None, 13.94, 163.93, 5.99, 831.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:58:17.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:58:17.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:58:17.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:54, diff=23.314786s, valid=True
2026-05-28T19:58:17.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:58:17.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:58:17.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:12, diff=5.317606s, valid=True
2026-05-28T19:58:17.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:58:17.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:57:54, diff=23.324274s, valid=True
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:58:17.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:58:17.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:12, diff=5.32733s, valid=True
2026-05-28T19:58:17.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:58:17.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:58:17.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:58:17.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923739.327995s, valid=True
2026-05-28T19:58:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:58:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:58:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:58:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:58:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:58:17.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:58:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:58:17.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:58:17.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:58:17.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:58:17.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:58:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:58:17.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:58:17.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:58:17.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:58:18.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:58:18.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:58:18.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:58:18.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-28T19:58:18.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-28T19:58:18.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:58:18.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:58:48.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:58:48.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:58:48.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:58:48.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:58:48.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:58:49.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:58:49.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-28T19:58:49.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:58:49.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-28T19:58:49.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:58:49.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:58:49.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:58:49.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-28T19:58:51.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-28T19:58:51.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:58:51.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:58:51.533 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:58:51.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:58:51.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:58:51.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:58:51.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:58:51.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:58:51.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:58:51.554 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:58:51.554 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:58:51.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:58:51.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T19:58:51.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:58:51.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T19:58:51.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:58:51.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:58:51.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:58:51.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:58:51.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:58:51.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:58:51.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:58:51.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:58:51.882 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:58:24
2026-05-28T19:58:51.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69875, datetime.datetime(2026, 5, 28, 19, 58, 24), datetime.datetime(2026, 5, 28, 19, 58, 24), 'salt', 8.25, 65.92, None, 12.63, 172.42, 5.98, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:58:51.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:58:51.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T19:58:51.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:24, diff=27.888218s, valid=True
2026-05-28T19:58:51.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:58:51.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:58:51.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:12, diff=39.891047s, valid=True
2026-05-28T19:58:51.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:58:51.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T19:58:51.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:16, diff=35.897804s, valid=True
2026-05-28T19:58:51.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:58:51.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:58:51.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:58:51.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:58:51.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:58:51.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:58:51.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:58:12, diff=39.901055s, valid=True
2026-05-28T19:58:51.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:58:51.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:58:51.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:58:51.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923773.902004s, valid=True
2026-05-28T19:58:51.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:58:51.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:58:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:58:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:58:51.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:58:51.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:58:51.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:58:51.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:58:51.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:58:52.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:58:52.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:58:52.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:58:52.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:58:52.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:58:52.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:58:52.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:58:52.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:58:52.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:58:52.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-28T19:58:52.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-28T19:58:53.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:58:53.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:59:23.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:59:23.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:59:23.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:59:23.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:59:23.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:59:23.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:59:23.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-28T19:59:23.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:59:23.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-28T19:59:23.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:59:23.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:59:23.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:59:23.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-28T19:59:26.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T19:59:26.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T19:59:26.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T19:59:26.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T19:59:26.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T19:59:26.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T19:59:26.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T19:59:26.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T19:59:26.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T19:59:26.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T19:59:26.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T19:59:26.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T19:59:26.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T19:59:26.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T19:59:26.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T19:59:26.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T19:59:26.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:59:26.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:59:26.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T19:59:26.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T19:59:26.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T19:59:26.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T19:59:26.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T19:59:26.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T19:59:26.432 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:59:25
2026-05-28T19:59:26.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69877, datetime.datetime(2026, 5, 28, 19, 59, 25), datetime.datetime(2026, 5, 28, 19, 59, 24), 'salt', 8.25, 66.02, None, 12.49, 158.34, 5.96, 831.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T19:59:26.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T19:59:26.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T19:59:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:24, diff=2.439062s, valid=True
2026-05-28T19:59:26.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T19:59:26.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:59:26.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:12, diff=14.441919s, valid=True
2026-05-28T19:59:26.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T19:59:26.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:18, diff=8.449445s, valid=True
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T19:59:26.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T19:59:26.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T19:59:26.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:12, diff=14.453584s, valid=True
2026-05-28T19:59:26.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T19:59:26.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T19:59:26.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T19:59:26.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923808.454504s, valid=True
2026-05-28T19:59:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T19:59:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T19:59:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T19:59:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T19:59:26.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T19:59:26.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T19:59:26.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T19:59:26.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T19:59:26.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T19:59:26.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T19:59:26.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T19:59:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T19:59:26.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T19:59:26.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T19:59:27.003 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:59:27.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T19:59:27.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T19:59:27.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T19:59:27.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-28T19:59:27.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-28T19:59:27.664 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T19:59:27.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T19:59:57.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T19:59:57.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T19:59:57.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T19:59:57.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T19:59:57.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T19:59:58.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T19:59:58.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-28T19:59:58.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T19:59:58.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-28T19:59:58.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T19:59:58.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T19:59:58.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T19:59:58.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-28T20:00:00.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-28T20:00:00.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:00:00.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:00:00.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:00:00.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:00:00.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:00:00.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:00:00.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:00:00.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:00:00.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:00:00.644 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:00:00.645 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:00:00.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:00:00.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:00:00.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:00:00.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:00:00.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:00:00.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:00:00.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:00:00.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:00:00.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:00:00.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:00:00.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:00:00.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:00:00.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 19:59:55
2026-05-28T20:00:00.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69878, datetime.datetime(2026, 5, 28, 19, 59, 55), datetime.datetime(2026, 5, 28, 19, 59, 54), 'salt', 8.12, 66.22, None, 12.07, 164.12, 5.91, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:00:00.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:00:00.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:00:00.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:54, diff=6.997498s, valid=True
2026-05-28T20:00:00.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:00:00.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:00:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:12, diff=-10.998437s, valid=True
2026-05-28T20:00:01.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:00:01.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 19:59:50, diff=11.011113s, valid=True
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:00:01.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:00:01.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:12, diff=-10.984628s, valid=True
2026-05-28T20:00:01.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:00:01.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:00:01.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:00:01.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923843.016409s, valid=True
2026-05-28T20:00:01.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:00:01.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:00:01.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:00:01.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:00:01.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:00:01.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:00:01.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:00:01.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:00:01.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:00:01.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:00:01.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:00:01.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:00:01.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:00:01.491 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:00:01.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:00:02.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:00:02.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:00:02.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:00:02.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-28T20:00:02.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-28T20:00:03.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:00:03.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:00:33.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:00:33.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:00:33.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:00:33.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:00:33.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:00:33.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:00:33.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-28T20:00:33.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:00:33.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-28T20:00:33.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:00:33.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:00:33.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:00:33.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-28T20:00:36.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-28T20:00:36.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:00:36.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:00:36.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:00:36.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:00:36.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:00:36.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:00:36.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:00:36.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:00:36.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:00:36.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:00:36.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:00:36.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:00:36.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:00:36.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:00:36.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:00:36.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:00:36.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:00:36.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:00:36.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:00:36.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:00:36.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:00:36.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:00:36.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:00:36.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:00:25
2026-05-28T20:00:36.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69879, datetime.datetime(2026, 5, 28, 20, 0, 25), datetime.datetime(2026, 5, 28, 20, 0, 25), 'salt', 8.19, 66.18, None, 13.66, 164.07, 5.93, 831.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:00:36.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:00:36.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:00:36.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:25, diff=11.415138s, valid=True
2026-05-28T20:00:36.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:00:36.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:00:36.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:12, diff=24.418021s, valid=True
2026-05-28T20:00:36.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:00:36.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:00:36.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:21, diff=15.42472s, valid=True
2026-05-28T20:00:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:00:36.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:00:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:00:36.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:00:36.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:00:36.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:00:36.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:12, diff=24.427791s, valid=True
2026-05-28T20:00:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:00:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:00:36.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:00:36.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923878.428452s, valid=True
2026-05-28T20:00:36.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:00:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:00:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:00:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:00:36.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:00:36.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:00:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:00:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:00:36.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:00:36.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:00:36.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:00:36.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:00:36.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:00:36.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:00:36.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:00:37.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:00:37.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:00:37.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:00:37.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-28T20:00:37.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-28T20:00:37.656 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:00:37.656 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:01:07.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:01:07.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:01:07.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:01:07.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:01:07.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:01:08.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:01:08.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-28T20:01:08.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:01:08.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:01:08.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:01:08.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:01:08.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:01:08.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-28T20:01: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-28T20:01:10.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:01:10.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:01:10.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:01:10.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:01:10.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:01:10.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:01:10.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:01:10.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:01:10.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:01:10.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:01:10.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:01:10.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:01:10.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:01:10.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:01:10.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:01:10.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:01:11.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:01:11.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:01:11.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:01:11.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:01:11.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:01:11.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:01:11.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:01:11.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:00:55
2026-05-28T20:01:11.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69880, datetime.datetime(2026, 5, 28, 20, 0, 55), datetime.datetime(2026, 5, 28, 20, 0, 55), 'salt', 8.19, 65.92, None, 12.6, 150.97, 5.98, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:01:11.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:01:11.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:01:11.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:55, diff=16.212178s, valid=True
2026-05-28T20:01:11.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:01:11.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:01:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:12, diff=-0.784973s, valid=True
2026-05-28T20:01:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:01:11.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:01:11.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:00:52, diff=19.22187s, valid=True
2026-05-28T20:01:11.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:01:11.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:01:11.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:01:11.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:01:11.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:01:11.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:01:11.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:12, diff=-0.775097s, valid=True
2026-05-28T20:01:11.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:01:11.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:01:11.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:01:11.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923913.225555s, valid=True
2026-05-28T20:01:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:01:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:01:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:01:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:01:11.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:01:11.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:01:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:01:11.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:01:11.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:01:11.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:01:11.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:01:11.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:01:11.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:01:11.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:01:11.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:01:12.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:01:12.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:01:12.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:01:12.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-28T20:01:12.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-28T20:01:12.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:01:12.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:01:42.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:01:42.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:01:42.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:01:42.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:01:42.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:01:42.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:01:42.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-28T20:01:42.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:01:42.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-28T20:01:42.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:01:42.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:01:42.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:01:42.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-28T20:01:45.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-28T20:01:45.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:01:45.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:01:45.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:01:45.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:01:45.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:01:45.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:01:45.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:01:45.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:01:45.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:01:45.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:01:45.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:01:45.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:01:45.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:01:45.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:01:45.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:01:45.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:01:45.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:01:45.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:01:46.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:01:46.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:01:46.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:01:46.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:01:46.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:01:46.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:01:25
2026-05-28T20:01:46.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69881, datetime.datetime(2026, 5, 28, 20, 1, 25), datetime.datetime(2026, 5, 28, 20, 1, 25), 'salt', 8.19, 65.99, None, 11.89, 158.86, 5.97, 831.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:01:46.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:01:46.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:01:46.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:25, diff=21.083533s, valid=True
2026-05-28T20:01:46.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:01:46.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:01:46.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:12, diff=34.086416s, valid=True
2026-05-28T20:01:46.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:01:46.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:24, diff=22.093225s, valid=True
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:01:46.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:01:46.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:12, diff=34.096266s, valid=True
2026-05-28T20:01:46.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:01:46.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:01:46.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:01:46.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923948.096961s, valid=True
2026-05-28T20:01:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:01:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:01:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:01:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:01:46.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:01:46.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:01:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:01:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:01:46.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:01:46.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:01:46.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:01:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:01:46.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:01:46.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:01:46.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:01:46.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:01:47.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:01:47.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:01:47.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-28T20:01:47.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-28T20:01:47.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:01:47.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:02:17.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:02:17.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:02:17.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:02:17.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:02:17.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:02:17.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:02:17.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-28T20:02:17.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:02:17.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-28T20:02:17.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:02:17.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:02:17.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:02:17.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-28T20:02:20.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-28T20:02:20.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:02:20.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:02:20.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:02:20.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:02:20.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:02:20.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:02:20.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:02:20.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:02:20.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:02:20.923 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:02:20.923 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:02:20.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:02:21.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:02:21.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:02:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:02:21.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:02:21.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:02:21.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:02:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:02:21.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:02:21.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:02:21.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:02:21.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:02:21.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:01:56
2026-05-28T20:02:21.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69882, datetime.datetime(2026, 5, 28, 20, 1, 56), datetime.datetime(2026, 5, 28, 20, 1, 55), 'salt', 8.22, 65.79, None, 12.49, 153.41, 6.01, 831.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:02:21.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:02:21.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:02:21.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:55, diff=26.242551s, valid=True
2026-05-28T20:02:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:02:21.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:02:21.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:12, diff=9.24539s, valid=True
2026-05-28T20:02:21.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:02:21.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:02:21.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:01:55, diff=26.251977s, valid=True
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:02:21.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:02:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:12, diff=9.255006s, valid=True
2026-05-28T20:02:21.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:02:21.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:02:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:02:21.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=923983.255671s, valid=True
2026-05-28T20:02:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:02:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:02:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:02:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:02:21.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:02:21.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:02:21.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:02:21.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:02:21.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:02:21.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:02:21.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:02:21.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:02:21.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:02:21.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:02:21.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:02:22.149 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:02:22.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:02:22.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:02:22.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-28T20:02:22.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-28T20:02:22.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:02:22.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:02:52.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:02:52.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:02:52.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:02:52.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:02:52.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:02:52.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:02:52.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-28T20:02:52.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:02:52.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-28T20:02:52.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:02:52.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:02:52.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:02:52.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-28T20:02:55.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:02:55.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:02:55.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:02:55.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:02:55.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:02:55.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:02:55.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:02:55.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:02:55.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:02:55.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:02:55.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:02:55.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:02:55.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:02:55.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:02:55.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:02:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:02:55.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:02:55.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:02:55.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:02:55.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:02:55.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:02:55.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:02:55.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:02:55.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:02:55.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:02:26
2026-05-28T20:02:55.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69883, datetime.datetime(2026, 5, 28, 20, 2, 26), datetime.datetime(2026, 5, 28, 20, 2, 25), 'salt', 8.26, 65.82, None, 14.33, 166.44, 6.01, 831.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:02:55.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:02:55.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:02:55.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:25, diff=30.605476s, valid=True
2026-05-28T20:02:55.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:02:55.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:02:55.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:12, diff=43.608348s, valid=True
2026-05-28T20:02:55.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:02:55.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:02:55.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:18, diff=37.614913s, valid=True
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:02:55.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:02:55.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:02:12, diff=43.617947s, valid=True
2026-05-28T20:02:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:02:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:02:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:02:55.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924017.61861s, valid=True
2026-05-28T20:02:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:02:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:02:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:02:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:02:55.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:02:55.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:02:55.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:02:55.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:02:55.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:02:55.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:02:55.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:02:55.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:02:55.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:02:55.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:02:56.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:02:56.586 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:02:56.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:02:56.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:02:56.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-28T20:02:56.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-28T20:02:56.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:02:56.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:03:26.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:03:26.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:03:26.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:03:27.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:03:27.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:03:27.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:03:27.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-28T20:03:27.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:03:27.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-28T20:03:27.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:03:27.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:03:27.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:03:27.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-28T20:03: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-28T20:03:30.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:03:30.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:03:30.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:03:30.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:03:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:03:30.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:03:30.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:03:30.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:03:30.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:03:30.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:03:30.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:03:30.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:03:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:03:30.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:03:30.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:03:30.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:03:30.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:03:30.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:03:30.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:03:30.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:03:30.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:03:30.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:03:30.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:03:30.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:03:27
2026-05-28T20:03:30.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69885, datetime.datetime(2026, 5, 28, 20, 3, 27), datetime.datetime(2026, 5, 28, 20, 3, 27), 'salt', 8.22, 66.02, None, 15.17, 140.15, 5.96, 831.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:03:30.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:03:30.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:03:30.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:27, diff=3.460305s, valid=True
2026-05-28T20:03:30.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:03:30.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:03:30.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:12, diff=18.463855s, valid=True
2026-05-28T20:03:30.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:03:30.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:19, diff=11.471309s, valid=True
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:03:30.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:03:30.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:12, diff=18.474572s, valid=True
2026-05-28T20:03:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:03:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:03:30.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:03:30.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924052.475344s, valid=True
2026-05-28T20:03:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:03:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:03:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:03:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:03:30.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:03:30.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:03:30.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:03:30.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:03:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:03:30.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:03:30.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:03:30.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:03:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:03:30.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:03:31.048 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:03:31.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:03:31.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:03:31.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:03:31.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-28T20:03:31.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-28T20:03:31.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:03:31.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:04:01.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:04:01.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:04:01.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:04:02.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:04:02.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:04:02.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:04:02.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-28T20:04:02.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:04:02.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-28T20:04:02.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:04:02.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:04:02.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:04:02.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-28T20:04:04.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-28T20:04:04.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:04:04.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:04:04.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:04:04.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:04:04.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:04:04.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:04:04.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:04:04.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:04:04.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:04:04.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:04:04.579 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:04:04.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:04:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:04:04.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:04:04.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:04:04.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:04:04.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:04:04.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:04:04.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:04:04.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:04:04.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:04:04.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:04:04.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:04:04.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:03:57
2026-05-28T20:04:04.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69886, datetime.datetime(2026, 5, 28, 20, 3, 57), datetime.datetime(2026, 5, 28, 20, 3, 57), 'salt', 8.16, 65.92, None, 13.34, 158.04, 5.98, 831.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:04:04.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:04:04.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:04:04.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:57, diff=7.89631s, valid=True
2026-05-28T20:04:04.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:04:04.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:04:04.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:12, diff=-7.100728s, valid=True
2026-05-28T20:04:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:04:04.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:03:51, diff=13.906014s, valid=True
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:04:04.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:04:04.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:12, diff=-7.090917s, valid=True
2026-05-28T20:04:04.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:04:04.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:04:04.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:04:04.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924086.909752s, valid=True
2026-05-28T20:04:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:04:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:04:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:04:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:04:04.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:04:04.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:04:04.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:04:04.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:04:04.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:04:05.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:04:05.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:04:05.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:04:05.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:04:05.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:04:05.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:04:05.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:04:05.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:04:05.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:04:05.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-28T20:04:05.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-28T20:04:06.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:04:06.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:04:36.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:04:36.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:04:36.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:04:36.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:04:36.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:04:36.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:04:36.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-28T20:04:36.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:04:36.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-28T20:04:36.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:04:36.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:04:36.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:04:36.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-28T20:04:40.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-28T20:04:40.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:04:40.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:04:40.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:04:40.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:04:40.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:04:40.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:04:42.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:04:42.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:04:42.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:04:42.006 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:04:42.006 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:04:42.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:04:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:04:42.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:04:42.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:04:42.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:04:42.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:04:42.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:04:42.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:04:42.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:04:42.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:04:42.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:04:42.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:04:42.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:04:28
2026-05-28T20:04:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69887, datetime.datetime(2026, 5, 28, 20, 4, 28), datetime.datetime(2026, 5, 28, 20, 4, 27), 'salt', 8.19, 65.72, None, 13.34, 159.42, 6.02, 831.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:04:42.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:04:42.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:04:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:27, diff=15.323259s, valid=True
2026-05-28T20:04:42.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:04:42.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:04:42.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:12, diff=30.32606s, valid=True
2026-05-28T20:04:42.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:04:42.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:04:42.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:22, diff=20.332974s, valid=True
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:04:42.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:04:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:12, diff=30.33658s, valid=True
2026-05-28T20:04:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:04:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:04:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:04:42.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924124.337319s, valid=True
2026-05-28T20:04:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:04:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:04:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:04:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:04:42.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:04:42.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:04:42.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:04:42.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:04:42.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:04:42.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:04:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:04:42.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:04:42.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:04:42.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:04:42.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:04:43.288 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:04:43.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:04:43.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:04:43.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-28T20:04:43.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-28T20:04:43.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:04:43.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:05:13.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:05:13.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:05:13.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:05:14.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:05:14.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:05:14.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:05:14.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-28T20:05:14.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:05:14.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-28T20:05:14.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:05:14.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:05:14.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:05:14.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-28T20:05:16.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:05:16.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:05:16.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:05:16.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:05:16.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:05:16.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:05:16.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:05:16.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:05:16.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:05:16.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:05:16.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:05:16.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:05:16.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:05:16.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:05:16.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:05:16.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:05:16.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:05:17.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:05:17.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:05:17.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:05:17.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:05:17.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:05:17.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:05:17.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:05:17.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:04:58
2026-05-28T20:05:17.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69888, datetime.datetime(2026, 5, 28, 20, 4, 58), datetime.datetime(2026, 5, 28, 20, 4, 57), 'salt', 8.29, 65.69, None, 13.3, 162.97, 6.04, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:05:17.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:05:17.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:05:17.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:57, diff=20.131321s, valid=True
2026-05-28T20:05:17.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:05:17.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:05:17.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:12, diff=5.134169s, valid=True
2026-05-28T20:05:17.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:05:17.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:05:17.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:04:54, diff=23.140886s, valid=True
2026-05-28T20:05:17.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:05:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:05:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:05:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:05:17.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:05:17.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:05:17.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:12, diff=5.143905s, valid=True
2026-05-28T20:05:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:05:17.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:05:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:05:17.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924159.144586s, valid=True
2026-05-28T20:05:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:05:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:05:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:05:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:05:17.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:05:17.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:05:17.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:05:17.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:05:17.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:05:17.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:05:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:05:17.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:05:17.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:05:17.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:05:17.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:05:18.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:05:18.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:05:18.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:05: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-28T20:05: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-28T20:05:18.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:05:18.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:05:48.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:05:48.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:05:48.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:05:48.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:05:48.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:05:49.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:05:49.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-28T20:05:49.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:05:49.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-28T20:05:49.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:05:49.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:05:49.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:05: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-28T20:05:51.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-28T20:05:51.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:05:51.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:05:51.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:05:51.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:05:51.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:05:51.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:05:51.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:05:51.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:05:51.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:05:51.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:05:51.969 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:05:51.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:05:52.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:05:52.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:05:52.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:05:52.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:05:52.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:05:52.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:05:52.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:05:52.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:05:52.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:05:52.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:05:52.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:05:52.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:05:28
2026-05-28T20:05:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69889, datetime.datetime(2026, 5, 28, 20, 5, 28), datetime.datetime(2026, 5, 28, 20, 5, 28), 'salt', 8.29, 65.56, None, 12.99, 155.34, 6.06, 831.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:05:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:05:52.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:05:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:28, diff=24.282053s, valid=True
2026-05-28T20:05:52.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:05:52.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:05:52.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:12, diff=40.284878s, valid=True
2026-05-28T20:05:52.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:05:52.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:25, diff=27.291481s, valid=True
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:05:52.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:05:52.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:12, diff=40.294459s, valid=True
2026-05-28T20:05:52.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:05:52.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:05:52.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:05:52.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924194.295125s, valid=True
2026-05-28T20:05:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:05:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:05:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:05:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:05:52.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:05:52.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:05:52.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:05:52.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:05:52.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:05:52.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:05:52.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:05:52.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:05:52.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:05:52.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:05:52.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:05:53.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:05:53.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:05:53.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:05:53.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:05:53.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:05:53.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:05:53.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:06:23.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:06:23.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:06:23.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:06:23.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:06:23.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:06:24.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:06:24.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-28T20:06:24.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:06:24.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-28T20:06:24.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:06:24.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:06:24.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:06:24.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-28T20:06:27.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-28T20:06:27.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:06:27.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:06:27.278 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:06:27.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:06:27.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:06:27.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:06:27.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:06:27.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:06:27.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:06:27.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:06:27.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:06:27.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:06:27.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:06:27.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:06:27.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:06:27.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:06:27.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:06:27.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:06:27.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:06:27.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:06:27.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:06:27.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:06:27.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:06:27.687 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:05:58
2026-05-28T20:06:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69890, datetime.datetime(2026, 5, 28, 20, 5, 58), datetime.datetime(2026, 5, 28, 20, 5, 58), 'salt', 8.19, 65.42, None, 12.49, 152.83, 6.09, 831.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:06:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:06:27.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:06:27.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:58, diff=29.693908s, valid=True
2026-05-28T20:06:27.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:06:27.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:06:27.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:06:12, diff=15.697413s, valid=True
2026-05-28T20:06:27.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:06:27.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:05:56, diff=31.704138s, valid=True
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:06:27.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:06:27.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:06:12, diff=15.707174s, valid=True
2026-05-28T20:06:27.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:06:27.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:06:27.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:06:27.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924229.707858s, valid=True
2026-05-28T20:06:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:06:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:06:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:06:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:06:27.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:06:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:06:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:06:27.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:06:27.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:06:27.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:06:27.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:06:27.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:06:28.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:06:28.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:06:28.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:06:28.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:06:28.757 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:06:28.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:06:28.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:06:28.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:06:28.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:06:28.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:06:58.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:06:58.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:06:58.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:06:59.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:06:59.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:06:59.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:06:59.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:06:59.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:06:59.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-28T20:06:59.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:06:59.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:06:59.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:06:59.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-28T20:07:02.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-28T20:07:02.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:07:02.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:07:02.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:07:02.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:07:02.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:07:02.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:07:02.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:07:02.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:07:02.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:07:02.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:07:02.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:07:02.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:07:02.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:07:02.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:07:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:07:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:07:02.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:07:02.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:07:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:07:02.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:07:02.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:07:02.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:07:02.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:07:02.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:06:59
2026-05-28T20:07:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69892, datetime.datetime(2026, 5, 28, 20, 6, 59), datetime.datetime(2026, 5, 28, 20, 6, 58), 'salt', 8.32, 65.06, None, 13.2, 157.9, 6.17, 831.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:07:02.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:07:02.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:07:02.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:06:58, diff=4.527818s, valid=True
2026-05-28T20:07:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:07:02.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:07:02.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:12, diff=-9.469311s, valid=True
2026-05-28T20:07:02.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:07:02.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:06:51, diff=11.537354s, valid=True
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:07:02.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:07:02.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:12, diff=-9.459596s, valid=True
2026-05-28T20:07:02.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:07:02.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:07:02.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:07:02.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924264.541068s, valid=True
2026-05-28T20:07:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:07:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:07:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:07:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:07:02.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:07:02.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:07:02.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:07:02.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:07:02.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:07:02.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:07:02.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:07:02.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:07:02.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:07:02.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:07:03.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:07:03.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:07:03.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:07:03.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:07:03.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-28T20:07:03.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-28T20:07:03.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:07:03.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:07:33.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:07:33.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:07:33.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:07:34.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:07:34.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:07:34.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:07:34.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-28T20:07:34.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:07:34.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:07:34.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:07:34.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:07:34.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:07:34.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-28T20:07:37.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:07:37.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:07:37.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:07:37.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:07:37.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:07:37.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:07:37.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:07:37.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:07:37.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:07:37.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:07:37.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:07:37.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:07:37.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:07:37.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:07:37.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:07:37.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:07:37.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:07:37.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:07:37.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:07:37.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:07:37.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:07:37.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:07:37.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:07:37.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:07:37.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:07:29
2026-05-28T20:07:37.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69893, datetime.datetime(2026, 5, 28, 20, 7, 29), datetime.datetime(2026, 5, 28, 20, 7, 29), 'salt', 8.42, 64.86, None, 13.9, 154.76, 6.22, 831.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:07:37.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:07:37.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:07:37.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:29, diff=8.359465s, valid=True
2026-05-28T20:07:37.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:07:37.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:07:37.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:12, diff=25.36232s, valid=True
2026-05-28T20:07:37.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:07:37.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:07:37.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:21, diff=16.368809s, valid=True
2026-05-28T20:07:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:07:37.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:07:37.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:07:37.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:07:37.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:07:37.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:07:37.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:12, diff=25.371824s, valid=True
2026-05-28T20:07:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:07:37.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:07:37.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:07:37.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924299.372485s, valid=True
2026-05-28T20:07:37.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:07:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:07:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:07:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:07:37.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:07:37.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:07:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:07:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:07:37.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:07:37.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:07:37.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:07:37.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:07:37.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:07:37.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:07:37.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:07:38.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:07:38.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:07:38.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:07:38.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-28T20:07:38.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-28T20:07:38.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:07:38.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:08:08.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:08:08.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:08:08.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:08:08.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:08:08.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:08:09.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:08:09.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-28T20:08:09.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:08:09.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-28T20:08:09.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:08:09.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:08:09.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:08:09.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:08:11.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-28T20:08:11.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:08:11.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:08:11.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:08:11.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:08:11.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:08:12.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:08:12.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:08:12.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:08:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:08:12.011 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:08:12.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:08:12.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:08:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:08:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:08:12.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:08:12.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:08:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:08:12.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:08:12.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:08:12.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:08:12.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:08:12.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:08:12.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:08:12.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:07:59
2026-05-28T20:08:12.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69894, datetime.datetime(2026, 5, 28, 20, 7, 59), datetime.datetime(2026, 5, 28, 20, 7, 59), 'salt', 8.29, 64.76, None, 14.93, 155.48, 6.24, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:08:12.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:08:12.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:08:12.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:59, diff=13.353851s, valid=True
2026-05-28T20:08:12.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:08:12.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:08:12.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:12, diff=0.356723s, valid=True
2026-05-28T20:08:12.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:08:12.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:07:52, diff=20.363352s, valid=True
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:08:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:08:12.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:12, diff=0.366408s, valid=True
2026-05-28T20:08:12.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:08:12.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:08:12.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:08:12.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924334.367072s, valid=True
2026-05-28T20:08:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:08:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:08:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:08:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:08:12.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:08:12.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:08:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:08:12.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:08:12.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:08:12.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:08:12.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:08:12.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:08:12.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:08:12.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:08:13.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:08:13.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:08:13.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:08:13.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:08:13.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-28T20:08:13.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-28T20:08:13.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:08:13.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:08:43.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:08:43.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:08:43.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:08:43.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:08:43.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:08:43.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:08:43.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:08:43.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:08:43.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-28T20:08:43.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:08:43.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:08:44.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:08:44.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-28T20:08:46.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-28T20:08:46.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:08:46.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:08:46.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:08:46.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:08:46.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:08:46.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:08:46.454 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:08:46.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:08:46.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:08:46.455 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:08:46.455 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:08:46.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:08:46.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:08:46.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:08:46.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:08:46.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:08:46.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:08:46.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:08:46.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:08:46.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:08:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:08:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:08:46.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:08:46.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:08:29
2026-05-28T20:08:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69895, datetime.datetime(2026, 5, 28, 20, 8, 29), datetime.datetime(2026, 5, 28, 20, 8, 29), 'salt', 8.46, 64.43, None, 13.73, 150.13, 6.32, 831.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:08:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:08:46.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:08:46.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:29, diff=17.796253s, valid=True
2026-05-28T20:08:46.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:08:46.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:08:46.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:12, diff=34.79909s, valid=True
2026-05-28T20:08:46.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:08:46.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:23, diff=23.805596s, valid=True
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:08:46.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:08:46.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:08:46.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:12, diff=34.808571s, valid=True
2026-05-28T20:08:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:08:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:08:46.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:08:46.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924368.809229s, valid=True
2026-05-28T20:08:46.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:08:46.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:08:46.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:08:46.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:08:46.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:08:46.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:08:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:08:46.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:08:46.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:08:46.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:08:47.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:08:47.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:08:47.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:08:47.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:08:47.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:08:47.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:08:47.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:08:47.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:08:47.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-28T20:08:47.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-28T20:08:48.040 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:08:48.040 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:09:18.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:09:18.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:09:18.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:09:18.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:09:18.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:09:18.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:09:18.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:09:18.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:09: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-28T20:09:18.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:09:18.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:09:18.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:09:18.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-28T20:09:21.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-28T20:09:21.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:09:21.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:09:21.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:09:21.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:09:21.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:09:21.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:09:21.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:09:21.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:09:21.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:09:21.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:09:21.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:09:21.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:09:21.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:09:21.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:09:21.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:09:21.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:09:21.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:09:21.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:09:21.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:09:21.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:09:21.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:09:21.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:09:21.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:09:21.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:09:00
2026-05-28T20:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69896, datetime.datetime(2026, 5, 28, 20, 9), datetime.datetime(2026, 5, 28, 20, 8, 59), 'salt', 8.52, 64.16, None, 11.86, 155.93, 6.37, 831.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:09:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:09:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:09:21.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:59, diff=22.95939s, valid=True
2026-05-28T20:09:21.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:09:21.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:09:21.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:12, diff=9.963123s, valid=True
2026-05-28T20:09:21.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:09:21.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:09:21.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:08:55, diff=26.973918s, valid=True
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:09:21.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:09:21.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:12, diff=9.978859s, valid=True
2026-05-28T20:09:21.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:09:21.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:09:21.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:09:21.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924403.979926s, valid=True
2026-05-28T20:09:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:09:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:09:21.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:09:21.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:09:21.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:09:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:09:22.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:09:22.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:09:22.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:09:22.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:09:22.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:09:22.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:09:22.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:09:22.379 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:09:22.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:09:22.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:09:23.070 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:09:23.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:09:23.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-28T20:09:23.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-28T20:09:23.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:09:23.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:09:53.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:09:53.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:09:53.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:09:53.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:09:53.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:09:53.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:09:53.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-28T20:09:53.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:09:53.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-28T20:09:53.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:09:53.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:09:53.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:09:53.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-28T20:09:56.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-28T20:09:56.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:09:56.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:09:56.156 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:09:56.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:09:56.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:09:56.178 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:09:56.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:09:56.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:09:56.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:09:56.179 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:09:56.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:09:56.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:09:56.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:09:56.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:09:56.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:09:56.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:09:56.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:09:56.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:09:56.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:09:56.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:09:56.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:09:56.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:09:56.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:09:56.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:09:30
2026-05-28T20:09:56.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69897, datetime.datetime(2026, 5, 28, 20, 9, 30), datetime.datetime(2026, 5, 28, 20, 9, 29), 'salt', 8.56, 63.83, None, 13.8, 155.74, 6.45, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:09:56.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:09:56.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:09:56.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:29, diff=27.49308s, valid=True
2026-05-28T20:09:56.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:09:56.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:09:56.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:12, diff=44.495885s, valid=True
2026-05-28T20:09:56.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:09:56.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:27, diff=29.502412s, valid=True
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:09:56.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:09:56.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:09:12, diff=44.505445s, valid=True
2026-05-28T20:09:56.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:09:56.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:09:56.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:09:56.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924438.506128s, valid=True
2026-05-28T20:09:56.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:09:56.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:09:56.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:09:56.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:09:56.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:09:56.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:09:56.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:09:56.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:09:56.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:09:56.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:09:56.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:09:56.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:09:56.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:09:56.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:09:57.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:09:57.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:09:57.493 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:09:57.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:09:57.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-28T20:09:57.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-28T20:09:57.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:09:57.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:10:27.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:10:27.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:10:27.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:10:28.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:10:28.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:10:28.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:10:28.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-28T20:10:28.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:10:28.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-28T20:10:28.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:10:28.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:10:28.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:10:28.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-28T20:10:31.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-28T20:10:31.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:10:31.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:10:31.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:10:31.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:10:31.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:10:31.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:10:31.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:10:31.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:10:31.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:10:31.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:10:31.166 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:10:31.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:10:31.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:10:31.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:10:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:10:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:10:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:10:31.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:10:31.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:10:31.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:10:31.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:10:31.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:10:31.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:10:31.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:10:30
2026-05-28T20:10:31.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69899, datetime.datetime(2026, 5, 28, 20, 10, 30), datetime.datetime(2026, 5, 28, 20, 10, 30), 'salt', 8.52, 64.16, None, 13.34, 162.1, 6.37, 831.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:10:31.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:10:31.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:10:31.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:10:30, diff=1.490813s, valid=True
2026-05-28T20:10:31.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:10:31.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:10:31.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:10:12, diff=19.493741s, valid=True
2026-05-28T20:10:31.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:10:31.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:10:30, diff=1.500399s, valid=True
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:10:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:10:31.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:10:12, diff=19.503409s, valid=True
2026-05-28T20:10:31.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:10:31.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:10:31.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:10:31.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924473.504074s, valid=True
2026-05-28T20:10:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:10:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:10:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:10:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:10:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:10:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:10:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:10:31.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:10:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:10:31.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:10:31.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:10:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:10:31.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:10:31.905 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:10:32.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:10:32.490 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:10:32.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:10:32.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:10:32.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:10:32.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:10:32.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:10:32.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:11:02.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:11:02.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:11:02.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:11:03.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:11:03.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:11:03.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:11:03.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:11:03.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:11: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-28T20:11:03.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:11:03.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:11:03.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:11:03.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-28T20:11:05.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-28T20:11:05.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:11:05.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:11:05.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:11:05.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:11:05.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:11:05.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:11:05.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:11:05.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:11:05.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:11:05.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:11:05.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:11:05.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:11:05.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:11:05.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:11:06.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:11:06.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:11:06.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:11:06.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:11:06.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:11:06.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:11:06.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:11:06.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:11:06.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:11:06.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:11:01
2026-05-28T20:11:06.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69900, datetime.datetime(2026, 5, 28, 20, 11, 1), datetime.datetime(2026, 5, 28, 20, 11), 'salt', 8.46, 64.36, None, 12.42, 156.14, 6.33, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:11:06.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:11:06.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:11:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:00, diff=6.177697s, valid=True
2026-05-28T20:11:06.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:11:06.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:11:06.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=-5.819457s, valid=True
2026-05-28T20:11:06.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:11:06.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:10:53, diff=13.187139s, valid=True
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:11:06.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:11:06.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=-5.809856s, valid=True
2026-05-28T20:11:06.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:11:06.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:11:06.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:11:06.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924508.190812s, valid=True
2026-05-28T20:11:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:11:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:11:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:11:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:11:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:11:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:11:06.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:11:06.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:11:06.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:11:06.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:11:06.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:11:06.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:11:06.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:11:06.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:11:06.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:11:07.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:11:07.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:11:07.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:11:07.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-28T20:11:07.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-28T20:11:07.354 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:11:07.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:11:37.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:11:37.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:11:37.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:11:37.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:11:37.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:11:38.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:11:38.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-28T20:11:38.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:11: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-28T20:11:38.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:11:38.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:11:38.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:11:38.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-28T20:11:40.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-28T20:11:40.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:11:40.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:11:40.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:11:40.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:11:40.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:11:40.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:11:40.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:11:40.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:11:40.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:11:40.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:11:40.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:11:40.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:11:40.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:11:40.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:11:40.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:11:40.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:11:40.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:11:40.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:11:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:11:40.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:11:40.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:11:40.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:11:40.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:11:41.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:11:31
2026-05-28T20:11:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69901, datetime.datetime(2026, 5, 28, 20, 11, 31), datetime.datetime(2026, 5, 28, 20, 11, 30), 'salt', 8.36, 64.93, None, 14.47, 154.74, 6.21, 831.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:11:41.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:11:41.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:11:41.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:30, diff=11.038928s, valid=True
2026-05-28T20:11:41.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:11:41.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:11:41.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=29.041804s, valid=True
2026-05-28T20:11:41.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:11:41.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:23, diff=18.048335s, valid=True
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:11:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:11:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=29.051394s, valid=True
2026-05-28T20:11:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:11:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:11:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:11:41.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924543.052044s, valid=True
2026-05-28T20:11:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:11:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:11:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:11:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:11:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:11:41.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:11:41.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:11:41.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:11:41.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:11:41.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:11:41.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:11:41.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:11:41.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:11:41.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:11:41.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:11:41.926 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:11:42.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:11:42.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:11: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-28T20:11: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-28T20:11:42.111 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:11:42.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:12:12.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:12:12.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:12:12.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:12:12.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:12:12.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:12:12.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:12:12.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-28T20:12:12.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:12:12.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-28T20:12:12.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:12:12.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:12:12.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:12:12.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-28T20:12:15.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-28T20:12:15.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:12:15.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:12:15.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:12:15.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:12:15.326 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:12:15.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:12:15.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:12:15.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:12:15.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:12:15.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:12:15.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:12:15.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:12:15.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:12:15.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:12:15.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:12:15.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:12:15.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:12:15.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:12:15.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:12:15.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:12:15.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:12:15.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:12:15.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:12:15.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:12:02
2026-05-28T20:12:15.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69902, datetime.datetime(2026, 5, 28, 20, 12, 2), datetime.datetime(2026, 5, 28, 20, 12, 1), 'salt', 8.36, 65.26, None, 12.74, 155.75, 6.13, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:12:15.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:12:15.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:12:15.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:12:01, diff=14.662854s, valid=True
2026-05-28T20:12:15.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:12:15.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:12:15.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=63.665755s, valid=True
2026-05-28T20:12:15.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:12:15.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:54, diff=21.67257s, valid=True
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:12:15.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:12:15.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:12:15.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=63.675606s, valid=True
2026-05-28T20:12:15.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:12:15.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:12:15.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:12:15.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924577.676272s, valid=True
2026-05-28T20:12:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:12:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:12:15.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:12:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:12:15.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:12:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:12:15.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:12:15.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:12:15.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:12:15.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:12:16.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:12:16.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:12:16.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:12:16.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:12:16.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:12:16.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:12:16.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:12:16.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:12:16.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-28T20:12:16.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-28T20:12:17.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:12:17.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:12:47.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:12:47.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:12:47.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:12:47.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:12:47.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:12:47.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:12:47.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-28T20:12:47.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:12:47.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-28T20:12:47.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:12:47.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:12:47.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:12:47.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-28T20:12:50.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-28T20:12:50.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:12:50.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:12:50.400 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:12:50.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:12:50.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:12:50.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:12:50.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:12:50.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:12:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:12:50.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:12:50.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:12:50.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:12:50.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:12:50.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:12:50.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:12:50.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:12:50.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:12:50.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:12:50.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:12:50.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:12:50.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:12:50.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:12:50.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:12:50.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:12:32
2026-05-28T20:12:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69903, datetime.datetime(2026, 5, 28, 20, 12, 32), datetime.datetime(2026, 5, 28, 20, 12, 32), 'salt', 8.39, 65.42, None, 15.32, 150.86, 6.1, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:12:50.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:12:50.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:12:50.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:12:32, diff=18.736322s, valid=True
2026-05-28T20:12:50.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:12:50.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:12:50.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=98.739172s, valid=True
2026-05-28T20:12:50.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:12:50.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:12:50.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:12:26, diff=24.745737s, valid=True
2026-05-28T20:12:50.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:12:50.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:12:50.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:12:50.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:12:50.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:12:50.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:12:50.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=98.748784s, valid=True
2026-05-28T20:12:50.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:12:50.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:12:50.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:12:50.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924612.749437s, valid=True
2026-05-28T20:12:50.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:12:50.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:12:50.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:12:50.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:12:50.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:12:50.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:12:50.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:12:50.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:12:50.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:12:50.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:12:50.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:12:50.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:12:51.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:12:51.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:12:51.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:12:51.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:12:51.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:12:51.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:12:51.729 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:12:51.729 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:12:51.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:12:51.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:13:21.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:13:21.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:13:21.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:13:22.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:13:22.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:13:22.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:13:22.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-28T20:13:22.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:13:22.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-28T20:13:22.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:13:22.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:13:22.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:13:22.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-28T20:13:25.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-28T20:13:25.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:13:25.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:13:25.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:13:25.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:13:25.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:13:25.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:13:25.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:13:25.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:13:25.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:13:25.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:13:25.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:13:25.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:13:25.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:13:25.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:13:25.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:13:25.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:13:25.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:13:25.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:13:25.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:13:25.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:13:25.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:13:25.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:13:25.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:13:25.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:13:02
2026-05-28T20:13:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69904, datetime.datetime(2026, 5, 28, 20, 13, 2), datetime.datetime(2026, 5, 28, 20, 13, 2), 'salt', 8.23, 65.33, None, 14.12, 151.52, 6.12, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:13:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:13:25.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:13:25.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:13:02, diff=23.645235s, valid=True
2026-05-28T20:13:25.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:13:25.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:13:25.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=133.648145s, valid=True
2026-05-28T20:13:25.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:13:25.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:13:25.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:12:57, diff=28.654646s, valid=True
2026-05-28T20:13:25.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:13:25.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:13:25.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:13:25.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:13:25.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:13:25.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:13:25.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=133.657651s, valid=True
2026-05-28T20:13:25.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:13:25.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:13:25.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:13:25.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924647.658301s, valid=True
2026-05-28T20:13:25.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:13:25.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:13:25.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:13:25.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:13:25.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:13:25.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:13:25.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:13:25.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:13:25.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:13:25.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:13:25.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:13:25.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:13:25.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:13:25.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:13:26.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:13:26.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:13:26.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:13:26.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:13:26.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-28T20:13:26.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-28T20:13:26.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:13:26.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:13:56.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:13:56.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:13:56.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:13:57.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:13:57.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:13:57.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:13:57.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-28T20:13:57.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:13:57.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:13:57.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:13:57.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:13:57.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:13:57.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-28T20:14:00.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-28T20:14:00.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:14:00.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:14:00.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:14:00.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:14:00.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:14:00.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:14:00.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:14:00.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:14:00.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:14:00.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:14:00.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:14:00.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:14:00.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:14:00.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:14:00.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:14:00.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:14:00.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:14:00.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:14:00.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:14:00.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:14:00.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:14:00.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:14:00.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:14:00.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:13:32
2026-05-28T20:14:00.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69905, datetime.datetime(2026, 5, 28, 20, 13, 32), datetime.datetime(2026, 5, 28, 20, 13, 32), 'salt', 8.36, 65.69, None, 17.04, 153.45, 6.04, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:14:00.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:14:00.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:14:00.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:13:32, diff=28.787544s, valid=True
2026-05-28T20:14:00.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:14:00.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:14:00.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=168.79038s, valid=True
2026-05-28T20:14:00.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:14:00.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:14:00.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:13:28, diff=32.796848s, valid=True
2026-05-28T20:14:00.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:14:00.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:14:00.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:14:00.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:14:00.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:14:00.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:14:00.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=168.799875s, valid=True
2026-05-28T20:14:00.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:14:00.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:14:00.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:14:00.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924682.800516s, valid=True
2026-05-28T20:14:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:14:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:14:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:14:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:14:00.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:14:00.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:14:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:14:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:14:00.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:14:00.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:14:00.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:14:01.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:14:01.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:14:01.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:14:01.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:14:01.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:14:01.778 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:14:01.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:14:01.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-28T20:14:01.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-28T20:14:01.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:14:01.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:14:31.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:14:31.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:14:31.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:14:32.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:14:32.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:14:32.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:14:32.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:14:32.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:14: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-28T20:14:32.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:14:32.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:14:32.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:14:32.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-28T20:14:35.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-28T20:14:35.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:14:35.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:14:35.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:14:35.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:14:35.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:14:35.466 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:14:35.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:14:35.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:14:35.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:14:35.467 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:14:35.467 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:14:35.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:14:35.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:14:35.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:14:35.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:14:35.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:14:35.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:14:35.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:14:35.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:14:35.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:14:35.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:14:35.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:14:35.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:14:35.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:14:33
2026-05-28T20:14:35.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69907, datetime.datetime(2026, 5, 28, 20, 14, 33), datetime.datetime(2026, 5, 28, 20, 14, 33), 'salt', 8.42, 65.39, None, 15.91, 150.58, 6.1, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:14:35.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:14:35.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:14:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:14:33, diff=2.793083s, valid=True
2026-05-28T20:14:35.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:14:35.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:14:35.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=203.795972s, valid=True
2026-05-28T20:14:35.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:14:35.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:14:35.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:14:31, diff=4.802725s, valid=True
2026-05-28T20:14:35.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:14:35.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:14:35.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:14:35.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:14:35.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:14:35.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:14:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=203.805736s, valid=True
2026-05-28T20:14:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:14:35.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:14:35.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:14:35.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924717.806381s, valid=True
2026-05-28T20:14:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:14:35.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:14:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:14:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:14:35.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:14:35.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:14:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:14:35.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:14:35.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:14:35.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:14:36.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:14:36.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:14:36.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:14:36.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:14:36.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:14:36.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:14:36.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:14:36.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:14:36.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-28T20:14:36.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-28T20:14:37.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:14:37.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:15:07.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:15:07.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:15:07.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:15:07.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:15:07.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:15:07.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:15:07.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-28T20:15:07.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:15:07.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-28T20:15:07.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:15:07.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:15:07.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:15:07.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-28T20:15:10.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-28T20:15:10.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:15:10.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:15:10.594 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:15:10.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:15:10.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:15:10.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:15:10.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:15:10.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:15:10.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:15:10.616 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:15:10.616 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:15:10.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:15:10.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:15:10.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:15:10.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:15:10.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:15:10.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:15:10.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:15:10.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:15:10.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:15:10.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:15:10.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:15:10.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:15:10.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:15:03
2026-05-28T20:15:10.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69908, datetime.datetime(2026, 5, 28, 20, 15, 3), datetime.datetime(2026, 5, 28, 20, 15, 3), 'salt', 8.49, 65.36, None, 18.49, 152.88, 6.12, 831.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:15:10.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:15:10.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:15:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:15:03, diff=7.931602s, valid=True
2026-05-28T20:15:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:15:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:15:10.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=238.934402s, valid=True
2026-05-28T20:15:10.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:15:10.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:15:10.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:15:03, diff=7.940863s, valid=True
2026-05-28T20:15:10.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:15:10.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:15:10.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:15:10.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:15:10.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:15:10.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:15:10.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=238.943835s, valid=True
2026-05-28T20:15:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:15:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:15:10.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:15:10.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924752.944512s, valid=True
2026-05-28T20:15:10.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:15:10.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:15:10.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:15:10.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:15:10.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:15:11.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:15:11.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:15:11.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:15:11.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:15:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:15:11.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:15:11.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:15:11.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:15:11.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:15:11.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:15:11.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:15:11.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:15:11.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:15:11.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:15:11.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-28T20:15:14.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:15:14.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:15:44.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:15:44.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:15:44.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:15:44.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:15:44.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:15:44.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:15:44.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-28T20:15:44.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:15:44.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-28T20:15:44.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:15:44.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:15:44.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:15:44.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-28T20:15:47.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:15:47.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:15:47.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:15:47.777 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:15:47.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:15:47.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:15:47.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:15:47.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:15:47.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:15:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:15:47.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:15:47.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:15:47.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:15:47.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:15:47.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:15:47.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:15:47.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:15:48.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:15:48.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:15:48.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:15:48.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:15:48.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:15:48.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:15:48.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:15:48.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:15:33
2026-05-28T20:15:48.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69909, datetime.datetime(2026, 5, 28, 20, 15, 33), datetime.datetime(2026, 5, 28, 20, 15, 33), 'salt', 8.56, 65.26, None, 16.9, 151.01, 6.14, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:15:48.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:15:48.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:15:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:15:33, diff=15.112976s, valid=True
2026-05-28T20:15:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:15:48.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:15:48.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=276.115817s, valid=True
2026-05-28T20:15:48.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:15:48.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:15:26, diff=22.122426s, valid=True
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:15:48.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:15:48.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=276.125452s, valid=True
2026-05-28T20:15:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:15:48.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:15:48.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:15:48.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924790.126113s, valid=True
2026-05-28T20:15:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:15:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:15:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:15:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:15:48.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:15:48.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:15:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:15:48.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:15:48.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:15:48.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:15:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:15:48.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:15:48.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:15:48.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:15:48.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:15:49.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:15:49.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:15:49.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:15: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-28T20:15: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-28T20:15:49.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:15:49.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:16:19.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:16:19.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:16:19.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:16:19.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:16:19.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:16:19.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:16:19.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-28T20:16:19.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:16:19.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-28T20:16:19.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:16:19.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:16:19.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:16:19.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-28T20:16:22.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-28T20:16:22.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:16:22.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:16:22.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:16:22.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:16:22.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:16:22.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:16:22.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:16:22.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:16:22.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:16:22.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:16:22.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:16:22.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:16:22.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:16:22.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:16:22.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:16:22.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:16:22.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:16:22.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:16:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:16:22.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:16:22.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:16:22.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:16:22.959 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:16:23.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:16:03
2026-05-28T20:16:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69910, datetime.datetime(2026, 5, 28, 20, 16, 3), datetime.datetime(2026, 5, 28, 20, 16, 3), 'salt', 8.52, 65.39, None, 17.29, 142.37, 6.11, 831.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:16:23.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:16:23.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:16:23.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:16:03, diff=20.025262s, valid=True
2026-05-28T20:16:23.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:16:23.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:16:23.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=311.028108s, valid=True
2026-05-28T20:16:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:16:23.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:16:23.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:15:57, diff=26.034733s, valid=True
2026-05-28T20:16:23.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:16:23.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:16:23.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:16:23.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:16:23.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:16:23.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:16:23.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=311.037724s, valid=True
2026-05-28T20:16:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:16:23.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:16:23.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:16:23.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924825.038388s, valid=True
2026-05-28T20:16:23.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:16:23.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:16:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:16:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:16:23.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:16:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:16:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:16:23.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:16:23.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:16:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:16:23.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:16:23.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:16:23.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:16:23.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:16:23.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:16:23.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:16:24.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:16:24.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:16:24.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-28T20:16:24.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-28T20:16:24.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:16:24.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:16:54.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:16:54.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:16:54.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:16:54.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:16:54.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:16:54.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:16:54.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-28T20:16:54.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:16:54.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-28T20:16:54.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:16:54.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:16:54.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:16:54.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-28T20:16:57.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-28T20:16:57.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:16:57.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:16:57.531 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:16:57.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:16:57.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:16:57.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:16:57.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:16:57.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:16:57.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:16:57.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:16:57.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:16:57.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:16:57.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:16:57.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:16:57.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:16:57.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:16:57.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:16:57.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:16:57.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:16:57.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:16:57.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:16:57.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:16:57.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:16:57.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:16:34
2026-05-28T20:16:57.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69911, datetime.datetime(2026, 5, 28, 20, 16, 34), datetime.datetime(2026, 5, 28, 20, 16, 33), 'salt', 8.56, 65.36, None, 17.82, 143.61, 6.12, 831.49, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:16:57.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:16:57.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:16:57.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:16:33, diff=24.944552s, valid=True
2026-05-28T20:16:57.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:16:57.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:16:57.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=345.947456s, valid=True
2026-05-28T20:16:57.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:16:57.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:16:27, diff=30.954118s, valid=True
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:16:57.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:16:57.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=345.957176s, valid=True
2026-05-28T20:16:57.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:16:57.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:16:57.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:16:57.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924859.957847s, valid=True
2026-05-28T20:16:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:16:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:16:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:16:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:16:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:16:58.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:16:58.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:16:58.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:16:58.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:16:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:16:58.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:16:58.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:16:58.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:16:58.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:16:58.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:16:58.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:16:58.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:16:58.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:16:58.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-28T20:16:58.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-28T20:16:59.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:16:59.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:17:29.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:17:29.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:17:29.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:17:29.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:17:29.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:17:29.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:17:29.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-28T20:17:29.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:17:29.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-28T20:17:29.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:17:29.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:17:29.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:17:29.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-28T20:17: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-28T20:17:32.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:17:32.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:17:32.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:17:32.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:17:32.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:17:32.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:17:32.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:17:32.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:17:32.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:17:32.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:17:32.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:17:32.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:17:32.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:17:32.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:17:32.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:17:32.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:17:32.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:17:32.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:17:32.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:17:32.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:17:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:17:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:17:32.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:17:32.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:17:04
2026-05-28T20:17:32.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69912, datetime.datetime(2026, 5, 28, 20, 17, 4), datetime.datetime(2026, 5, 28, 20, 17, 3), 'salt', 8.56, 65.43, None, 17.22, 144.34, 6.11, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:17:32.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:17:32.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:17:32.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:17:03, diff=29.443068s, valid=True
2026-05-28T20:17:32.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:17:32.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:17:32.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=380.445921s, valid=True
2026-05-28T20:17:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:17:32.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:16:58, diff=34.452591s, valid=True
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:17:32.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:17:32.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:17:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:11:12, diff=380.455614s, valid=True
2026-05-28T20:17:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:17:32.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:17:32.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:17:32.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924894.456268s, valid=True
2026-05-28T20:17:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:17:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:17:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:17:32.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:17:32.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:17:32.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:17:32.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:17:32.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:17:32.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:17:32.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:17:32.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:17:32.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:17:32.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:17:32.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:17:32.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:17:33.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:17:33.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:17:33.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:17:33.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-28T20:17:33.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-28T20:17:33.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:17:33.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:18:03.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:18:03.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:18:03.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:18:04.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:18:04.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:18:04.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:18:04.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-28T20:18:04.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:18:04.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-28T20:18:04.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:18:04.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:18:04.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:18:04.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-28T20:18:06.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-28T20:18:06.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:18:06.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:18:06.754 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:18:06.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:18:06.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:18:06.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:18:06.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:18:06.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:18:06.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:18:06.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:18:06.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:18:06.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:18:06.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:18:06.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:18:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:18:06.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:18:06.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:18:06.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:18:07.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:18:07.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:18:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:18:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:18:07.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:18:07.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:18:04
2026-05-28T20:18:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69914, datetime.datetime(2026, 5, 28, 20, 18, 4), datetime.datetime(2026, 5, 28, 20, 18, 4), 'salt', 8.82, 65.53, None, 16.66, 146.9, 6.09, 831.43, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:18:07.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:18:07.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:18:07.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:04, diff=3.087425s, valid=True
2026-05-28T20:18:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:18:07.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:18:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:12, diff=-4.909772s, valid=True
2026-05-28T20:18:07.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:18:07.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:18:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:01, diff=6.096687s, valid=True
2026-05-28T20:18:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:18:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:18:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:18:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:18:07.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:18:07.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:18:07.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:12, diff=-4.900371s, valid=True
2026-05-28T20:18:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:18:07.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:18:07.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:18:07.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924929.100263s, valid=True
2026-05-28T20:18:07.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:18:07.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:18:07.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:18:07.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:18:07.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:18:07.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:18:07.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:18:07.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:18:07.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:18:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:18:07.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:18:07.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:18:07.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:18:07.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:18:07.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:18:07.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:18:08.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:18:08.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:18:08.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-28T20:18:08.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-28T20:18:08.191 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:18:08.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:18:38.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:18:38.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:18:38.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:18:38.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:18:38.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:18:38.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:18:38.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-28T20:18:38.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:18:38.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-28T20:18:38.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:18:38.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:18:38.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:18:38.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-28T20:18:41.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-28T20:18:41.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:18:41.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:18:41.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:18:41.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:18:41.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:18:41.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:18:41.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:18:41.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:18:41.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:18:41.717 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:18:41.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:18:41.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:18:41.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:18:41.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:18:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:18:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:18:41.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:18:41.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:18:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:18:41.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:18:41.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:18:41.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:18:41.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:18:42.020 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:18:34
2026-05-28T20:18:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69915, datetime.datetime(2026, 5, 28, 20, 18, 34), datetime.datetime(2026, 5, 28, 20, 18, 34), 'salt', 8.56, 65.79, None, 17.29, 148.61, 6.03, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:18:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:18:42.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:18:42.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:34, diff=8.026859s, valid=True
2026-05-28T20:18:42.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:18:42.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:18:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:12, diff=-29.970342s, valid=True
2026-05-28T20:18:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:18:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:18:33, diff=9.036547s, valid=True
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:18:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:18:42.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:18:42.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:12, diff=-29.960128s, valid=True
2026-05-28T20:18:42.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:18:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:18:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:18:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924964.040749s, valid=True
2026-05-28T20:18:42.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:18:42.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:18:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:18:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:18:42.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:18:42.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:18:42.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:18:42.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:18:42.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:18:42.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:18:42.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:18:42.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:18:42.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:18:42.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:18:42.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:18:43.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:18:43.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:18:43.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:18:43.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-28T20:18:43.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-28T20:18:43.311 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:18:43.311 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:19:13.341 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:19:13.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:19:13.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:19:13.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:19:13.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:19:13.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:19:13.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-28T20:19:13.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:19:13.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-28T20:19:13.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:19:13.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:19:13.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:19:13.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-28T20:19:16.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-28T20:19:16.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:19:16.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:19:16.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:19:16.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:19:16.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:19:16.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:19:16.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:19:16.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:19:16.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:19:16.246 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:19:16.246 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:19:16.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:19:16.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:19:16.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:19:16.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:19:16.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:19:16.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:19:16.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:19:16.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:19:16.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:19:16.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:19:16.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:19:16.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:19:16.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:19:05
2026-05-28T20:19:16.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69916, datetime.datetime(2026, 5, 28, 20, 19, 5), datetime.datetime(2026, 5, 28, 20, 19, 4), 'salt', 8.52, 65.79, None, 15.21, 149.74, 6.02, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:19:16.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:19:16.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:19:16.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:04, diff=12.566993s, valid=True
2026-05-28T20:19:16.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:19:16.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:19:16.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:12, diff=4.569847s, valid=True
2026-05-28T20:19:16.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:19:16.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:04, diff=12.57654s, valid=True
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:19:16.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:19:16.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:12, diff=4.579585s, valid=True
2026-05-28T20:19:16.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:19:16.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:19:16.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:19:16.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=924998.580249s, valid=True
2026-05-28T20:19:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:19:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:19:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:19:16.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:19:16.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:19:16.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:19:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:19:16.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:19:16.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:19:16.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:19:16.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:19:16.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:19:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:19:16.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:19:17.117 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:19:17.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:19:17.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:19:17.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:19:17.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-28T20:19:17.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-28T20:19:17.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:19:17.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:19:47.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:19:47.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:19:47.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:19:48.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:19:48.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:19:48.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:19:48.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-28T20:19:48.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:19:48.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-28T20:19:48.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:19:48.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:19:48.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:19:48.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-28T20:19:50.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-28T20:19:50.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:19:50.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:19:50.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:19:50.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:19:50.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:19:50.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:19:50.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:19:50.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:19:50.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:19:50.807 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:19:50.807 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:19:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:19:50.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:19:50.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:19:50.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:19:50.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:19:51.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:19:51.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:19:51.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:19:51.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:19:51.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:19:51.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:19:51.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:19:51.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:19:35
2026-05-28T20:19:51.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69917, datetime.datetime(2026, 5, 28, 20, 19, 35), datetime.datetime(2026, 5, 28, 20, 19, 34), 'salt', 8.62, 65.92, None, 15.53, 147.96, 6.0, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:19:51.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:19:51.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:19:51.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:34, diff=17.134071s, valid=True
2026-05-28T20:19:51.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:19:51.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:19:51.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:12, diff=-20.863113s, valid=True
2026-05-28T20:19:51.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:19:51.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:19:29, diff=22.143569s, valid=True
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:19:51.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:19:51.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:19:51.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:12, diff=-20.853439s, valid=True
2026-05-28T20:19:51.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:19:51.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:19:51.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:19:51.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925033.14722s, valid=True
2026-05-28T20:19:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:19:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:19:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:19:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:19:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:19:51.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:19:51.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:19:51.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:19:51.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:19:51.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:19:51.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:19:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:19:51.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:19:51.552 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:19:51.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:19:52.121 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:19:52.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:19:52.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:19:52.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-28T20:19:52.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-28T20:19:52.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:19:52.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:20:22.408 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:20:22.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:20:22.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:20:22.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:20:22.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:20:22.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:20:22.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-28T20:20:22.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:20:22.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-28T20:20:22.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:20:22.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:20:22.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:20:22.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-28T20:20:25.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-28T20:20:25.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:20:25.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:20:25.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:20:25.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:20:25.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:20:25.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:20:25.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:20:25.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:20:25.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:20:25.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:20:25.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:20:25.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:20:25.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:20:25.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:20:25.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:20:25.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:20:25.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:20:25.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:20:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-28T20:20:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:20:25.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:20:25.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:20:25.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:20:25.733 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:20:05
2026-05-28T20:20:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69918, datetime.datetime(2026, 5, 28, 20, 20, 5), datetime.datetime(2026, 5, 28, 20, 20, 5), 'salt', 8.49, 65.86, None, 15.24, 147.11, 6.01, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:20:25.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:20:25.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:20:25.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:05, diff=20.739309s, valid=True
2026-05-28T20:20:25.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:20:25.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:20:25.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:12, diff=13.74212s, valid=True
2026-05-28T20:20:25.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:20:25.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:20:25.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:00, diff=25.748666s, valid=True
2026-05-28T20:20:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:20:25.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:20:25.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:20:25.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:20:25.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:20:25.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-28T20:20:25.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:12, diff=13.751693s, valid=True
2026-05-28T20:20:25.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:20:25.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:20:25.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:20:25.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925067.752371s, valid=True
2026-05-28T20:20:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:20:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:20:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:20:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:20:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:20:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:20:25.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:20:25.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:20:25.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:20:25.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:20:25.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:20:25.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:20:26.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:20:26.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:20:26.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:20:26.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:20:26.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:20:26.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:20:26.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-28T20:20:26.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-28T20:20:26.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:20:26.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:20:56.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:20:56.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:20:56.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:20:57.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:20:57.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:20:57.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:20:57.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-28T20:20:57.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:20:57.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-28T20:20:57.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:20:57.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:20:57.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:20:57.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-28T20:21:00.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-28T20:21:00.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:21:00.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:21:00.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:21:00.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:21:00.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:21:00.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:21:00.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:21:00.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:21:00.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:21:00.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:21:00.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:21:00.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:21:00.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:21:00.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:21:00.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:21:00.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:21:00.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:21:00.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:21:00.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:21:00.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:21:00.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:21:00.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:21:00.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:21:00.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:20:35
2026-05-28T20:21:00.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69919, datetime.datetime(2026, 5, 28, 20, 20, 35), datetime.datetime(2026, 5, 28, 20, 20, 35), 'salt', 8.46, 65.86, None, 16.55, 148.26, 6.01, 831.67, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:21:00.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:21:00.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:21:00.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:35, diff=25.751912s, valid=True
2026-05-28T20:21:00.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:21:00.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:21:00.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:12, diff=-11.24523s, valid=True
2026-05-28T20:21:00.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:21:00.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:20:30, diff=30.76133s, valid=True
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:21:00.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:21:00.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:12, diff=-11.235698s, valid=True
2026-05-28T20:21:00.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:21:00.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:21:00.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:21:00.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925102.764977s, valid=True
2026-05-28T20:21:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:21:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:21:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:21:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:21:00.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:21:00.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:21:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:21:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:21:00.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:21:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:21:01.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:21:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:21:01.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:21:01.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:21:01.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:21:01.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:21:01.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:21:01.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:21:01.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-28T20:21:01.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-28T20:21:02.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:21:02.088 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:21:32.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:21:32.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:21:32.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:21:32.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:21:32.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:21:32.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:21:32.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-28T20:21:32.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:21:32.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-28T20:21:32.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:21:32.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:21:32.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:21:32.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:21:35.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-28T20:21:35.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:21:35.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:21:35.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:21:35.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:21:35.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:21:35.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:21:35.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:21:35.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:21:35.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:21:35.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:21:35.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:21:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:21:35.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:21:35.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:21:35.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:21:35.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:21:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:21:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:21:35.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T20:21:35.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:21:35.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:21:35.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:21:35.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:21:35.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:21:05
2026-05-28T20:21:35.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69920, datetime.datetime(2026, 5, 28, 20, 21, 5), datetime.datetime(2026, 5, 28, 20, 21, 5), 'salt', 8.59, 65.92, None, 16.51, 154.22, 6.0, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:21:35.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:21:35.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:21:35.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:05, diff=30.374321s, valid=True
2026-05-28T20:21:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:21:35.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:21:35.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:12, diff=23.37714s, valid=True
2026-05-28T20:21:35.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:21:35.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:21:35.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:00, diff=35.383708s, valid=True
2026-05-28T20:21:35.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:21:35.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:21:35.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:21:35.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:21:35.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:21:35.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T20:21:35.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:21:12, diff=23.386671s, valid=True
2026-05-28T20:21:35.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:21:35.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:21:35.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:21:35.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925137.387317s, valid=True
2026-05-28T20:21:35.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:21:35.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:21:35.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:21:35.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:21:35.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:21:35.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:21:35.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:21:35.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:21:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:21:35.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:21:35.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:21:35.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:21:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:21:35.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:21:35.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:21:36.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:21:36.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:21:36.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:21:36.378 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:21:36.378 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:21:36.530 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:21:36.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:22:06.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:22:06.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:22:06.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:22:06.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:22:06.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:22:07.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:22:07.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-28T20:22:07.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:22:07.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-28T20:22:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:22:07.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:22:07.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:22:07.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-28T20:22:09.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:22:09.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:22:09.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:22:09.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:22:09.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:22:09.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:22:09.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:22:09.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:22:09.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:22:09.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:22:09.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:22:09.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:22:09.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:22:09.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:22:09.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:22:09.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:22:09.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:22:09.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:22:09.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:22:09.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T20:22:09.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:22:09.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:22:09.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:22:09.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:22:09.957 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:22:06
2026-05-28T20:22:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69922, datetime.datetime(2026, 5, 28, 20, 22, 6), datetime.datetime(2026, 5, 28, 20, 22, 6), 'salt', 8.59, 65.82, None, 16.41, 147.09, 6.02, 831.61, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:22:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:22:09.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:22:09.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:06, diff=3.965923s, valid=True
2026-05-28T20:22:09.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:22:09.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:22:09.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:12, diff=-2.031151s, valid=True
2026-05-28T20:22:09.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:22:09.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:22:09.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:02, diff=7.976326s, valid=True
2026-05-28T20:22:09.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:22:09.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:22:09.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:22:09.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:22:09.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:22:09.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T20:22:09.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:12, diff=-2.020124s, valid=True
2026-05-28T20:22:09.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:22:09.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:22:09.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:22:09.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925171.980571s, valid=True
2026-05-28T20:22:09.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:22:09.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:22:09.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:22:09.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:22:09.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:22:10.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:22:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:22:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:22:10.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:22:10.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:22:10.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:22:10.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:22:10.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:22:10.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:22:10.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:22:10.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:22:11.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:22:11.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:22:11.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-28T20:22:11.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-28T20:22:11.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:22:11.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:22:41.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:22:41.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:22:41.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:22:41.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:22:41.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:22:41.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:22:41.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-28T20:22:41.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:22:41.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-28T20:22:41.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:22:41.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:22:41.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:22:41.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-28T20:22:44.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-28T20:22:44.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:22:44.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:22:44.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:22:44.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:22:44.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:22:44.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:22:44.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:22:44.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:22:44.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:22:44.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:22:44.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:22:44.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:22:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:22:44.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:22:44.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:22:44.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:22:44.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:22:44.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:22:44.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:22:44.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:22:44.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:22:44.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:22:44.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:22:44.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:22:36
2026-05-28T20:22:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69923, datetime.datetime(2026, 5, 28, 20, 22, 36), datetime.datetime(2026, 5, 28, 20, 22, 36), 'salt', 8.56, 65.86, None, 16.27, 150.96, 6.01, 831.73, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:22:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:22:44.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:22:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:36, diff=8.96925s, valid=True
2026-05-28T20:22:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:22:44.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:22:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:12, diff=-27.027972s, valid=True
2026-05-28T20:22:44.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:22:44.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:22:34, diff=10.978562s, valid=True
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:22:44.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:22:44.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:22:44.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:12, diff=-27.018456s, valid=True
2026-05-28T20:22:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:22:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:22:44.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:22:44.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925206.982207s, valid=True
2026-05-28T20:22:44.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:22:44.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:22:44.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:22:44.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:22:44.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:22:45.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:22:45.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:22:45.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:22:45.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:22:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:22:45.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:22:45.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:22:45.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:22:45.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:22:45.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:22:45.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:22:45.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:22:45.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:22:45.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-28T20:22:45.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-28T20:22:46.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:22:46.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:23:16.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:23:16.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:23:16.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:23:16.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:23:16.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:23:16.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:23:16.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-28T20:23:16.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:23:16.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-28T20:23:16.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:23:16.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:23:16.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:23:16.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-28T20:23:19.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:23:19.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:23:19.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:23:19.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:23:19.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:23:19.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:23:19.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:23:19.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:23:19.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:23:19.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:23:19.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:23:19.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:23:19.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:23:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:23:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:23:19.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:23:19.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:23:19.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:23:19.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:23:19.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T20:23:19.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:23:19.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:23:19.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:23:19.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:23:19.601 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:23:06
2026-05-28T20:23:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69924, datetime.datetime(2026, 5, 28, 20, 23, 6), datetime.datetime(2026, 5, 28, 20, 23, 6), 'salt', 8.49, 66.16, None, 17.29, 145.59, 5.94, 831.79, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:23:19.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:23:19.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:23:19.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:06, diff=13.607862s, valid=True
2026-05-28T20:23:19.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:23:19.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:23:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:12, diff=7.610639s, valid=True
2026-05-28T20:23:19.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:23:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:05, diff=14.617145s, valid=True
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:23:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T20:23:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:12, diff=7.620077s, valid=True
2026-05-28T20:23:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:23:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:23:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:23:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925241.620732s, valid=True
2026-05-28T20:23:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:23:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:23:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:23:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:23:19.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:23:19.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:23:19.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:23:19.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:23:19.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:23:19.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:23:19.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:23:19.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:23:19.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:23:19.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:23:20.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:23:20.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:23:20.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:23:20.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:23:20.665 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:23:20.665 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:23:20.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:23:20.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:23:50.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:23:50.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:23:50.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:23:51.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:23:51.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:23:51.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:23:51.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-28T20:23:51.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:23:51.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-28T20:23:51.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:23:51.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:23:51.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:23:51.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-28T20:23:53.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-28T20:23:53.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:23:53.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:23:53.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:23:53.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:23:53.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:23:53.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:23:53.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:23:53.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:23:53.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:23:53.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:23:53.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:23:53.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:23:54.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:23:54.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:23:54.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:23:54.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:23:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:23:54.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:23:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:23:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:23:54.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:23:54.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:23:54.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:23:54.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:23:36
2026-05-28T20:23:54.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69925, datetime.datetime(2026, 5, 28, 20, 23, 36), datetime.datetime(2026, 5, 28, 20, 23, 36), 'salt', 8.46, 66.29, None, 15.63, 143.8, 5.92, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:23:54.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:23:54.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:23:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:36, diff=18.248545s, valid=True
2026-05-28T20:23:54.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:23:54.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:23:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:12, diff=-17.748543s, valid=True
2026-05-28T20:23:54.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:23:54.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:23:32, diff=22.258057s, valid=True
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:23:54.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:23:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:12, diff=-17.738877s, valid=True
2026-05-28T20:23:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:23:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:23:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:23:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925276.261782s, valid=True
2026-05-28T20:23:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:23:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:23:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:23:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:23:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:23:54.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:23:54.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:23:54.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:23:54.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:23:54.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:23:54.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:23:54.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:23:54.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:23:54.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:23:54.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:23:55.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:23:55.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:23:55.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:23:55.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-28T20:23:55.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-28T20:23:55.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:23:55.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:24:25.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:24:25.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:24:25.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:24:26.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:24:26.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:24:26.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:24:26.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-28T20:24:26.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:24:26.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-28T20:24:26.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:24:26.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:24:26.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:24:26.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-28T20:24:28.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-28T20:24:28.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:24:28.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:24:28.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:24:28.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:24:28.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:24:28.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:24:28.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:24:28.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:24:28.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:24:28.895 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:24:28.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:24:28.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:24:28.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:24:28.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:24:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:24:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:24:29.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:24:29.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:24:29.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T20:24:29.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:24:29.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:24:29.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:24:29.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:24:29.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:24:07
2026-05-28T20:24:29.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69926, datetime.datetime(2026, 5, 28, 20, 24, 7), datetime.datetime(2026, 5, 28, 20, 24, 6), 'salt', 8.33, 66.65, None, 14.68, 156.52, 5.84, 831.55, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:24:29.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:24:29.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:24:29.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:06, diff=23.213413s, valid=True
2026-05-28T20:24:29.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:24:29.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:24:29.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:12, diff=17.21627s, valid=True
2026-05-28T20:24:29.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:24:29.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:02, diff=27.223126s, valid=True
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:24:29.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T20:24:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:12, diff=17.226197s, valid=True
2026-05-28T20:24:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:24:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:24:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:24:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925311.22686s, valid=True
2026-05-28T20:24:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:24:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:24:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:24:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:24:29.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:24:29.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:24:29.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:24:29.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:24:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:24:29.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:24:29.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:24:29.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:24:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:24:29.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:24:29.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:24:30.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:24:30.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:24:30.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:24:30.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-28T20:24:30.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-28T20:24:31.152 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:24:31.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:25:01.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:25:01.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:25:01.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:25:01.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:25:01.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:25:01.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:25:01.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-28T20:25:01.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:25:01.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:25:01.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:25:01.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:25:01.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:25:01.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-28T20:25:04.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-28T20:25:04.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:25:04.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:25:04.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:25:04.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:25:04.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:25:04.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20: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-28T20:25:04.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:25:04.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:25:04.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:25:04.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:25:04.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:25:04.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:25:04.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:25:04.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:25:04.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:25:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:25:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:25:04.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:25:04.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:25:04.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:25:04.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:25:04.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:25:04.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:24:37
2026-05-28T20:25:04.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69927, datetime.datetime(2026, 5, 28, 20, 24, 37), datetime.datetime(2026, 5, 28, 20, 24, 37), 'salt', 8.33, 66.69, None, 12.25, 167.16, 5.83, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:25:04.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:25:04.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:25:04.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:37, diff=27.40553s, valid=True
2026-05-28T20:25:04.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:25:04.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:25:04.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:25:12, diff=-7.59155s, valid=True
2026-05-28T20:25:04.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:25:04.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:24:32, diff=32.415134s, valid=True
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:25:04.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:25:04.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:25:12, diff=-7.581805s, valid=True
2026-05-28T20:25:04.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:25:04.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:25:04.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:25:04.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925346.418868s, valid=True
2026-05-28T20:25:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:25:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:25:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:25:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:25:04.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:25:04.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:25:04.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:25:04.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:25:04.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:25:04.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:25:04.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:25:04.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:25:04.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:25:04.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:25:05.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:25:05.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:25:05.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:25:05.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:25:05.498 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:25:05.498 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:25:05.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:25:05.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:25:35.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:25:35.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:25:35.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:25:36.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:25:36.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:25:36.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:25:36.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-28T20:25:36.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:25:36.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-28T20:25:36.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:25:36.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:25:36.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:25:36.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-28T20:25:39.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:25:39.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:25:39.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:25:39.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:25:39.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:25:39.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:25:39.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:25:39.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:25:39.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:25:39.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:25:39.255 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:25:39.255 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:25:39.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:25:39.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:25:39.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:25:39.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:25:39.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:25:39.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:25:39.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:25:39.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:25:39.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:25:39.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:25:39.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:25:39.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:25:39.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:25:37
2026-05-28T20:25:39.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69929, datetime.datetime(2026, 5, 28, 20, 25, 37), datetime.datetime(2026, 5, 28, 20, 25, 37), 'salt', 8.26, 67.12, None, 12.07, 158.62, 5.73, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:25:39.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:25:39.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:25:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:25:37, diff=2.581514s, valid=True
2026-05-28T20:25:39.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:25:39.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:25:39.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:12, diff=-32.415622s, valid=True
2026-05-28T20:25:39.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:25:39.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:25:33, diff=6.590982s, valid=True
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:25:39.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:25:39.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:12, diff=-32.406002s, valid=True
2026-05-28T20:25:39.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:25:39.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:25:39.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:25:39.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925381.594661s, valid=True
2026-05-28T20:25:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:25:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:25:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:25:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:25:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:25:39.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:25:39.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:25:39.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:25:39.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:25:39.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:25:39.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:25:39.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:25:39.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:25:39.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:25:40.197 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:25:40.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:25:40.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:25:40.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:25:40.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-28T20:25:40.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-28T20:25:40.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:25:40.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:26:10.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:26:10.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:26:10.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:26:10.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:26:10.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:26:11.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:26:11.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:26:11.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:26:11.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-28T20:26:11.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:26:11.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:26:11.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:26: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-28T20:26:14.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-28T20:26:14.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:26:14.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:26:14.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:26:14.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:26:14.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:26:14.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:26:14.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:26:14.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:26:14.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:26:14.076 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:26:14.076 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:26:14.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:26:14.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:26:14.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:26:14.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:26:14.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:26:14.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:26:14.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:26:14.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:26:14.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:26:14.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:26:14.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:26:14.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:26:14.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:26:07
2026-05-28T20:26:14.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69930, datetime.datetime(2026, 5, 28, 20, 26, 7), datetime.datetime(2026, 5, 28, 20, 26, 7), 'salt', 8.26, 67.49, None, 10.94, 155.14, 5.65, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:26:14.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:26:14.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:26:14.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:07, diff=7.407129s, valid=True
2026-05-28T20:26:14.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:26:14.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:26:14.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:12, diff=2.411788s, valid=True
2026-05-28T20:26:14.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:26:14.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:26:14.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:03, diff=11.421526s, valid=True
2026-05-28T20:26:14.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:26:14.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:26:14.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:26:14.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:26:14.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:26:14.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:26:14.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:12, diff=2.425761s, valid=True
2026-05-28T20:26:14.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:26:14.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:26:14.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:26:14.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925416.426709s, valid=True
2026-05-28T20:26:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:26:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:26:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:26:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:26:14.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:26:14.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:26:14.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:26:14.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:26:14.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:26:14.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:26:14.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:26:14.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:26:14.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:26:14.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:26:15.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:26:15.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:26:15.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:26:15.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:26:15.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-28T20:26:15.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-28T20:26:15.751 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:26:15.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:26:45.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:26:45.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:26:45.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:26:46.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:26:46.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:26:46.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:26:46.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-28T20:26:46.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:26:46.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-28T20:26:46.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:26:46.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:26:46.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:26:46.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-28T20:26:48.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-28T20:26:48.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:26:48.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:26:48.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:26:48.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:26:48.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:26:48.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:26:48.856 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:26:48.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:26:48.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:26:48.856 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:26:48.856 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:26:48.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:26:48.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:26:48.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:26:49.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:26:49.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:26:49.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:26:49.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:26:49.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:26:49.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:26:49.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:26:49.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:26:49.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:26:49.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:26:38
2026-05-28T20:26:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69931, datetime.datetime(2026, 5, 28, 20, 26, 38), datetime.datetime(2026, 5, 28, 20, 26, 37), 'salt', 8.49, 67.68, None, 13.62, 166.46, 5.62, 831.68, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:26:49.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:26:49.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:26:49.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:37, diff=12.177659s, valid=True
2026-05-28T20:26:49.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:26:49.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:26:49.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:12, diff=-22.819506s, valid=True
2026-05-28T20:26:49.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:26:49.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:26:35, diff=14.187137s, valid=True
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:26:49.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:26:49.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:12, diff=-22.809859s, valid=True
2026-05-28T20:26:49.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:26:49.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:26:49.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:26:49.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925451.190814s, valid=True
2026-05-28T20:26:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:26:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:26:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:26:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:26:49.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:26:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:26:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:26:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:26:49.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:26:49.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:26:49.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:26:49.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:26:49.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:26:49.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:26:49.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:26:50.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:26:50.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:26:50.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:26:50.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-28T20:26:50.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-28T20:26:50.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:26:50.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:27:20.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:27:20.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:27:20.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:27:20.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:27:20.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:27:20.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:27:20.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-28T20:27:20.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:27:20.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-28T20:27:20.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:27:20.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:27:20.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:27:20.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-28T20:27:23.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-28T20:27:23.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:27:23.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:27:23.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:27:23.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:27:23.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:27:23.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:27:23.371 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:27:23.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:27:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:27:23.371 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:27:23.372 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:27:23.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:27:23.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:27:23.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:27:23.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:27:23.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:27:23.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:27:23.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:27:23.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:27:23.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:27:23.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:27:23.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:27:23.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:27:23.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:27:08
2026-05-28T20:27:23.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69932, datetime.datetime(2026, 5, 28, 20, 27, 8), datetime.datetime(2026, 5, 28, 20, 27, 8), 'salt', 8.0, 68.05, None, 13.09, 145.4, 5.53, 831.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:27:23.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:27:23.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:27:23.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:08, diff=15.702027s, valid=True
2026-05-28T20:27:23.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:27:23.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:27:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:12, diff=11.70484s, valid=True
2026-05-28T20:27:23.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:27:23.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:06, diff=17.71148s, valid=True
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:27:23.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:27:23.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:12, diff=11.714482s, valid=True
2026-05-28T20:27:23.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:27:23.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:27:23.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:27:23.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925485.715145s, valid=True
2026-05-28T20:27:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:27:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:27:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:27:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:27:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:27:23.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:27:23.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:27:23.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:27:23.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:27:23.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:27:23.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:27:24.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:27:24.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:27:24.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:27:24.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:27:24.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:27:24.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:27:24.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:27:24.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-28T20:27:24.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-28T20:27:24.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:27:24.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:27:54.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:27:54.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:27:54.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:27:55.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:27:55.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:27:55.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:27:55.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-28T20:27:55.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:27:55.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-28T20:27:55.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:27:55.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:27:55.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:27:55.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:27:58.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-28T20:27:58.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:27:58.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:27:58.505 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:27:58.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:27:58.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:27:58.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:27:58.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:27:58.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:27:58.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:27:58.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:27:58.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:27:58.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:27:58.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:27:58.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:27:58.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:27:58.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:27:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:27:58.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:27:58.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:27:58.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:27:58.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:27:58.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:27:58.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:27:58.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:27:38
2026-05-28T20:27:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69933, datetime.datetime(2026, 5, 28, 20, 27, 38), datetime.datetime(2026, 5, 28, 20, 27, 38), 'salt', 7.93, 68.22, None, 12.92, 153.38, 5.49, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:27:58.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:27:58.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:27:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:38, diff=20.85581s, valid=True
2026-05-28T20:27:58.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:27:58.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:27:58.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:12, diff=-13.141351s, valid=True
2026-05-28T20:27:58.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:27:58.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:27:37, diff=21.86518s, valid=True
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:27:58.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:27:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:12, diff=-13.131789s, valid=True
2026-05-28T20:27:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:27:58.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:27:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:27:58.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925520.868875s, valid=True
2026-05-28T20:27:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:27:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:27:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:27:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:27:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:27:58.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:27:58.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:27:58.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:27:58.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:27:59.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:27:59.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:27:59.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:27:59.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:27:59.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:27:59.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:27:59.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:27:59.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:27:59.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:27:59.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-28T20:27:59.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-28T20:28:00.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:28:00.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:28:30.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:28:30.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:28:30.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:28:30.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:28:30.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:28:30.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:28:30.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-28T20:28:30.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:28:30.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:28:30.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:28:30.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:28:30.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:28:30.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-28T20:28:33.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-28T20:28:33.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:28:33.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:28:33.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:28:33.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:28:33.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:28:33.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:28:33.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:28:33.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:28:33.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:28:33.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:28:33.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:28:33.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:28:33.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:28:33.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:28:33.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:28:33.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:28:33.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:28:33.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:28:33.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:28:33.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:28:33.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:28:33.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:28:33.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:28:33.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:28:08
2026-05-28T20:28:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69934, datetime.datetime(2026, 5, 28, 20, 28, 8), datetime.datetime(2026, 5, 28, 20, 28, 8), 'salt', 8.03, 68.51, None, 12.0, 154.04, 5.43, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:28:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:28:33.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:28:33.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:08, diff=25.482158s, valid=True
2026-05-28T20:28:33.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:28:33.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:28:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:12, diff=21.485041s, valid=True
2026-05-28T20:28:33.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:28:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:28:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:04, diff=29.491645s, valid=True
2026-05-28T20:28:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:28:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:28:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:28:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:28:33.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:28:33.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:28:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:12, diff=21.494685s, valid=True
2026-05-28T20:28:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:28:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:28:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:28:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925555.495328s, valid=True
2026-05-28T20:28:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:28:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:28:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:28:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:28:33.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:28:33.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:28:33.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:28:33.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:28:33.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:28:33.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:28:33.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:28:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:28:33.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:28:33.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:28:34.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:28:34.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:28:34.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:28:34.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:28:34.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-28T20:28:34.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-28T20:28:34.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:28:34.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:29:04.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:29:04.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:29:04.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:29:05.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:29:05.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:29:05.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:29: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-28T20:29:05.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:29:05.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-28T20:29:05.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:29:05.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:29:05.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:29:05.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-28T20:29: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-28T20:29:08.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:29:08.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:29:08.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:29:08.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:29:08.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:29:08.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:29:08.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:29:08.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:29:08.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:29:08.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:29:08.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:29:08.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:29:08.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:29:08.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:29:08.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:29:08.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:29:08.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:29:08.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:29:08.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:29:08.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:29:08.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:29:08.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:29:08.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:29:08.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:28:39
2026-05-28T20:29:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69935, datetime.datetime(2026, 5, 28, 20, 28, 39), datetime.datetime(2026, 5, 28, 20, 28, 38), 'salt', 8.0, 68.51, None, 13.83, 153.22, 5.43, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:29:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:29:08.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:29:08.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:38, diff=30.375647s, valid=True
2026-05-28T20:29:08.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:29:08.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:29:08.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:29:12, diff=-3.621565s, valid=True
2026-05-28T20:29:08.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:29:08.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:28:34, diff=34.385071s, valid=True
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:29:08.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:29:08.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:29:12, diff=-3.611966s, valid=True
2026-05-28T20:29:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:29:08.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:29:08.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:29:08.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925590.388688s, valid=True
2026-05-28T20:29:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:29:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:29:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:29:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:29:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:29:08.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:29:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:29:08.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:29:08.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:29:08.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:29:08.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:29:08.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:29:08.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:29:08.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:29:08.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:29:09.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:29:09.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:29:09.462 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:29:09.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-28T20:29:09.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-28T20:29:09.639 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:29:09.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:29:39.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:29:39.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:29:39.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:29:39.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:29:39.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:29:40.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:29:40.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-28T20:29:40.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:29:40.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-28T20:29:40.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:29:40.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:29:40.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:29:40.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-28T20:29:42.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:29:42.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:29:42.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:29:42.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:29:42.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:29:42.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:29:42.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:29:42.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:29:42.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:29:42.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:29:42.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:29:42.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:29:42.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:29:42.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:29:42.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:29:42.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:29:42.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:29:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:29:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:29:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:29:42.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:29:42.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:29:42.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:29:42.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:29:43.008 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:29:39
2026-05-28T20:29:43.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69937, datetime.datetime(2026, 5, 28, 20, 29, 39), datetime.datetime(2026, 5, 28, 20, 29, 39), 'salt', 7.96, 68.42, None, 14.86, 155.57, 5.45, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:29:43.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:29:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:29:43.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:29:39, diff=4.014783s, valid=True
2026-05-28T20:29:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:29:43.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:29:43.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:12, diff=-28.982361s, valid=True
2026-05-28T20:29:43.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:29:43.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:29:35, diff=8.024195s, valid=True
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:29:43.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:29:43.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:12, diff=-28.972763s, valid=True
2026-05-28T20:29:43.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:29:43.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:29:43.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:29:43.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925625.027901s, valid=True
2026-05-28T20:29:43.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:29:43.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:29:43.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:29:43.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:29:43.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:29:43.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:29:43.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:29:43.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:29:43.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:29:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:29:43.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:29:43.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:29:43.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:29:43.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:29:43.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:29:43.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:29:44.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:29:44.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:29:44.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-28T20:29:44.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-28T20:29:44.122 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:29:44.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:30:14.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:30:14.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:30:14.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:30:14.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:30:14.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:30:14.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:30:14.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-28T20:30:14.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:30:14.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:30:14.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:30:14.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:30:14.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:30:14.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-28T20:30:17.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-28T20:30:17.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:30:17.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:30:17.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:30:17.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:30:17.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:30:17.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:30:17.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:30:17.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:30:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:30:17.489 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:30:17.489 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:30:17.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:30:17.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:30:17.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:30:17.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:30:17.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:30:17.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:30:17.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:30:17.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:30:17.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:30:17.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:30:17.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:30:17.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:30:17.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:30:09
2026-05-28T20:30:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69938, datetime.datetime(2026, 5, 28, 20, 30, 9), datetime.datetime(2026, 5, 28, 20, 30, 9), 'salt', 8.06, 68.42, None, 13.06, 146.83, 5.45, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:30:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:30:17.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:30:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:09, diff=8.972733s, valid=True
2026-05-28T20:30:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:30:17.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:30:17.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:12, diff=5.975629s, valid=True
2026-05-28T20:30:17.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:30:17.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:05, diff=12.98225s, valid=True
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:30:17.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:30:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:12, diff=5.985265s, valid=True
2026-05-28T20:30:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:30:17.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:30:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:30:17.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925659.985922s, valid=True
2026-05-28T20:30:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:30:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:30:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:30:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:30:17.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:30:18.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:30:18.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:30:18.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:30:18.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:30:18.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:30:18.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:30:18.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:30:18.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:30:18.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:30:18.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:30:18.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:30:19.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:30:19.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:30:19.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-28T20:30:19.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-28T20:30:19.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:30:19.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:30:50.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:30:50.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:30:50.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:30:50.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:30:50.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:30:50.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:30:50.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-28T20:30:50.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:30: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-28T20:30:50.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:30:50.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:30:50.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:30:50.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-28T20:30:53.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-28T20:30:53.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:30:53.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:30:53.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:30:53.536 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:30:53.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:30:53.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:30:53.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:30:53.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:30:53.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:30:53.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:30:53.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:30:53.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:30:53.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:30:53.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:30:53.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:30:53.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:30:53.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:30:53.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:30:53.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:30:53.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:30:53.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:30:53.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:30:53.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:30:53.871 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:30:39
2026-05-28T20:30:53.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69939, datetime.datetime(2026, 5, 28, 20, 30, 39), datetime.datetime(2026, 5, 28, 20, 30, 39), 'salt', 8.06, 68.25, None, 16.34, 151.83, 5.48, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:30:53.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:30:53.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:30:53.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:39, diff=14.877707s, valid=True
2026-05-28T20:30:53.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:30:53.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:30:53.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:12, diff=-18.119483s, valid=True
2026-05-28T20:30:53.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:30:53.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:30:36, diff=17.887045s, valid=True
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:30:53.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:30:53.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:12, diff=-18.109967s, valid=True
2026-05-28T20:30:53.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:30:53.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:30:53.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:30:53.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925695.890693s, valid=True
2026-05-28T20:30:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:30:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:30:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:30:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:30:53.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:30:53.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:30:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:30:53.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:30:53.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:30:54.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:30:54.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:30:54.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:30:54.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:30:54.209 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:30:54.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:30:54.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:30:54.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:30:54.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:30:54.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-28T20:30:54.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-28T20:30:54.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:30:54.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:31:24.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:31:24.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:31:24.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:31:25.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:31:25.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:31:25.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:31:25.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-28T20:31:25.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:31:25.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-28T20:31:25.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:31:25.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:31:25.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:31:25.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-28T20:31:28.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-28T20:31:28.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:31:28.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:31:28.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:31:28.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:31:28.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:31:28.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:31:28.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:31:28.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:31:28.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:31:28.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:31:28.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:31:28.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:31:28.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:31:28.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:31:28.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:31:28.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:31:28.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:31:28.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:31:28.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:31:28.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:31:28.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:31:28.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:31:28.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:31:29.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:31:10
2026-05-28T20:31:29.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69940, datetime.datetime(2026, 5, 28, 20, 31, 10), datetime.datetime(2026, 5, 28, 20, 31, 9), 'salt', 8.1, 67.98, None, 15.74, 150.99, 5.55, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:31:29.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:31:29.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:31:29.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:09, diff=20.012889s, valid=True
2026-05-28T20:31:29.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:31:29.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:31:29.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:12, diff=17.01569s, valid=True
2026-05-28T20:31:29.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:31:29.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:07, diff=22.022383s, valid=True
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:31:29.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:31:29.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:12, diff=17.025427s, valid=True
2026-05-28T20:31:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:31:29.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:31:29.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:31:29.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925731.026096s, valid=True
2026-05-28T20:31:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:31:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:31:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:31:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:31:29.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:31:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:31:29.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:31:29.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:31:29.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:31:29.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:31:29.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:31:29.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:31:29.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:31:29.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:31:29.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:31:30.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:31:30.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:31:30.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:31:30.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-28T20:31:30.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-28T20:31:30.367 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:31:30.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:32:00.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:32:00.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:32:00.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:32:00.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:32:00.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:32:00.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:32:00.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-28T20:32:00.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:32:00.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-28T20:32:00.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:32:00.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:32:00.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:32:00.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-28T20:32:03.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-28T20:32:03.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:32:03.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:32:03.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:32:03.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:32:03.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:32:03.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:32:03.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:32:03.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:32:03.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:32:03.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:32:03.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:32:03.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:32:04.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:32:04.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:32:04.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:32:04.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:32:04.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:32:04.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:32:04.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:32:04.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:32:04.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:32:04.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:32:04.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:32:04.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:31:40
2026-05-28T20:32:04.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69941, datetime.datetime(2026, 5, 28, 20, 31, 40), datetime.datetime(2026, 5, 28, 20, 31, 39), 'salt', 8.16, 67.95, None, 16.02, 147.3, 5.55, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:32:04.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:32:04.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:32:04.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:39, diff=25.312269s, valid=True
2026-05-28T20:32:04.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:32:04.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:32:04.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:12, diff=-7.684913s, valid=True
2026-05-28T20:32:04.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:32:04.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:32:04.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:31:39, diff=25.321633s, valid=True
2026-05-28T20:32:04.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:32:04.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:32:04.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:32:04.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:32:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:32:04.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:32:04.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:12, diff=-7.675313s, valid=True
2026-05-28T20:32:04.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:32:04.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:32:04.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:32:04.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925766.325355s, valid=True
2026-05-28T20:32:04.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:32:04.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:32:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:32:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:32:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:32:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:32:04.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:32:04.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:32:04.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:32:04.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:32:04.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:32:04.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:32:04.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:32:04.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:32:04.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:32:05.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:32:05.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:32:05.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:32:05.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-28T20:32:05.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-28T20:32:05.493 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:32:05.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:32:35.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:32:35.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:32:35.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:32:36.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:32:36.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:32:36.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:32:36.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-28T20:32:36.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:32:36.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-28T20:32:36.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:32:36.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:32:36.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:32:36.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-28T20:32:38.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:32:38.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:32:38.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:32:38.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:32:38.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:32:38.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:32:38.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:32:38.904 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:32:38.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:32:38.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:32:38.905 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:32:38.905 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:32:38.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:32:38.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:32:38.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:32:39.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:32:39.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:32:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:32:39.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:32:39.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:32:39.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:32:39.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:32:39.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:32:39.162 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:32:39.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:32:10
2026-05-28T20:32:39.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69942, datetime.datetime(2026, 5, 28, 20, 32, 10), datetime.datetime(2026, 5, 28, 20, 32, 10), 'salt', 8.2, 67.85, None, 15.35, 139.11, 5.58, 831.62, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:32:39.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:32:39.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:32:39.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:10, diff=29.231009s, valid=True
2026-05-28T20:32:39.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:32:39.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:32:39.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:12, diff=27.233799s, valid=True
2026-05-28T20:32:39.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:32:39.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:06, diff=33.240464s, valid=True
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:32:39.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:32:39.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:32:12, diff=27.24347s, valid=True
2026-05-28T20:32:39.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:32:39.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:32:39.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:32:39.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925801.24414s, valid=True
2026-05-28T20:32:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:32:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:32:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:32:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:32:39.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:32:39.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:32:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:32:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:32:39.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:32:39.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:32:39.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:32:39.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:32:39.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:32:39.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:32:39.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:32:40.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:32:40.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:32:40.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:32:40.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-28T20:32:40.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-28T20:32:40.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:32:40.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:33:10.541 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:33:10.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:33:10.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:33:10.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:33:10.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:33:10.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:33:10.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:33:10.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:33:10.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-28T20:33:10.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:33:10.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:33:10.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:33:10.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-28T20:33:13.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-28T20:33:13.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:33:13.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:33:13.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:33:13.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:33:13.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:33:13.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:33:13.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:33:13.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:33:13.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:33:13.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:33:13.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:33:13.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:33:13.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:33:13.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:33:13.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:33:13.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:33:13.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:33:13.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:33:13.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:33:13.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:33:13.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:33:13.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:33:13.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:33:13.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:33:10
2026-05-28T20:33:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69944, datetime.datetime(2026, 5, 28, 20, 33, 10), datetime.datetime(2026, 5, 28, 20, 33, 10), 'salt', 8.23, 67.62, None, 15.32, 150.9, 5.63, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:33:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:33:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:33:13.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:10, diff=3.701021s, valid=True
2026-05-28T20:33:13.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:33:13.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:33:13.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:12, diff=1.703857s, valid=True
2026-05-28T20:33:13.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:33:13.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:06, diff=7.710422s, valid=True
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:33:13.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:33:13.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:12, diff=1.713384s, valid=True
2026-05-28T20:33:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:33:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:33:13.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:33:13.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925835.714044s, valid=True
2026-05-28T20:33:13.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:33:13.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:33:13.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:33:13.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:33:13.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:33:13.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:33:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:33:13.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:33:13.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:33:13.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:33:13.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:33:13.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:33:14.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:33:14.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:33:14.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:33:14.629 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:33:14.729 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:33:14.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:33:14.729 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:33:14.729 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:33:14.912 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:33:14.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:33:44.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:33:44.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:33:44.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:33:45.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:33:45.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:33:45.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:33:45.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-28T20:33:45.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:33:45.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-28T20:33:45.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:33:45.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:33:45.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:33:45.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-28T20:33:48.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-28T20:33:48.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:33:48.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:33:48.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:33:48.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:33:48.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:33:48.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:33:48.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:33:48.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:33:48.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:33:48.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:33:48.541 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:33:48.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:33:48.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:33:48.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:33:48.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:33:48.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:33:48.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:33:48.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:33:48.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:33:48.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:33:48.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:33:48.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:33:48.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:33:48.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:33:41
2026-05-28T20:33:48.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69945, datetime.datetime(2026, 5, 28, 20, 33, 41), datetime.datetime(2026, 5, 28, 20, 33, 40), 'salt', 8.26, 67.62, None, 16.62, 151.39, 5.62, 831.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:33:48.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:33:48.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:33:48.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:40, diff=8.932752s, valid=True
2026-05-28T20:33:48.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:33:48.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:33:48.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:12, diff=-23.064376s, valid=True
2026-05-28T20:33:48.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:33:48.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:33:37, diff=11.942311s, valid=True
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:33:48.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:33:48.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:12, diff=-23.054666s, valid=True
2026-05-28T20:33:48.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:33:48.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:33:48.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:33:48.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925870.945987s, valid=True
2026-05-28T20:33:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:33:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:33:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:33:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:33:48.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:33:49.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:33:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:33:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:33:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:33:49.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:33:49.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:33:49.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:33:49.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:33:49.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:33:49.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:33:49.820 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:33:49.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:33:49.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:33:49.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-28T20:33:49.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-28T20:33:50.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:33:50.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:34:20.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:34:20.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:34:20.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:34:20.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:34:20.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:34:20.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:34:20.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-28T20:34:20.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:34:20.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-28T20:34:20.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:34:20.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:34:20.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:34:20.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-28T20:34:22.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-28T20:34:22.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:34:22.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:34:22.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:34:22.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:34:23.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:34:23.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:34:23.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:34:23.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:34:23.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:34:23.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:34:23.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:34:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:34:23.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:34:23.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:34:23.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:34:23.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:34:23.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:34:23.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:34:23.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:34:23.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:34:23.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:34:23.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:34:23.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:34:23.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:34:11
2026-05-28T20:34:23.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69946, datetime.datetime(2026, 5, 28, 20, 34, 11), datetime.datetime(2026, 5, 28, 20, 34, 11), 'salt', 8.33, 67.45, None, 17.43, 152.19, 5.67, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:34:23.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:34:23.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:34:23.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:11, diff=12.33696s, valid=True
2026-05-28T20:34:23.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:34:23.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:34:23.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:12, diff=11.339883s, valid=True
2026-05-28T20:34:23.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:34:23.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:34:23.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:07, diff=16.346744s, valid=True
2026-05-28T20:34:23.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:34:23.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:34:23.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:34:23.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:34:23.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:34:23.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:34:23.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:12, diff=11.349811s, valid=True
2026-05-28T20:34:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:34:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:34:23.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:34:23.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925905.350546s, valid=True
2026-05-28T20:34:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:34:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:34:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:34:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:34:23.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:34:23.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:34:23.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:34:23.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:34:23.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:34:23.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:34:23.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:34:23.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:34:23.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:34:23.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:34:23.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:34:24.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:34:24.366 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:34:24.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:34:24.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-28T20:34:24.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-28T20:34:24.450 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:34:24.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:34:54.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:34:54.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:34:54.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:34:54.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:34:54.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:34:55.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:34:55.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-28T20:34:55.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:34:55.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-28T20:34:55.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:34:55.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:34:55.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:34:55.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-28T20:34:57.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-28T20:34:57.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:34:57.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:34:57.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:34:57.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:34:57.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:34:57.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:34:57.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:34:57.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:34:57.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:34:57.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:34:57.545 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:34:57.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:34:57.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:34:57.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:34:57.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:34:57.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:34:57.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:34:57.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:34:57.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:34:57.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:34:57.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:34:57.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:34:57.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:34:57.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:34:41
2026-05-28T20:34:57.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69947, datetime.datetime(2026, 5, 28, 20, 34, 41), datetime.datetime(2026, 5, 28, 20, 34, 41), 'salt', 8.26, 67.19, None, 17.36, 149.44, 5.71, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:34:57.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:34:57.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:34:57.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:41, diff=16.863422s, valid=True
2026-05-28T20:34:57.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:34:57.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:34:57.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:12, diff=-14.13379s, valid=True
2026-05-28T20:34:57.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:34:57.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:34:57.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:34:37, diff=20.872762s, valid=True
2026-05-28T20:34:57.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:34:57.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:34:57.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:34:57.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:34:57.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:34:57.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:34:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:12, diff=-14.124244s, valid=True
2026-05-28T20:34:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:34:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:34:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:34:57.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925939.876405s, valid=True
2026-05-28T20:34:57.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:34:57.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:34:57.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:34:57.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:34:57.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:34:57.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:34:57.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:34:57.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:34:57.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:34:58.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:34:58.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:34:58.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:34:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:34:58.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:34:58.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:34:58.764 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:34:58.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:34:58.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:34:58.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-28T20:34:58.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-28T20:34:58.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:34:58.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:35:28.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:35:28.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:35:28.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:35:29.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:35:29.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:35:29.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:35:29.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-28T20:35:29.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:35:29.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-28T20:35:29.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:35:29.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:35:29.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:35:29.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-28T20:35:31.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-28T20:35:31.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:35:31.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:35:31.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:35:31.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:35:31.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:35:31.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:35:31.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:35:31.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:35:31.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:35:31.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:35:31.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:35:31.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:35:31.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:35:31.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:35:31.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:35:31.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:35:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:35:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:35:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:35:32.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:35:32.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:35:32.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:35:32.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:35:32.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:35:11
2026-05-28T20:35:32.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69948, datetime.datetime(2026, 5, 28, 20, 35, 11), datetime.datetime(2026, 5, 28, 20, 35, 11), 'salt', 8.36, 67.19, None, 16.76, 154.96, 5.72, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:35:32.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:35:32.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:35:32.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:11, diff=21.090081s, valid=True
2026-05-28T20:35:32.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:35:32.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:35:32.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:12, diff=20.092904s, valid=True
2026-05-28T20:35:32.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:35:32.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:08, diff=24.099475s, valid=True
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:35:32.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:35:32.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:12, diff=20.102471s, valid=True
2026-05-28T20:35:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:35:32.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:35:32.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:35:32.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=925974.10313s, valid=True
2026-05-28T20:35:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:35:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:35:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:35:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:35:32.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:35:32.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:35:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:35:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:35:32.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:35:32.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:35:32.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:35:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:35:32.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:35:32.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:35:32.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:35:33.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:35:33.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:35:33.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:35:33.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-28T20:35:33.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-28T20:35:33.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:35:33.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:36:03.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:36:03.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:36:03.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:36:03.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:36:03.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:36:03.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:36:03.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-28T20:36:03.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:36:03.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-28T20:36:03.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:36:03.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:36:03.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:36:03.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:36:06.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-28T20:36:06.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:36:06.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:36:06.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:36:06.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:36:06.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:36:06.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:36:06.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:36:06.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:36:06.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:36:06.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:36:06.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:36:06.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:36:06.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:36:06.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:36:06.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:36:06.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:36:06.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:36:06.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:36:06.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:36:06.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:36:06.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:36:06.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:36:06.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:36:06.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:35:42
2026-05-28T20:36:06.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69949, datetime.datetime(2026, 5, 28, 20, 35, 42), datetime.datetime(2026, 5, 28, 20, 35, 41), 'salt', 8.33, 67.12, None, 15.84, 145.05, 5.73, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:36:06.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:36:06.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:36:06.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:41, diff=25.51241s, valid=True
2026-05-28T20:36:06.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:36:06.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:36:06.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:12, diff=-5.484769s, valid=True
2026-05-28T20:36:06.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:36:06.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:36:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:35:40, diff=26.521738s, valid=True
2026-05-28T20:36:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:36:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:36:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:36:06.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:36:06.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:36:06.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:36:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:12, diff=-5.47524s, valid=True
2026-05-28T20:36:06.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:36:06.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:36:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:36:06.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926008.525403s, valid=True
2026-05-28T20:36:06.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:36:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:36:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:36:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:36:06.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:36:06.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:36:06.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:36:06.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:36:06.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:36:06.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:36:06.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:36:06.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:36:06.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:36:06.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:36:07.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:36:07.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:36:07.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:36:07.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:36:07.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-28T20:36:07.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-28T20:36:07.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:36:07.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:36:37.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:36:37.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:36:37.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:36:37.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:36:38.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:36:38.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:36:38.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-28T20:36:38.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:36:38.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-28T20:36:38.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:36:38.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:36:38.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:36:38.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-28T20:36:40.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:36:40.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:36:40.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:36:40.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:36:40.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:36:40.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:36:40.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:36:40.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:36:40.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:36:40.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:36:40.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:36:40.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:36:40.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:36:40.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:36:40.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:36:40.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:36:40.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:36:40.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:36:40.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:36:40.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:36:40.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:36:40.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:36:40.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:36:40.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:36:41.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:36:12
2026-05-28T20:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69950, datetime.datetime(2026, 5, 28, 20, 36, 12), datetime.datetime(2026, 5, 28, 20, 36, 11), 'salt', 8.3, 67.29, None, 15.32, 146.04, 5.7, 831.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:36:41.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:36:41.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:36:41.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:11, diff=30.041107s, valid=True
2026-05-28T20:36:41.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:36:41.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:36:41.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:12, diff=29.043981s, valid=True
2026-05-28T20:36:41.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:36:41.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:11, diff=30.05061s, valid=True
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:36:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:36:41.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:36:41.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:36:12, diff=29.053696s, valid=True
2026-05-28T20:36:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:36:41.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:36:41.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:36:41.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926043.054362s, valid=True
2026-05-28T20:36:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:36:41.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:36:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:36:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:36:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:36:41.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:36:41.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:36:41.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:36:41.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:36:41.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:36:41.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:36:41.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:36:41.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:36:41.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:36:41.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:36:42.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:36:42.108 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:36:42.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:36:42.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-28T20:36:42.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-28T20:36:42.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:36:42.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:37:12.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:37:12.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:37:12.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:37:12.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:37:12.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:37:12.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:37:12.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-28T20:37:12.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:37:12.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:37:12.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:37:12.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:37:12.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:37:12.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-28T20:37:15.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-28T20:37:15.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:37:15.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:37:15.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:37:15.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:37:15.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:37:15.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:37:15.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:37:15.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:37:15.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:37:15.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:37:15.256 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:37:15.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:37:15.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:37:15.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:37:15.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:37:15.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:37:15.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:37:15.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:37:15.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:37:15.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:37:15.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:37:15.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:37:15.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:37:15.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:37:12
2026-05-28T20:37:15.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69952, datetime.datetime(2026, 5, 28, 20, 37, 12), datetime.datetime(2026, 5, 28, 20, 37, 12), 'salt', 8.3, 67.32, None, 16.3, 146.62, 5.69, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:37:15.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:37:15.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:37:15.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:12, diff=3.568566s, valid=True
2026-05-28T20:37:15.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:37:15.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:37:15.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:12, diff=3.57142s, valid=True
2026-05-28T20:37:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:37:15.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:08, diff=7.578089s, valid=True
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:37:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:37:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:12, diff=3.581113s, valid=True
2026-05-28T20:37:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:37:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:37:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:37:15.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926077.581786s, valid=True
2026-05-28T20:37:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:37:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:37:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:37:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:37:15.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:37:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:37:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:37:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:37:15.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:37:15.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:37:15.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:37:15.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:37:15.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:37:15.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:37:16.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:37:16.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:37:16.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:37:16.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:37:16.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-28T20:37:16.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-28T20:37:16.787 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:37:16.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:37:46.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:37:46.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:37:46.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:37:47.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:37:47.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:37:47.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:37:47.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-28T20:37:47.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:37:47.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-28T20:37:47.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:37:47.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:37:47.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:37:47.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-28T20:37:49.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-28T20:37:49.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:37:49.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:37:49.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:37:49.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:37:49.763 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:37:49.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:37:49.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:37:49.776 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:37:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:37:49.776 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:37:49.776 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:37:49.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:37:49.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:37:49.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:37:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:37:49.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:37:49.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:37:49.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:37:50.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:37:50.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:37:50.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:37:50.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:37:50.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:37:50.090 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:37:42
2026-05-28T20:37:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69953, datetime.datetime(2026, 5, 28, 20, 37, 42), datetime.datetime(2026, 5, 28, 20, 37, 42), 'salt', 8.33, 67.32, None, 15.6, 147.28, 5.69, 831.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:37:50.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:37:50.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:37:50.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:42, diff=8.096629s, valid=True
2026-05-28T20:37:50.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:37:50.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:37:50.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:12, diff=-21.900258s, valid=True
2026-05-28T20:37:50.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:37:50.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:37:50.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:37:38, diff=12.106791s, valid=True
2026-05-28T20:37:50.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:37:50.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:37:50.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:37:50.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:37:50.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:37:50.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:37:50.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:12, diff=-21.890069s, valid=True
2026-05-28T20:37:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:37:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:37:50.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:37:50.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926112.110658s, valid=True
2026-05-28T20:37:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:37:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:37:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:37:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:37:50.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:37:50.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:37:50.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:37:50.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:37:50.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:37:50.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:37:50.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:37:50.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:37:50.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:37:50.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:37:50.714 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:37:51.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:37:51.159 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:37:51.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:37:51.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-28T20:37:51.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-28T20:37:51.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:37:51.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:38:21.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:38:21.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:38:21.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:38:21.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:38:21.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:38:21.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:38:21.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-28T20:38:21.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:38:21.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:38:21.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:38:21.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:38:21.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:38:21.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-28T20:38:24.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-28T20:38:24.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:38:24.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:38:24.389 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:38:24.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:38:24.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:38:24.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:38:24.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:38:24.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:38:24.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:38:24.411 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:38:24.411 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:38:24.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:38:24.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:38:24.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:38:24.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:38:24.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:38:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:38:24.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:38:24.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:38:24.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:38:24.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:38:24.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:38:24.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:38:24.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:38:13
2026-05-28T20:38:24.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69954, datetime.datetime(2026, 5, 28, 20, 38, 13), datetime.datetime(2026, 5, 28, 20, 38, 12), 'salt', 8.36, 67.26, None, 13.9, 150.36, 5.71, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:38:24.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:38:24.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:38:24.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:12, diff=12.728324s, valid=True
2026-05-28T20:38:24.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:38:24.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:38:24.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:12, diff=12.731162s, valid=True
2026-05-28T20:38:24.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:38:24.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:38:24.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:09, diff=15.737835s, valid=True
2026-05-28T20:38:24.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:38:24.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:38:24.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:38:24.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:38:24.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:38:24.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:38:24.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:12, diff=12.740868s, valid=True
2026-05-28T20:38:24.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:38:24.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:38:24.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:38:24.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926146.741524s, valid=True
2026-05-28T20:38:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:38:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:38:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:38:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:38:24.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:38:24.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:38:24.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:38:24.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:38:24.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:38:24.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:38:24.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:38:24.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:38:25.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:38:25.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:38:25.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:38:25.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:38:25.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:38:25.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:38:25.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-28T20:38:25.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-28T20:38:25.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:38:25.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:38:55.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:38:55.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:38:55.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:38:56.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:38:56.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:38:56.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:38:56.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-28T20:38:56.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:38:56.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:38:56.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:38:56.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:38:56.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:38:56.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-28T20:38:58.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-28T20:38:58.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:38:59.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:38:59.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:38:59.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:38:59.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:38:59.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:38:59.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:38:59.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:38:59.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:38:59.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:38:59.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:38:59.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:38:59.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:38:59.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:38:59.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:38:59.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:38:59.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:38:59.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:38:59.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:38:59.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:38:59.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:38:59.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:38:59.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:38:59.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:38:43
2026-05-28T20:38:59.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69955, datetime.datetime(2026, 5, 28, 20, 38, 43), datetime.datetime(2026, 5, 28, 20, 38, 42), 'salt', 8.3, 67.19, None, 14.26, 138.62, 5.72, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:38:59.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:38:59.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:38:59.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:42, diff=17.431401s, valid=True
2026-05-28T20:38:59.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:38:59.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:38:59.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:12, diff=-12.565751s, valid=True
2026-05-28T20:38:59.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:38:59.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:38:39, diff=20.441068s, valid=True
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:38:59.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:38:59.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:12, diff=-12.555909s, valid=True
2026-05-28T20:38:59.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:38:59.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:38:59.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:38:59.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926181.444756s, valid=True
2026-05-28T20:38:59.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:38:59.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:38:59.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:38:59.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:38:59.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:38:59.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:38:59.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:38:59.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:38:59.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:38:59.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:38:59.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:38:59.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:38:59.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:38:59.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:39:00.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:39:00.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:39:00.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:39:00.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:39:00.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-28T20:39:00.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-28T20:39:00.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:39:00.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:39:30.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:39:30.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:39:30.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:39:30.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:39:30.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:39:31.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:39:31.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-28T20:39:31.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:39:31.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-28T20:39:31.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:39:31.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:39:31.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:39:31.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-28T20:39:33.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-28T20:39:33.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:39:33.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:39:33.629 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:39:33.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:39:33.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:39:33.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:39:33.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:39:33.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:39:33.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:39:33.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:39:33.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:39:33.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:39:33.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:39:33.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:39:33.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:39:33.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:39:33.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:39:33.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:39:33.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:39:33.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:39:33.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:39:33.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:39:33.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:39:33.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:39:13
2026-05-28T20:39:33.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69956, datetime.datetime(2026, 5, 28, 20, 39, 13), datetime.datetime(2026, 5, 28, 20, 39, 13), 'salt', 8.3, 67.26, None, 14.64, 148.46, 5.71, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:39:33.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:39:33.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:39:33.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:13, diff=20.974889s, valid=True
2026-05-28T20:39:33.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:39:33.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:39:33.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:12, diff=21.977707s, valid=True
2026-05-28T20:39:33.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:39:33.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:10, diff=23.984126s, valid=True
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:39:33.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:39:33.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:12, diff=21.987157s, valid=True
2026-05-28T20:39:33.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:39:33.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:39:33.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:39:33.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926215.987841s, valid=True
2026-05-28T20:39:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:39:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:39:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:39:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:39:33.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:39:34.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:39:34.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:39:34.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:39:34.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:39:34.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:39:34.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:39:34.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:39:34.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:39:34.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:39:34.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:39:34.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:39:34.984 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:39:34.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:39:34.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-28T20:39:34.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-28T20:39:35.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:39:35.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:40:05.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:40:05.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:40:05.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:40:05.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:40:05.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:40:05.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:40:05.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-28T20:40:05.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:40:05.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-28T20:40:05.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:40:05.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:40:05.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:40:05.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:40:08.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:40:08.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:40:08.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:40:08.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:40:08.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:40:08.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:40:08.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:40:08.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:40:08.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:40:08.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:40:08.494 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:40:08.494 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:40:08.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:40:08.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:40:08.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:40:08.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:40:08.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:40:08.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:40:08.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:40:08.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:40:08.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:40:08.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:40:08.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:40:08.746 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:40:08.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:39:43
2026-05-28T20:40:08.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69957, datetime.datetime(2026, 5, 28, 20, 39, 43), datetime.datetime(2026, 5, 28, 20, 39, 43), 'salt', 8.33, 67.35, None, 14.33, 151.65, 5.69, 831.57, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:40:08.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:40:08.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:40:08.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:43, diff=25.810393s, valid=True
2026-05-28T20:40:08.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:40:08.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:40:08.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:12, diff=-3.186727s, valid=True
2026-05-28T20:40:08.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:40:08.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:40:08.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:39:41, diff=27.819883s, valid=True
2026-05-28T20:40:08.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:40:08.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:40:08.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:40:08.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:40:08.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:40:08.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:40:08.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:12, diff=-3.177075s, valid=True
2026-05-28T20:40:08.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:40:08.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:40:08.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:40:08.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926250.823578s, valid=True
2026-05-28T20:40:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:40:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:40:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:40:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:40:08.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:40:08.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:40:08.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:40:08.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:40:08.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:40:08.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:40:09.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:40:09.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:40:09.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:40:09.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:40:09.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:40:09.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:40:09.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:40:09.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:40:09.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-28T20:40:09.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-28T20:40:10.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:40:10.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:40:40.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:40:40.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:40:40.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:40:40.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:40:40.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:40:40.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:40:40.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-28T20:40:40.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:40:40.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:40:40.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:40:40.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:40:40.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:40:40.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-28T20:40:43.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-28T20:40:43.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:40:43.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:40:43.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:40:43.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:40:43.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:40:43.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:40:43.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:40:43.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:40:43.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:40:43.452 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:40:43.452 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:40:43.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:40:43.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:40:43.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:40:43.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:40:43.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:40:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:40:43.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:40:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:40:43.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:40:43.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:40:43.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:40:43.716 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:40:43.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:40:13
2026-05-28T20:40:43.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69958, datetime.datetime(2026, 5, 28, 20, 40, 13), datetime.datetime(2026, 5, 28, 20, 40, 13), 'salt', 8.26, 67.42, None, 14.61, 152.16, 5.67, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:40:43.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:40:43.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:40:43.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:13, diff=30.780345s, valid=True
2026-05-28T20:40:43.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:40:43.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:40:43.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:12, diff=31.783218s, valid=True
2026-05-28T20:40:43.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:40:43.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:40:43.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:13, diff=30.789844s, valid=True
2026-05-28T20:40:43.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:40:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:40:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:40:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:40:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:40:43.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:40:43.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:40:12, diff=31.792866s, valid=True
2026-05-28T20:40:43.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:40:43.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:40:43.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:40:43.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926285.793603s, valid=True
2026-05-28T20:40:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:40:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:40:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:40:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:40:43.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:40:43.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:40:43.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:40:43.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:40:43.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:40:43.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:40:44.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:40:44.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:40:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:40:44.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:40:44.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:40:44.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:40:44.859 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:40:44.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:40:44.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-28T20:40:44.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-28T20:40:45.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:40:45.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:41:15.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:41:15.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:41:15.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:41:15.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:41:15.248 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:41:15.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:41:15.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-28T20:41:15.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:41:15.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-28T20:41:15.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:41:15.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:41:15.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:41:15.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T20:41:18.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:41:18.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:41:18.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:41:18.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:41:18.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:41:18.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:41:18.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:41:18.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:41:18.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:41:18.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:41:18.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:41:18.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:41:18.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:41:18.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:41:18.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:41:18.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:41:18.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:41:18.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:41:18.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:41:18.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:41:18.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:41:18.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:41:18.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:41:18.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:41:18.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:41:14
2026-05-28T20:41:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69960, datetime.datetime(2026, 5, 28, 20, 41, 14), datetime.datetime(2026, 5, 28, 20, 41, 14), 'salt', 8.33, 67.26, None, 13.69, 143.69, 5.71, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:41:18.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:41:18.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:41:18.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:14, diff=4.994976s, valid=True
2026-05-28T20:41:18.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:41:18.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:41:18.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:12, diff=6.998666s, valid=True
2026-05-28T20:41:18.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:41:18.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:10, diff=9.008142s, valid=True
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:41:19.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:41:19.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:12, diff=7.012423s, valid=True
2026-05-28T20:41:19.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:41:19.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:41:19.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:41:19.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926321.013419s, valid=True
2026-05-28T20:41:19.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:41:19.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:41:19.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:41:19.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:41:19.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:41:19.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:41:19.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:41:19.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:41:19.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:41:19.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:41:19.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:41:19.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:41:19.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:41:19.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:41:19.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:41:19.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:41:20.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:41:20.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:41:20.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-28T20:41:20.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-28T20:41:20.287 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:41:20.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:41:50.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:41:50.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:41:50.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:41:50.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:41:50.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:41:50.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:41:50.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-28T20:41:50.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:41:50.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-28T20:41:50.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:41:50.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:41:50.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:41:50.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-28T20:41:53.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-28T20:41:53.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:41:53.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:41:53.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:41:53.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:41:53.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:41:53.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:41:53.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:41:53.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:41:53.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:41:53.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:41:53.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:41:53.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:41:53.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:41:53.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:41:53.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:41:53.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:41:53.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:41:53.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:41:53.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:41:53.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:41:53.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:41:53.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:41:53.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:41:53.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:41:44
2026-05-28T20:41:53.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69961, datetime.datetime(2026, 5, 28, 20, 41, 44), datetime.datetime(2026, 5, 28, 20, 41, 44), 'salt', 8.3, 67.22, None, 13.55, 148.69, 5.72, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:41:53.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:41:53.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:41:53.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:44, diff=9.758641s, valid=True
2026-05-28T20:41:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:41:53.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:41:53.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:12, diff=-18.23852s, valid=True
2026-05-28T20:41:53.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:41:53.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:41:41, diff=12.768165s, valid=True
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:41:53.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:41:53.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:12, diff=-18.228805s, valid=True
2026-05-28T20:41:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:41:53.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:41:53.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:41:53.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926355.771867s, valid=True
2026-05-28T20:41:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:41:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:41:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:41:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:41:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:41:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:41:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:41:53.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:41:53.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:41:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:41:53.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:41:54.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:41:54.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:41:54.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:41:54.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:41:54.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:41:54.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:41:54.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:41:54.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:41:54.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-28T20:41:54.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:41:54.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:42:24.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:42:24.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:42:24.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:42:25.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:42:25.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:42:25.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:42:25.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-28T20:42:25.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:42:25.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-28T20:42:25.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:42:25.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:42:25.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:42:25.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-28T20:42:27.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-28T20:42:27.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:42:27.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:42:27.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:42:27.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:42:27.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:42:27.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:42:27.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:42:27.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:42:27.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:42:27.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:42:27.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:42:27.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:42:28.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:42:28.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:42:28.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:42:28.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:42:28.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:42:28.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:42:28.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:42:28.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:42:28.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:42:28.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:42:28.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:42:28.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:42:14
2026-05-28T20:42:28.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69962, datetime.datetime(2026, 5, 28, 20, 42, 14), datetime.datetime(2026, 5, 28, 20, 42, 14), 'salt', 8.2, 67.36, None, 13.73, 149.09, 5.68, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:42:28.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:42:28.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:42:28.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:14, diff=14.281815s, valid=True
2026-05-28T20:42:28.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:42:28.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:42:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:12, diff=16.284675s, valid=True
2026-05-28T20:42:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:42:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:11, diff=17.291325s, valid=True
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:42:28.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:42:28.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:12, diff=16.294368s, valid=True
2026-05-28T20:42:28.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:42:28.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:42:28.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:42:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926390.295035s, valid=True
2026-05-28T20:42:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:42:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:42:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:42:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:42:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:42:28.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:42:28.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:42:28.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:42:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:42:28.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:42:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:42:28.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:42:28.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:42:28.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:42:28.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:42:29.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:42:29.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:42:29.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:42:29.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-28T20:42:29.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-28T20:42:29.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:42:29.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:42:59.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:42:59.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:42:59.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:42:59.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:42:59.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:42:59.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:42:59.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-28T20:42:59.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:42:59.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-28T20:42:59.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:42:59.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:42:59.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:42:59.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-28T20:43:02.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:43:02.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:43:02.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:43:02.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:43:02.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:43:02.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:43:02.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:43:02.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:43:02.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:43:02.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:43:02.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:43:02.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:43:02.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:43:02.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:43:02.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:43:03.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:43:03.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:43:03.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:43:03.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:43:03.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:43:03.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:43:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:43:03.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:43:03.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:43:03.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:42:45
2026-05-28T20:43:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69963, datetime.datetime(2026, 5, 28, 20, 42, 45), datetime.datetime(2026, 5, 28, 20, 42, 44), 'salt', 8.23, 67.49, None, 12.49, 140.31, 5.65, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:43:03.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:43:03.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:43:03.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:44, diff=19.172649s, valid=True
2026-05-28T20:43:03.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:43:03.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:43:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:12, diff=-8.824514s, valid=True
2026-05-28T20:43:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:43:03.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:43:03.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:42:41, diff=22.183587s, valid=True
2026-05-28T20:43:03.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:43:03.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:43:03.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:43:03.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:43:03.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:43:03.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:43:03.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:12, diff=-8.813341s, valid=True
2026-05-28T20:43:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:43:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:43:03.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:43:03.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926425.187321s, valid=True
2026-05-28T20:43:03.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:43:03.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:43:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:43:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:43:03.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:43:03.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:43:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:43:03.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:43:03.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:43:03.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:43:03.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:43:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:43:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:43:03.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:43:03.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:43:04.170 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:43:04.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:43:04.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:43:04.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-28T20:43:04.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-28T20:43:04.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:43:04.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:43:34.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:43:34.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:43:34.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:43:34.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:43:34.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:43:35.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:43:35.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-28T20:43:35.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:43:35.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-28T20:43:35.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:43:35.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:43:35.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:43:35.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-28T20:43:37.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-28T20:43:37.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:43:37.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:43:37.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:43:37.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:43:37.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:43:37.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:43:37.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:43:37.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:43:37.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:43:37.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:43:37.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:43:37.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:43:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:43:37.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:43:37.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:43:37.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:43:37.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:43:37.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:43:37.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:43:37.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:43:37.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:43:37.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:43:37.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:43:37.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:43:15
2026-05-28T20:43:37.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69964, datetime.datetime(2026, 5, 28, 20, 43, 15), datetime.datetime(2026, 5, 28, 20, 43, 14), 'salt', 8.2, 67.69, None, 12.92, 142.87, 5.61, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:43:37.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:43:37.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:43:37.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:14, diff=23.95791s, valid=True
2026-05-28T20:43:37.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:43:37.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:43:37.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:12, diff=25.960779s, valid=True
2026-05-28T20:43:37.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:43:37.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:12, diff=25.967524s, valid=True
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:43:37.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:43:37.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:12, diff=25.970541s, valid=True
2026-05-28T20:43:37.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:43:37.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:43:37.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:43:37.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926459.971204s, valid=True
2026-05-28T20:43:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:43:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:43:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:43:37.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:43:37.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:43:38.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:43:38.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:43:38.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:43:38.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:43:38.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:43:38.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:43:38.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:43:38.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:43:38.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:43:38.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:43:38.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:43:38.981 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:43:38.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:43:38.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-28T20:43:38.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-28T20:43:39.161 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:43:39.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:44:09.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:44:09.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:44:09.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:44:09.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:44:09.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:44:09.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:44:09.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-28T20:44:09.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:44:09.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-28T20:44:09.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:44:09.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:44:09.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:44:09.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-28T20:44:12.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-28T20:44:12.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:44:12.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:44:12.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:44:12.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:44:12.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:44:12.362 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:44:12.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:44:12.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:44:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:44:12.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:44:12.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:44:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:44:12.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:44:12.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:44:12.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:44:12.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:44:12.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:44:12.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:44:12.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:44:12.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:44:12.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:44:12.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:44:12.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:44:12.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:43:45
2026-05-28T20:44:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69965, datetime.datetime(2026, 5, 28, 20, 43, 45), datetime.datetime(2026, 5, 28, 20, 43, 45), 'salt', 8.23, 67.82, None, 13.34, 147.45, 5.58, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:44:12.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:44:12.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:44:12.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:45, diff=27.696362s, valid=True
2026-05-28T20:44:12.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:44:12.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:44:12.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:44:12, diff=0.69919s, valid=True
2026-05-28T20:44:12.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:44:12.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:44:12.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:43:43, diff=29.705775s, valid=True
2026-05-28T20:44:12.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:44:12.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:44:12.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:44:12.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:44:12.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:44:12.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:44:12.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:44:12, diff=0.708828s, valid=True
2026-05-28T20:44:12.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:44:12.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:44:12.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:44:12.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926494.709484s, valid=True
2026-05-28T20:44:12.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:44:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:44:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:44:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:44:12.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:44:12.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:44:12.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:44:12.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:44:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:44:12.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:44:12.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:44:13.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:44:13.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:44:13.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:44:13.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:44:13.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:44:13.770 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:44:13.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:44:13.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-28T20:44:13.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-28T20:44:13.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:44:13.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:44:44.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:44:44.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:44:44.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:44:44.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:44:44.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:44:45.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:44:45.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-28T20:44:45.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:44:45.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-28T20:44:45.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:44:45.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:44:45.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:44:45.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-28T20:44:48.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-28T20:44:48.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:44:48.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:44:48.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:44:48.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:44:48.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:44:48.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:44:48.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:44:48.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:44:48.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:44:48.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:44:48.503 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:44:48.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:44:48.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:44:48.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:44:48.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:44:48.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:44:48.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:44:48.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:44:48.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:44:48.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:44:48.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:44:48.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:44:48.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:44:48.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:44:45
2026-05-28T20:44:48.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69967, datetime.datetime(2026, 5, 28, 20, 44, 45), datetime.datetime(2026, 5, 28, 20, 44, 45), 'salt', 8.0, 68.35, None, 13.62, 143.93, 5.47, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:44:48.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:44:48.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:44:48.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:44:45, diff=3.840848s, valid=True
2026-05-28T20:44:48.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:44:48.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:44:48.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:12, diff=-23.156345s, valid=True
2026-05-28T20:44:48.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:44:48.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:44:42, diff=6.850056s, valid=True
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:44:48.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:44:48.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:12, diff=-23.146944s, valid=True
2026-05-28T20:44:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:44:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:44:48.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:44:48.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926530.853709s, valid=True
2026-05-28T20:44:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:44:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:44:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:44:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:44:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:44:48.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:44:48.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:44:48.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:44:48.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:44:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:44:49.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:44:49.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:44:49.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:44:49.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:44:49.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:44:49.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:44:49.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:44:49.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:44:49.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-28T20:44:49.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-28T20:44:50.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:44:50.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:45:20.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:45:20.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:45:20.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:45:20.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:45:20.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:45:20.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:45:20.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-28T20:45:20.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:45:20.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-28T20:45:20.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:45:20.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:45:20.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:45:20.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-28T20:45:22.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-28T20:45:23.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:45:23.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:45:23.003 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:45:23.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:45:23.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:45:23.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:45:23.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:45:23.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:45:23.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:45:23.025 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:45:23.025 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:45:23.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:45:23.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:45:23.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:45:23.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:45:23.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:45:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:45:23.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:45:23.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:45:23.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:45:23.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:45:23.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:45:23.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:45:23.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:45:16
2026-05-28T20:45:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69968, datetime.datetime(2026, 5, 28, 20, 45, 16), datetime.datetime(2026, 5, 28, 20, 45, 15), 'salt', 8.0, 68.68, None, 13.41, 136.48, 5.4, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:45:23.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:45:23.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:45:23.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:15, diff=8.355082s, valid=True
2026-05-28T20:45:23.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:45:23.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:45:23.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:12, diff=11.357854s, valid=True
2026-05-28T20:45:23.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:45:23.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:13, diff=10.364433s, valid=True
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:45:23.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:45:23.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:12, diff=11.367544s, valid=True
2026-05-28T20:45:23.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:45:23.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:45:23.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:45:23.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926565.368772s, valid=True
2026-05-28T20:45:23.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:45:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:45:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:45:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:45:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:45:23.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:45:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:45:23.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:45:23.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:45:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:45:23.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:45:23.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:45:23.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:45:23.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:45:23.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:45:24.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:45:24.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:45:24.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:45:24.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-28T20:45:24.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-28T20:45:24.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:45:24.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:45:54.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:45:54.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:45:54.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:45:55.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:45:55.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:45:55.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:45:55.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-28T20:45:55.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:45:55.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-28T20:45:55.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:45:55.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:45:55.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:45:55.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-28T20:45:58.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-28T20:45:58.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:45:58.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:45:58.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:45:58.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:45:58.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:45:58.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:45:58.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:45:58.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:45:58.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:45:58.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:45:58.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:45:58.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:45:58.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:45:58.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:45:58.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:45:58.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:45:58.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:45:58.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:45:58.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:45:58.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:45:58.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:45:58.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:45:58.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:45:58.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:45:46
2026-05-28T20:45:58.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69969, datetime.datetime(2026, 5, 28, 20, 45, 46), datetime.datetime(2026, 5, 28, 20, 45, 45), 'salt', 7.93, 68.81, None, 12.99, 143.08, 5.37, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:45:58.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:45:58.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:45:58.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:45, diff=13.673221s, valid=True
2026-05-28T20:45:58.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:45:58.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:45:58.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:12, diff=-13.323965s, valid=True
2026-05-28T20:45:58.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:45:58.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:45:43, diff=15.682517s, valid=True
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:45:58.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:45:58.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:12, diff=-13.314539s, valid=True
2026-05-28T20:45:58.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:45:58.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:45:58.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:45:58.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926600.686112s, valid=True
2026-05-28T20:45:58.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:45:58.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:45:58.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:45:58.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:45:58.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:45:58.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:45:58.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:45:58.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:45:58.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:45:58.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:45:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:45:58.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:45:58.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:45:59.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:45:59.220 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:45:59.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:45:59.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:45:59.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:45:59.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-28T20:45:59.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-28T20:45:59.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:45:59.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:46:29.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:46:29.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:46:29.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:46:30.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:46:30.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:46:30.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:46:30.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-28T20:46:30.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:46:30.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:46:30.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:46:30.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:46:30.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:46:30.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-28T20:46:33.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:46:33.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:46:33.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:46:33.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:46:33.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:46:33.139 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:46:33.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:46:33.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:46:33.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:46:33.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:46:33.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:46:33.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:46:33.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:46:33.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:46:33.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:46:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:46:33.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:46:33.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:46:33.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:46:33.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:46:33.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:46:33.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:46:33.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:46:33.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:46:33.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:46:16
2026-05-28T20:46:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69970, datetime.datetime(2026, 5, 28, 20, 46, 16), datetime.datetime(2026, 5, 28, 20, 46, 15), 'salt', 7.83, 69.21, None, 12.88, 136.79, 5.28, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:46:33.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:46:33.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:46:33.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:15, diff=18.482278s, valid=True
2026-05-28T20:46:33.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:46:33.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:46:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:12, diff=21.485084s, valid=True
2026-05-28T20:46:33.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:46:33.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:46:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:13, diff=20.491649s, valid=True
2026-05-28T20:46:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:46:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:46:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:46:33.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:46:33.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:46:33.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:46:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:12, diff=21.494593s, valid=True
2026-05-28T20:46:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:46:33.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:46:33.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:46:33.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926635.495238s, valid=True
2026-05-28T20:46:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:46:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:46:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:46:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:46:33.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:46:33.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:46:33.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:46:33.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:46:33.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:46:33.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:46:33.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:46:33.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:46:33.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:46:33.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:46:34.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:46:34.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:46:34.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:46:34.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:46:34.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-28T20:46:34.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-28T20:46:34.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:46:34.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:47:04.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:47:04.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:47:04.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:47:04.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:47:04.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:47:05.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:47:05.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-28T20:47:05.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:47:05.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-28T20:47:05.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:47:05.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:47:05.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:47:05.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-28T20:47:07.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-28T20:47:07.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:47:07.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:47:07.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:47:07.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:47:07.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:47:07.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:47:07.651 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:47:07.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:47:07.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:47:07.652 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:47:07.652 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:47:07.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:47:07.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:47:07.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:47:07.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:47:07.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:47:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:47:07.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:47:07.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:47:07.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:47:07.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:47:07.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:47:07.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:47:07.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:46:46
2026-05-28T20:47:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69971, datetime.datetime(2026, 5, 28, 20, 46, 46), datetime.datetime(2026, 5, 28, 20, 46, 46), 'salt', 7.67, 69.74, None, 13.02, 143.62, 5.17, 831.63, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:47:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:47:07.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:47:07.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:46, diff=21.971926s, valid=True
2026-05-28T20:47:07.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:47:07.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:47:07.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:12, diff=-4.024888s, valid=True
2026-05-28T20:47:07.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:47:07.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:47:07.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:46:43, diff=24.981854s, valid=True
2026-05-28T20:47:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:47:07.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:47:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:47:07.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:47:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:47:07.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:47:07.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:12, diff=-4.015113s, valid=True
2026-05-28T20:47:07.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:47:07.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:47:07.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:47:07.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926669.985545s, valid=True
2026-05-28T20:47:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:47:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:47:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:47:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:47:07.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:47:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:47:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:47:08.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:47:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:47:08.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:47:08.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:47:08.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:47:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:47:08.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:47:08.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:47:08.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:47:09.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:47:09.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:47:09.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-28T20:47:09.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-28T20:47:09.214 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:47:09.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:47:39.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:47:39.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:47:39.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:47:39.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:47:39.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:47:39.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:47:39.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-28T20:47:39.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:47:39.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-28T20:47:39.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:47:39.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:47:39.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:47: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-28T20:47:42.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-28T20:47:42.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:47:42.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:47:42.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:47:42.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:47:42.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:47:42.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:47:42.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:47:42.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:47:42.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:47:42.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:47:42.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:47:42.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:47:42.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:47:42.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:47:42.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:47:42.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:47:42.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:47:42.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:47:42.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:47:42.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:47:42.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:47:42.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:47:42.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:47:42.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:47:17
2026-05-28T20:47:42.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69972, datetime.datetime(2026, 5, 28, 20, 47, 17), datetime.datetime(2026, 5, 28, 20, 47, 16), 'salt', 7.57, 70.01, None, 13.09, 142.17, 5.11, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:47:42.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:47:42.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:47:42.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:16, diff=26.740075s, valid=True
2026-05-28T20:47:42.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:47:42.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:47:42.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:12, diff=30.742914s, valid=True
2026-05-28T20:47:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:47:42.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:13, diff=29.749449s, valid=True
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:47:42.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:47:42.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:12, diff=30.752449s, valid=True
2026-05-28T20:47:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:47:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:47:42.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:47:42.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926704.753103s, valid=True
2026-05-28T20:47:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:47:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:47:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:47:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:47:42.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:47:42.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:47:42.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:47:42.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:47:42.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:47:42.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:47:42.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:47:42.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:47:43.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:47:43.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:47:43.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:47:43.612 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:47:43.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:47:43.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:47:43.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-28T20:47:43.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-28T20:47:43.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:47:43.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:48:13.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:48:13.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:48:13.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:48:14.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:48:14.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:48:14.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:48:14.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-28T20:48:14.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:48:14.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-28T20:48:14.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:48:14.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:48:14.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:48:14.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-28T20:48:16.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-28T20:48:16.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:48:16.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:48:16.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:48:16.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:48:16.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:48:16.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:48:16.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:48:16.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:48:16.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:48:16.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:48:16.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:48:16.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:48:16.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:48:16.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:48:17.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:48:17.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:48:17.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:48:17.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:48:17.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:48:17.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:48:17.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:48:17.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:48:17.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:48:17.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:47:47
2026-05-28T20:48:17.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69973, datetime.datetime(2026, 5, 28, 20, 47, 47), datetime.datetime(2026, 5, 28, 20, 47, 46), 'salt', 7.47, 70.54, None, 11.96, 140.94, 5.0, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:48:17.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:48:17.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:48:17.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:46, diff=31.171155s, valid=True
2026-05-28T20:48:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:48:17.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:48:17.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:48:12, diff=5.17399s, valid=True
2026-05-28T20:48:17.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:48:17.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:47:44, diff=33.180516s, valid=True
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:48:17.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:48:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:48:12, diff=5.183571s, valid=True
2026-05-28T20:48:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:48:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:48:17.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:48:17.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926739.184231s, valid=True
2026-05-28T20:48:17.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:48:17.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:48:17.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:48:17.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:48:17.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:48:17.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:48:17.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:48:17.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:48:17.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:48:17.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:48:17.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:48:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:48:17.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:48:17.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:48:17.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:48:18.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:48:18.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:48:18.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:48:18.243 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:48:18.243 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:48:18.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:48:18.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:48:48.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:48:48.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:48:48.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:48:48.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:48:48.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:48:49.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:48:49.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-28T20:48:49.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:48:49.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-28T20:48:49.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:48:49.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:48:49.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:48:49.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-28T20:48:51.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-28T20:48:51.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:48:51.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:48:51.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:48:51.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:48:51.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:48:51.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:48:51.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:48:51.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:48:51.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:48:51.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:48:51.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:48:51.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:48:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:48:51.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:48:51.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:48:51.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:48:51.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:48:51.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:48:51.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:48:51.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:48:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:48:51.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:48:51.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:48:51.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:48:47
2026-05-28T20:48:51.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69975, datetime.datetime(2026, 5, 28, 20, 48, 47), datetime.datetime(2026, 5, 28, 20, 48, 46), 'salt', 7.3, 71.17, None, 13.09, 139.35, 4.87, 831.69, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:48:51.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:48:51.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:48:51.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:48:46, diff=5.975179s, valid=True
2026-05-28T20:48:51.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:48:51.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:48:51.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:12, diff=-20.021945s, valid=True
2026-05-28T20:48:51.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:48:51.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:48:51.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:48:47, diff=4.984819s, valid=True
2026-05-28T20:48:51.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:48:51.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:48:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:48:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:48:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:48:51.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:48:51.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:12, diff=-20.012111s, valid=True
2026-05-28T20:48:51.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:48:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:48:51.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:48:51.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926773.988549s, valid=True
2026-05-28T20:48:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:48:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:48:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:48:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:48:51.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:48:52.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:48:52.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:48:52.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:48:52.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:48:52.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:48:52.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:48:52.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:48:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:48:52.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:48:52.530 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:48:52.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:48:52.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:48:52.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:48:52.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-28T20:48:52.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-28T20:48:53.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:48:53.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:49:23.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:49:23.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:49: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-28T20:49:23.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:49:23.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:49:23.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:49:23.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:49:23.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:49:23.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-28T20:49:23.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:49:23.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:49:23.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:49:23.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-28T20:49:26.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-28T20:49:26.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:49:26.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:49:26.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:49:26.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:49:26.247 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:49:26.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:49:26.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:49:26.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:49:26.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:49:26.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:49:26.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:49:26.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:49:26.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:49:26.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:49:26.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:49:26.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:49:26.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:49:26.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:49:26.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:49:26.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:49:26.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:49:26.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:49:26.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:49:26.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:49:17
2026-05-28T20:49:26.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69976, datetime.datetime(2026, 5, 28, 20, 49, 17), datetime.datetime(2026, 5, 28, 20, 49, 17), 'salt', 7.3, 71.37, None, 12.56, 138.95, 4.83, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:49:26.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:49:26.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:49:26.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:17, diff=9.579768s, valid=True
2026-05-28T20:49:26.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:49:26.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:49:26.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:12, diff=14.582596s, valid=True
2026-05-28T20:49:26.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:49:26.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:15, diff=11.58922s, valid=True
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:49:26.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:49:26.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:12, diff=14.592285s, valid=True
2026-05-28T20:49:26.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:49:26.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:49:26.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:49:26.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926808.592961s, valid=True
2026-05-28T20:49:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:49:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:49:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:49:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:49:26.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:49:26.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:49:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:49:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:49:26.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:49:26.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:49:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:49:26.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:49:26.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:49:26.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:49:27.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:49:27.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:49:27.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:49:27.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:49:27.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-28T20:49:27.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-28T20:49:27.794 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:49:27.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:49:57.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:49:57.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:49:57.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:49:57.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:49:57.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:49:58.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:49:58.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-28T20:49:58.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:49:58.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-28T20:49:58.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:49:58.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:49:58.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:49:58.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-28T20:50:00.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-28T20:50:00.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:50:00.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:50:00.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:50:00.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:50:00.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:50:00.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:50:00.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:50:00.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:50:00.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:50:00.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:50:00.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:50:00.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:50:00.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:50:00.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:50:00.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:50:00.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:50:00.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:50:00.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:50:00.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:50:00.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:50:00.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:50:00.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:50:00.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:50:00.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:49:48
2026-05-28T20:50:00.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69977, datetime.datetime(2026, 5, 28, 20, 49, 48), datetime.datetime(2026, 5, 28, 20, 49, 47), 'salt', 7.17, 71.77, None, 13.8, 142.0, 4.75, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:50:00.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:50:00.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:50:00.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:47, diff=13.997893s, valid=True
2026-05-28T20:50:00.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:50:00.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:50:01.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:12, diff=-10.999244s, valid=True
2026-05-28T20:50:01.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:50:01.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:49:45, diff=16.007316s, valid=True
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:50:01.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:50:01.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:12, diff=-10.989659s, valid=True
2026-05-28T20:50:01.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:50:01.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:50:01.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:50:01.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926843.01101s, valid=True
2026-05-28T20:50:01.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:50:01.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:50:01.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:50:01.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:50:01.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:50:01.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:50:01.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:50:01.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:50:01.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:50:01.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:50:01.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:50:01.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:50:01.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:50:01.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:50:01.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:50:01.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:50:02.063 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:50:02.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:50:02.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-28T20:50:02.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-28T20:50:02.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:50:02.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:50:32.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:50:32.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:50:32.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:50:32.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:50:32.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:50:32.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:50:32.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-28T20:50:32.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:50:32.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-28T20:50:32.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:50:32.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:50:32.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:50:32.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-28T20:50:34.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-28T20:50:34.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:50:34.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:50:34.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:50:34.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:50:35.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:50:35.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:50:35.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:50:35.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:50:35.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:50:35.018 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:50:35.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:50:35.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:50:35.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:50:35.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:50:35.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:50:35.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:50:35.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:50:35.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:50:35.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:50:35.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:50:35.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:50:35.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:50:35.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:50:35.325 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:50:18
2026-05-28T20:50:35.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69978, datetime.datetime(2026, 5, 28, 20, 50, 18), datetime.datetime(2026, 5, 28, 20, 50, 18), 'salt', 7.14, 71.87, None, 13.41, 138.81, 4.73, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:50:35.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:50:35.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:50:35.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:18, diff=17.332763s, valid=True
2026-05-28T20:50:35.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:50:35.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:50:35.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:12, diff=23.335826s, valid=True
2026-05-28T20:50:35.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:50:35.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:50:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:15, diff=20.342765s, valid=True
2026-05-28T20:50:35.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:50:35.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:50:35.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:50:35.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:50:35.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:50:35.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:50:35.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:12, diff=23.345891s, valid=True
2026-05-28T20:50:35.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:50:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:50:35.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:50:35.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926877.346544s, valid=True
2026-05-28T20:50:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:50:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:50:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:50:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:50:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:50:35.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:50:35.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:50:35.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:50:35.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:50:35.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:50:35.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:50:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:50:35.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:50:35.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:50:35.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:50:36.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:50:36.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:50:36.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:50:36.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-28T20:50:36.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-28T20:50:36.582 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:50:36.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:51:06.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:51:06.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:51:06.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:51:06.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:51:06.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:51:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:51:07.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-28T20:51:07.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:51:07.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:51:07.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:51:07.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:51:07.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:51:07.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-28T20:51:09.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-28T20:51:09.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:51:09.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:51:09.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:51:09.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:51:09.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:51:09.559 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:51:09.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:51:09.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:51:09.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:51:09.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:51:09.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:51:09.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:51:09.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:51:09.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:51:09.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:51:09.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:51:09.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:51:09.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:51:09.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:51:09.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:51:09.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:51:09.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:51:09.823 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:51:09.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:50:49
2026-05-28T20:51:09.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69979, datetime.datetime(2026, 5, 28, 20, 50, 49), datetime.datetime(2026, 5, 28, 20, 50, 48), 'salt', 7.24, 72.17, None, 11.54, 135.5, 4.68, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:51:09.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:51:09.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:51:09.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:48, diff=21.890509s, valid=True
2026-05-28T20:51:09.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:51:09.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:51:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:12, diff=-2.106523s, valid=True
2026-05-28T20:51:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:51:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:50:45, diff=24.900343s, valid=True
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:51:09.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:51:09.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:12, diff=-2.096547s, valid=True
2026-05-28T20:51:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:51:09.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:51:09.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:51:09.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926911.904147s, valid=True
2026-05-28T20:51:09.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:51:09.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:51:09.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:51:09.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:51:09.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:51:09.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:51:09.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:51:09.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:51:09.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:51:10.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:51:10.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:51:10.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:51:10.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:51:10.251 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:51:10.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:51:10.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:51:10.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:51:10.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:51:10.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-28T20:51:10.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-28T20:51:11.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:51:11.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:51:41.109 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:51:41.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:51:41.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:51:41.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:51:41.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:51:41.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:51:41.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:51:41.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:51:41.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:51:41.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:51:41.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:51:41.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:51:41.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-28T20:51:44.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-28T20:51:44.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:51:44.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:51:44.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:51:44.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:51:44.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:51:44.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:51:44.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:51:44.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:51:44.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:51:44.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:51:44.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:51:44.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:51:44.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:51:44.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:51:44.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:51:44.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:51:44.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:51:44.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:51:44.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:51:44.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:51:44.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:51:44.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:51:44.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:51:44.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:51:19
2026-05-28T20:51:44.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69980, datetime.datetime(2026, 5, 28, 20, 51, 19), datetime.datetime(2026, 5, 28, 20, 51, 19), 'salt', 7.24, 72.17, None, 13.23, 141.02, 4.68, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:51:44.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:51:44.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:51:44.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:19, diff=25.70276s, valid=True
2026-05-28T20:51:44.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:51:44.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:51:44.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:12, diff=32.705662s, valid=True
2026-05-28T20:51:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:51:44.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:16, diff=28.712346s, valid=True
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:51:44.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:51:44.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:12, diff=32.715404s, valid=True
2026-05-28T20:51:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:51:44.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:51:44.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:51:44.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926946.716063s, valid=True
2026-05-28T20:51:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:51:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:51:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:51:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:51:44.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:51:44.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:51:44.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:51:44.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:51:44.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:51:44.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:51:44.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:51:45.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:51:45.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:51:45.103 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:51:45.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:51:45.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:51:45.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:51:45.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:51:45.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-28T20:51:45.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-28T20:51:45.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:51:45.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:52:15.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:52:15.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:52:15.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:52:16.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:52:16.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:52:16.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:52:16.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:52:16.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:52:16.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-28T20:52:16.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:52:16.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:52:16.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:52:16.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-28T20:52:19.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-28T20:52:19.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:52:19.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:52:19.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:52:19.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:52:19.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:52:19.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:52:19.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:52:19.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:52:19.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:52:19.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:52:19.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:52:19.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:52:19.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:52:19.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:52:19.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:52:19.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:52:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:52:19.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:52:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:52:19.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:52:19.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:52:19.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:52:19.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:52:19.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:51:49
2026-05-28T20:52:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69981, datetime.datetime(2026, 5, 28, 20, 51, 49), datetime.datetime(2026, 5, 28, 20, 51, 49), 'salt', 7.3, 72.17, None, 12.49, 137.45, 4.67, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:52:19.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:52:19.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:52:19.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:49, diff=30.437893s, valid=True
2026-05-28T20:52:19.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:52:19.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:52:19.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:52:12, diff=7.441588s, valid=True
2026-05-28T20:52:19.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:52:19.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:52:19.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:51:46, diff=33.450559s, valid=True
2026-05-28T20:52:19.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:52:19.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:52:19.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:52:19.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:52:19.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:52:19.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:52:19.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:52:12, diff=7.454461s, valid=True
2026-05-28T20:52:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:52:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:52:19.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:52:19.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=926981.455339s, valid=True
2026-05-28T20:52:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:52:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:52:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:52:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:52:19.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:52:19.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:52:19.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:52:19.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:52:19.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:52:19.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:52:19.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:52:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:52:19.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:52:19.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:52:20.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:52:20.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:52:20.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:52:20.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:52:20.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-28T20:52:20.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-28T20:52:20.707 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:52:20.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:52:50.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:52:50.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:52:50.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:52:51.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:52:51.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:52:51.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:52:51.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:52:51.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:52:51.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-28T20:52:51.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:52:51.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:52:51.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:52:51.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-28T20:52:54.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-28T20:52:54.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:52:54.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:52:54.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:52:54.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:52:54.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:52:54.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:52:54.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:52:54.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:52:54.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:52:54.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:52:54.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:52:54.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:52:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:52:54.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:52:54.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:52:54.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:52:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:52:54.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:52:54.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:52:54.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:52:54.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:52:54.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:52:54.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:52:54.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:52:50
2026-05-28T20:52:54.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69983, datetime.datetime(2026, 5, 28, 20, 52, 50), datetime.datetime(2026, 5, 28, 20, 52, 49), 'salt', 7.14, 72.3, None, 13.62, 140.4, 4.65, 831.75, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:52:54.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:52:54.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:52:54.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:52:49, diff=5.409748s, valid=True
2026-05-28T20:52:54.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:52:54.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:52:54.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:12, diff=-17.587426s, valid=True
2026-05-28T20:52:54.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:52:54.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:52:48, diff=6.419127s, valid=True
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:52:54.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:52:54.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:12, diff=-17.577871s, valid=True
2026-05-28T20:52:54.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:52:54.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:52:54.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:52:54.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927016.422786s, valid=True
2026-05-28T20:52:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:52:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:52:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:52:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:52:54.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:52:54.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:52:54.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:52:54.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:52:54.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:52:54.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:52:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:52:54.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:52:54.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:52:54.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:52:54.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:52:55.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:52:55.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:52:55.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:52:55.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-28T20:52:55.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-28T20:52:55.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:52:55.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:53:25.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:53:25.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:53:25.728 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:53:25.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:53:25.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:53:26.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:53:26.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-28T20:53:26.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:53:26.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:53:26.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:53:26.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:53:26.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:53:26.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-28T20:53:28.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-28T20:53:28.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:53:28.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:53:28.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:53:28.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:53:28.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:53:28.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:53:28.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:53:28.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:53:28.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:53:28.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:53:28.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:53:28.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:53:28.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:53:28.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:53:29.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:53:29.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:53:29.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:53:29.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:53:29.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:53:29.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:53:29.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:53:29.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:53:29.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:53:29.210 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:53:20
2026-05-28T20:53:29.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69984, datetime.datetime(2026, 5, 28, 20, 53, 20), datetime.datetime(2026, 5, 28, 20, 53, 19), 'salt', 7.2, 72.33, None, 12.85, 140.9, 4.64, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:53:29.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:53:29.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:53:29.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:19, diff=10.216997s, valid=True
2026-05-28T20:53:29.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:53:29.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:53:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:12, diff=17.219882s, valid=True
2026-05-28T20:53:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:53:29.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:19, diff=10.226544s, valid=True
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:53:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:53:29.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:53:29.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:12, diff=17.229627s, valid=True
2026-05-28T20:53:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:53:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:53:29.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:53:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927051.230284s, valid=True
2026-05-28T20:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:53:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:53:29.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:53:29.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:53:29.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:53:29.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:53:29.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:53:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:53:29.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:53:29.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:53:29.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:53:29.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:53:29.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:53:29.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:53:30.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:53:30.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:53:30.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:53:30.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-28T20:53:30.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-28T20:53:30.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:53:30.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:54:00.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:54:00.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:54:00.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:54:01.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:54:01.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:54:01.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:54:01.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-28T20:54:01.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:54:01.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-28T20:54:01.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:54:01.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:54:01.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:54:01.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-28T20:54:04.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-28T20:54:04.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:54:04.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:54:04.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:54:04.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:54:04.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:54:04.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:54:04.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:54:04.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:54:04.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:54:04.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:54:04.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:54:04.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:54:04.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:54:04.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:54:04.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:54:04.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:54:04.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:54:04.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:54:04.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:54:04.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:54:04.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:54:04.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:54:04.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:54:04.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:53:50
2026-05-28T20:54:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69985, datetime.datetime(2026, 5, 28, 20, 53, 50), datetime.datetime(2026, 5, 28, 20, 53, 50), 'salt', 7.17, 72.37, None, 14.15, 139.47, 4.63, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:54:04.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:54:04.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:54:04.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:50, diff=14.706143s, valid=True
2026-05-28T20:54:04.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:54:04.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:54:04.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:12, diff=-7.291042s, valid=True
2026-05-28T20:54:04.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:54:04.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:53:47, diff=17.715414s, valid=True
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:54:04.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:54:04.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:12, diff=-7.281592s, valid=True
2026-05-28T20:54:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:54:04.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:54:04.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:54:04.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927086.719088s, valid=True
2026-05-28T20:54:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:54:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:54:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:54:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:54:04.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:54:04.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:54:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:54:04.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:54:04.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:54:04.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:54:04.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:54:04.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:54:04.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:54:05.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:54:05.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:54:05.605 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:54:05.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:54:05.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:54:05.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-28T20:54:05.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-28T20:54:05.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:54:05.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:54:35.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:54:35.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:54:35.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:54:36.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:54:36.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:54:36.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:54:36.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-28T20:54:36.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:54: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-28T20:54:36.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:54:36.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:54:36.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:54:36.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-28T20:54:39.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-28T20:54:39.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:54:39.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:54:39.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:54:39.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:54:39.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:54:39.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:54:39.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:54:39.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:54:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:54:39.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:54:39.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:54:39.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:54:39.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:54:39.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:54:39.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:54:39.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:54:39.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:54:39.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:54:39.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:54:39.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:54:39.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:54:39.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:54:39.367 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:54:39.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:54:20
2026-05-28T20:54:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69986, datetime.datetime(2026, 5, 28, 20, 54, 20), datetime.datetime(2026, 5, 28, 20, 54, 20), 'salt', 7.2, 72.4, None, 14.22, 135.83, 4.62, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:54:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:54:39.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:54:39.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:20, diff=19.431125s, valid=True
2026-05-28T20:54:39.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:54:39.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:54:39.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:12, diff=27.434019s, valid=True
2026-05-28T20:54:39.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:54:39.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:54:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:17, diff=22.440666s, valid=True
2026-05-28T20:54:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:54:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:54:39.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:54:39.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:54:39.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:54:39.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:54:39.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:12, diff=27.443762s, valid=True
2026-05-28T20:54:39.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:54:39.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:54:39.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:54:39.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927121.444441s, valid=True
2026-05-28T20:54:39.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:54:39.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:54:39.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:54:39.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:54:39.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:54:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:54:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:54:39.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:54:39.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:54:39.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:54:39.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:54:39.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:54:39.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:54:39.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:54:40.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:54:40.432 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:54:40.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:54:40.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:54:40.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T20:54:40.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T20:54:40.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:54:40.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:55:10.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:55:10.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:55:10.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:55:10.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:55:10.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:55:11.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:55:11.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:55:11.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:55:11.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-28T20:55:11.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:55:11.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:55:11.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:55:11.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-28T20:55:13.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-28T20:55:13.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:55:13.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:55:13.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:55:13.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:55:13.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:55:13.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:55:13.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:55:13.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:55:13.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:55:13.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:55:13.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:55:13.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:55:13.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:55:13.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:55:13.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:55:13.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:55:13.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:55:13.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:55:13.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:55:13.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:55:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:55:13.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:55:13.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:55:13.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:54:50
2026-05-28T20:55:13.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69987, datetime.datetime(2026, 5, 28, 20, 54, 50), datetime.datetime(2026, 5, 28, 20, 54, 50), 'salt', 7.14, 72.37, None, 13.37, 136.04, 4.63, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:55:13.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:55:13.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:55:13.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:50, diff=23.931355s, valid=True
2026-05-28T20:55:13.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:55:13.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:55:13.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:12, diff=1.934539s, valid=True
2026-05-28T20:55:13.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:55:13.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:54:47, diff=26.941531s, valid=True
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:55:13.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:55:13.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:12, diff=1.944667s, valid=True
2026-05-28T20:55:13.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:55:13.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:55:13.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:55:13.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927155.94534s, valid=True
2026-05-28T20:55:13.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:55:13.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:55:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:55:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:55:13.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:55:14.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:55:14.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:55:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:55:14.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:55:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:55:14.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:55:14.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:55:14.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:55:14.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:55:14.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:55:14.860 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:55:14.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:55:14.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:55:14.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-28T20:55:14.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-28T20:55:15.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:55:15.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:55:45.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:55:45.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:55:45.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:55:45.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:55:45.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:55:45.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:55:45.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-28T20:55:45.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:55:45.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:55:45.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:55:45.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:55:45.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:55:45.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-28T20:55:48.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-28T20:55:48.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:55:48.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:55:48.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:55:48.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:55:48.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:55:48.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:55:48.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:55:48.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:55:48.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:55:48.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:55:48.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:55:48.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:55:48.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:55:48.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:55:48.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:55:48.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:55:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:55:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:55:48.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:55:48.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:55:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:55:48.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:55:48.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:55:48.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:55:21
2026-05-28T20:55:48.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69988, datetime.datetime(2026, 5, 28, 20, 55, 21), datetime.datetime(2026, 5, 28, 20, 55, 20), 'salt', 7.24, 72.33, None, 12.0, 147.42, 4.64, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:55:48.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:55:48.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:55:48.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:20, diff=28.632189s, valid=True
2026-05-28T20:55:48.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:55:48.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:55:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:12, diff=36.635109s, valid=True
2026-05-28T20:55:48.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:55:48.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:55:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:17, diff=31.641879s, valid=True
2026-05-28T20:55:48.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:55:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:55:48.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:55:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:55:48.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:55:48.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:55:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:55:12, diff=36.644931s, valid=True
2026-05-28T20:55:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:55:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:55:48.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:55:48.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927190.645594s, valid=True
2026-05-28T20:55:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:55:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:55:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:55:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:55:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:55:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:55:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:55:48.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:55:48.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:55:48.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:55:48.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:55:48.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:55:49.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:55:49.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:55:49.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:55:49.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:55:49.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:55:49.709 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:55:49.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-28T20:55:49.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-28T20:55:49.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:55:49.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:56:19.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:56:19.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:56:19.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:56:20.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:56:20.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:56:20.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:56:20.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-28T20:56:20.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:56:20.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-28T20:56:20.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:56:20.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:56:20.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:56: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-28T20:56:22.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-28T20:56:22.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:56:22.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:56:22.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:56:22.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:56:22.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:56:22.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:56:22.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:56:22.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:56:22.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:56:22.802 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:56:22.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:56:22.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:56:22.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:56:22.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:56:22.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:56:22.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:56:23.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:56:23.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:56:23.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:56:23.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:56:23.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:56:23.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:56:23.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:56:23.120 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:56:21
2026-05-28T20:56:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69990, datetime.datetime(2026, 5, 28, 20, 56, 21), datetime.datetime(2026, 5, 28, 20, 56, 21), 'salt', 7.24, 72.23, None, 14.64, 141.25, 4.66, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:56:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:56:23.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:56:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:21, diff=2.126503s, valid=True
2026-05-28T20:56:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:56:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:56:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:12, diff=11.129333s, valid=True
2026-05-28T20:56:23.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:56:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:56:23.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:18, diff=5.135945s, valid=True
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:56:23.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:56:23.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:12, diff=11.139029s, valid=True
2026-05-28T20:56:23.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:56:23.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:56:23.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:56:23.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927225.139708s, valid=True
2026-05-28T20:56:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:56:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:56:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:56:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:56:23.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:56:23.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:56:23.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:56:23.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:56:23.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:56:23.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:56:23.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:56:23.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:56:23.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:56:23.462 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:56:23.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:56:24.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:56:24.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:56:24.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:56:24.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-28T20:56:24.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-28T20:56:24.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:56:24.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:56:54.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:56:54.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:56:54.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:56:54.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:56:54.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:56:54.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:56:54.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:56:54.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:56:54.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-28T20:56:54.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:56:54.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:56:54.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:56: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-28T20:56:57.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:56:57.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:56:57.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:56:57.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:56:57.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:56:57.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:56:57.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:56:57.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:56:57.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:56:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:56:57.932 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:56:57.932 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:56:57.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:56:58.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T20:56:58.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:56:58.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T20:56:58.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:56:58.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:56:58.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:56:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T20:56:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:56:58.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:56:58.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:56:58.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:56:58.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:56:51
2026-05-28T20:56:58.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69991, datetime.datetime(2026, 5, 28, 20, 56, 51), datetime.datetime(2026, 5, 28, 20, 56, 51), 'salt', 7.34, 72.1, None, 12.74, 146.16, 4.69, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:56:58.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:56:58.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T20:56:58.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:51, diff=7.253244s, valid=True
2026-05-28T20:56:58.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:56:58.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:56:58.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:12, diff=-13.743859s, valid=True
2026-05-28T20:56:58.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:56:58.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T20:56:58.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:56:49, diff=9.262899s, valid=True
2026-05-28T20:56:58.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:56:58.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:56:58.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:56:58.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:56:58.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:56:58.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T20:56:58.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:12, diff=-13.734026s, valid=True
2026-05-28T20:56:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:56:58.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:56:58.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:56:58.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927260.266656s, valid=True
2026-05-28T20:56:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:56:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:56:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:56:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:56:58.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:56:58.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:56:58.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:56:58.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:56:58.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:56:58.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:56:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:56:58.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:56:58.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:56:58.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:56:58.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:56:59.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:56:59.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:56:59.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:56:59.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-28T20:56:59.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-28T20:56:59.539 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:56:59.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:57:29.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:57:29.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:57:29.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:57:29.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:57:29.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:57:29.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:57:29.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-28T20:57:29.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:57:29.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-28T20:57:29.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:57:29.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:57:29.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:57:29.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-28T20:57:32.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T20:57:32.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:57:32.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:57:32.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:57:32.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:57:32.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:57:32.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:57:32.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:57:32.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:57:32.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:57:32.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:57:32.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:57:32.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:57:32.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:57:32.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:57:32.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:57:32.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:57:32.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:57:32.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:57:32.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:57:32.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:57:32.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:57:32.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:57:32.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:57:32.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:57:22
2026-05-28T20:57:32.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69992, datetime.datetime(2026, 5, 28, 20, 57, 22), datetime.datetime(2026, 5, 28, 20, 57, 21), 'salt', 7.34, 71.97, None, 14.05, 141.3, 4.72, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:57:32.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:57:32.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:57:32.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:21, diff=11.680561s, valid=True
2026-05-28T20:57:32.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:57:32.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:57:32.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:12, diff=20.683387s, valid=True
2026-05-28T20:57:32.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:57:32.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:21, diff=11.690113s, valid=True
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:57:32.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:57:32.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:12, diff=20.69309s, valid=True
2026-05-28T20:57:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:57:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:57:32.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:57:32.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927294.693759s, valid=True
2026-05-28T20:57:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:57:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:57:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:57:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:57:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:57:32.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:57:32.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:57:32.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:57:32.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:57:32.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:57:32.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:57:32.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:57:32.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:57:33.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:57:33.230 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:57:33.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:57:33.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:57:33.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:57:33.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-28T20:57:33.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-28T20:57:33.765 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:57:33.765 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:58:03.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:58:03.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:58:03.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:58:04.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:58:04.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:58:04.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:58:04.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-28T20:58:04.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:58:04.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-28T20:58:04.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:58:04.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:58:04.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:58:04.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-28T20:58:06.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-28T20:58:06.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:58:06.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:58:06.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:58:06.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:58:06.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:58:06.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:58:06.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:58:06.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:58:06.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:58:06.703 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:58:06.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:58:06.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:58:06.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:58:06.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:58:06.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:58:06.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:58:06.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:58:06.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:58:07.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:58:07.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:58:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:58:07.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:58:07.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:58:07.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:57:52
2026-05-28T20:58:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69993, datetime.datetime(2026, 5, 28, 20, 57, 52), datetime.datetime(2026, 5, 28, 20, 57, 51), 'salt', 7.43, 71.6, None, 12.7, 134.14, 4.78, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:58:07.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:58:07.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:58:07.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:51, diff=16.093104s, valid=True
2026-05-28T20:58:07.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:58:07.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:58:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:12, diff=-4.903489s, valid=True
2026-05-28T20:58:07.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:58:07.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:58:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:57:48, diff=19.105376s, valid=True
2026-05-28T20:58:07.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:58:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:58:07.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:58:07.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:58:07.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:58:07.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:58:07.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:12, diff=-4.889833s, valid=True
2026-05-28T20:58:07.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:58:07.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:58:07.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:58:07.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927329.111219s, valid=True
2026-05-28T20:58:07.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:58:07.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:58:07.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:58:07.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:58:07.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:58:07.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:58:07.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:58:07.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:58:07.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:58:07.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:58:07.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:58:07.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:58:07.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:58:07.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:58:07.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:58:08.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:58:08.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:58:08.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:58:08.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-28T20:58:08.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-28T20:58:08.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:58:08.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:58:38.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:58:38.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:58:38.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:58:38.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:58:38.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:58:39.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:58:39.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-28T20:58:39.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:58:39.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-28T20:58:39.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:58:39.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:58:39.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:58:39.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-28T20:58:41.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-28T20:58:41.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:58:41.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:58:41.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:58:41.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:58:41.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:58:41.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:58:41.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:58:41.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:58:41.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:58:41.483 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:58:41.483 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:58:41.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:58:41.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:58:41.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:58:41.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:58:41.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:58:41.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:58:41.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:58:41.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:58:41.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:58:41.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:58:41.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:58:41.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:58:41.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:58:22
2026-05-28T20:58:41.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69994, datetime.datetime(2026, 5, 28, 20, 58, 22), datetime.datetime(2026, 5, 28, 20, 58, 21), 'salt', 7.53, 71.37, None, 14.43, 153.29, 4.83, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:58:41.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:58:41.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:58:41.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:21, diff=20.817048s, valid=True
2026-05-28T20:58:41.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:58:41.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:58:41.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:12, diff=29.819913s, valid=True
2026-05-28T20:58:41.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:58:41.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:19, diff=22.826488s, valid=True
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:58:41.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:58:41.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:12, diff=29.829549s, valid=True
2026-05-28T20:58:41.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:58:41.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:58:41.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:58:41.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927363.830209s, valid=True
2026-05-28T20:58:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:58:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:58:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:58:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:58:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:58:41.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:58:41.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:58:41.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:58:41.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:58:41.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:58:42.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:58:42.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:58:42.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:58:42.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:58:42.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:58:42.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:58:42.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:58:42.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:58:42.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-28T20:58:42.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-28T20:58:43.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:58:43.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:59:13.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:59:13.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:59:13.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:59:13.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:59:13.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:59:13.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:59:13.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:59:13.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:59:13.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T20:59:13.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:59:13.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:59:13.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:59:13.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-28T20:59:16.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-28T20:59:16.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:59:16.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:59:16.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:59:16.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:59:16.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:59:16.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:59:16.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:59:16.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:59:16.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:59:16.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:59:16.464 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:59:16.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:59:16.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:59:16.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:59:16.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:59:16.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:59:16.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:59:16.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:59:16.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:59:16.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:59:16.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:59:16.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:59:16.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:59:16.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:58:52
2026-05-28T20:59:16.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69995, datetime.datetime(2026, 5, 28, 20, 58, 52), datetime.datetime(2026, 5, 28, 20, 58, 52), 'salt', 7.5, 70.87, None, 14.47, 132.12, 4.93, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:59:16.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:59:16.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:59:16.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:52, diff=24.790142s, valid=True
2026-05-28T20:59:16.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:59:16.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:59:16.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:12, diff=4.79304s, valid=True
2026-05-28T20:59:16.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:59:16.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:58:49, diff=27.799477s, valid=True
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:59:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:59:16.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:12, diff=4.802478s, valid=True
2026-05-28T20:59:16.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:59:16.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:59:16.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:59:16.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927398.803137s, valid=True
2026-05-28T20:59:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:59:16.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:59:16.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:59:16.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:59:16.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:59:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:59:16.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:59:16.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:59:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:59:16.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:59:17.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:59:17.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:59:17.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:59:17.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:59:17.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:59:17.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:59:17.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:59:17.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:59:17.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-28T20:59:17.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-28T20:59:18.062 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:59:18.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T20:59:48.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T20:59:48.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T20:59:48.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T20:59:48.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T20:59:48.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T20:59:48.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T20:59:48.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T20:59:48.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T20:59:48.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-28T20:59:48.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T20:59:48.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T20:59:48.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T20:59:48.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-28T20:59:50.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-28T20:59:50.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T20:59:50.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T20:59:50.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T20:59:50.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T20:59:51.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T20:59:51.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T20:59:51.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T20:59:51.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T20:59:51.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T20:59:51.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T20:59:51.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T20:59:51.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T20:59:51.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T20:59:51.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T20:59:51.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T20:59:51.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:59:51.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:59:51.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T20:59:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T20:59:51.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T20:59:51.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T20:59:51.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T20:59:51.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T20:59:51.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 20:59:22
2026-05-28T20:59:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69996, datetime.datetime(2026, 5, 28, 20, 59, 22), datetime.datetime(2026, 5, 28, 20, 59, 22), 'salt', 7.6, 70.61, None, 15.53, 143.74, 4.99, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T20:59:51.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T20:59:51.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T20:59:51.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:22, diff=29.390918s, valid=True
2026-05-28T20:59:51.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T20:59:51.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:59:51.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:12, diff=39.393939s, valid=True
2026-05-28T20:59:51.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T20:59:51.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T20:59:51.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:19, diff=32.400644s, valid=True
2026-05-28T20:59:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T20:59:51.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:59:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T20:59:51.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T20:59:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T20:59:51.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T20:59:51.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 20:59:12, diff=39.403728s, valid=True
2026-05-28T20:59:51.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T20:59:51.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T20:59:51.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T20:59:51.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927433.404388s, valid=True
2026-05-28T20:59:51.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T20:59:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T20:59:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T20:59:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T20:59:51.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T20:59:51.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T20:59:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T20:59:51.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T20:59:51.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T20:59:51.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T20:59:51.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T20:59:51.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T20:59:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T20:59:51.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T20:59:51.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:59:52.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T20:59:52.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T20:59:52.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T20:59:52.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-28T20:59:52.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-28T20:59:52.747 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T20:59:52.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:00:22.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:00:22.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:00:22.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:00:23.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:00:23.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:00:23.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:00:23.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:00:23.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:00:23.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:00:23.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:00:23.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:00:23.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:00:23.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:00:25.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-28T21:00:25.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:00:25.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:00:25.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:00:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:00:25.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:00:25.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:00:25.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:00:25.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:00:25.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:00:25.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:00:25.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:00:25.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:00:25.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:00:25.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:00:25.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:00:25.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:00:26.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:00:26.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:00:26.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:00:26.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:00:26.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:00:26.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:00:26.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:00:26.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:00:23
2026-05-28T21:00:26.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69998, datetime.datetime(2026, 5, 28, 21, 0, 23), datetime.datetime(2026, 5, 28, 21, 0, 22), 'salt', 7.67, 69.74, None, 13.97, 141.39, 5.17, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:00:26.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:00:26.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:00:26.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:22, diff=4.136412s, valid=True
2026-05-28T21:00:26.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:00:26.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:00:26.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:12, diff=14.13925s, valid=True
2026-05-28T21:00:26.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:00:26.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:00:26.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:20, diff=6.145889s, valid=True
2026-05-28T21:00:26.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:00:26.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:00:26.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:00:26.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:00:26.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:00:26.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:00:26.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:12, diff=14.148875s, valid=True
2026-05-28T21:00:26.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:00:26.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:00:26.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:00:26.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927468.149528s, valid=True
2026-05-28T21:00:26.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:00:26.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:00:26.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:00:26.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:00:26.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:00:26.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:00:26.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:00:26.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:00:26.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:00:26.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:00:26.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:00:26.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:00:26.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:00:26.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:00:26.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:00:27.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:00:27.169 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:00:27.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:00:27.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-28T21:00:27.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-28T21:00:27.397 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:00:27.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:00:57.427 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:00:57.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:00:57.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:00:57.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:00:57.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:00:58.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:00:58.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-28T21:00:58.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:00:58.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-28T21:00:58.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:00:58.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:00:58.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:00:58.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-28T21:01:00.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-28T21:01:00.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:01:00.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:01:00.688 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:01:00.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:01:00.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:01:00.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:01:00.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:01:00.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:01:00.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:01:00.710 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:01:00.710 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:01:00.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:01:00.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:01:00.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:01:00.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:01:00.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:01:00.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:01:00.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:01:00.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:01:00.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:01:00.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:01:00.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:01:00.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:01:01.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:00:53
2026-05-28T21:01:01.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(69999, datetime.datetime(2026, 5, 28, 21, 0, 53), datetime.datetime(2026, 5, 28, 21, 0, 53), 'salt', 7.67, 69.35, None, 14.57, 143.98, 5.25, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:01:01.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:01:01.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:01:01.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:53, diff=8.035576s, valid=True
2026-05-28T21:01:01.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:01:01.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:01:01.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:12, diff=-10.961569s, valid=True
2026-05-28T21:01:01.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:01:01.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:01:01.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:00:50, diff=11.044901s, valid=True
2026-05-28T21:01:01.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:01:01.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:01:01.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:01:01.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:01:01.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:01:01.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:01:01.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:12, diff=-10.952053s, valid=True
2026-05-28T21:01:01.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:01:01.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:01:01.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:01:01.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927503.04859s, valid=True
2026-05-28T21:01:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:01:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:01:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:01:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:01:01.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:01:01.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:01:01.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:01:01.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:01:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:01:01.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:01:01.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:01:01.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:01:01.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:01:01.382 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:01:01.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:01:02.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:01:02.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:01:02.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:01:02.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-28T21:01:02.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-28T21:01:02.366 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:01:02.366 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:01:32.397 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:01:32.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:01:32.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:01:32.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:01:32.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:01:32.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:01:32.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-28T21:01:32.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:01:32.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-28T21:01:32.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:01:32.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:01:32.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:01:32.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-28T21:01:35.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-28T21:01:35.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:01:35.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:01:35.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:01:35.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:01:35.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:01:35.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:01:35.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:01:35.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:01:35.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:01:35.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:01:35.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:01:35.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:01:35.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:01:35.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:01:35.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:01:35.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:01:35.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:01:35.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:01:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:01:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:01:35.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:01:35.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:01:35.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:01:35.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:01:23
2026-05-28T21:01:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70000, datetime.datetime(2026, 5, 28, 21, 1, 23), datetime.datetime(2026, 5, 28, 21, 1, 23), 'salt', 7.83, 69.31, None, 16.27, 148.04, 5.26, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:01:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:01:35.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:01:35.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:23, diff=12.74787s, valid=True
2026-05-28T21:01:35.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:01:35.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:01:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:12, diff=23.750707s, valid=True
2026-05-28T21:01:35.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:01:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:01:35.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:22, diff=13.757892s, valid=True
2026-05-28T21:01:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:01:35.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:01:35.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:01:35.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:01:35.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:01:35.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:01:35.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:12, diff=23.760921s, valid=True
2026-05-28T21:01:35.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:01:35.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:01:35.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:01:35.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927537.761575s, valid=True
2026-05-28T21:01:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:01:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:01:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:01:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:01:35.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:01:35.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:01:35.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:01:35.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:01:35.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:01:35.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:01:35.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:01:36.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:01:36.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:01:36.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:01:36.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:01:36.664 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:01:36.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:01:36.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:01:36.769 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:01:36.769 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:01:36.979 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:01:36.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:02:07.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:02:07.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:02:07.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:02:07.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:02:07.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:02:07.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:02:07.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:02:07.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:02:07.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-28T21:02:07.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:02:07.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:02:07.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:02:07.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-28T21:02:10.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-28T21:02:10.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:02:10.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:02:10.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:02:10.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:02:10.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:02:10.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:02:10.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:02:10.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:02:10.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:02:10.131 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:02:10.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:02:10.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:02:10.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:02:10.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:02:10.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:02:10.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:02:10.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:02:10.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:02:10.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:02:10.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:02:10.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:02:10.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:02:10.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:02:10.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:01:53
2026-05-28T21:02:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70001, datetime.datetime(2026, 5, 28, 21, 1, 53), datetime.datetime(2026, 5, 28, 21, 1, 53), 'salt', 7.9, 68.78, None, 15.6, 144.28, 5.37, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:02:10.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:02:10.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:02:10.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:53, diff=17.473846s, valid=True
2026-05-28T21:02:10.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:02:10.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:02:10.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:12, diff=-1.52331s, valid=True
2026-05-28T21:02:10.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:02:10.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:01:50, diff=20.483299s, valid=True
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:02:10.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:02:10.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:12, diff=-1.513206s, valid=True
2026-05-28T21:02:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:02:10.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:02:10.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:02:10.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927572.487486s, valid=True
2026-05-28T21:02:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:02:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:02:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:02:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:02:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:02:10.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:02:10.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:02:10.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:02:10.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:02:10.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:02:10.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:02:10.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:02:10.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:02:10.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:02:11.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:02:11.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:02:11.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:02:11.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:02:11.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-28T21:02:11.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-28T21:02:11.793 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:02:11.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:02:41.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:02:41.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:02:41.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:02:42.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:02:42.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:02:42.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:02:42.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-28T21:02:42.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:02:42.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-28T21:02:42.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:02:42.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:02:42.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:02:42.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-28T21:02:44.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-28T21:02:44.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:02:44.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:02:44.922 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:02:44.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:02:44.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:02:44.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:02:44.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:02:44.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:02:44.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:02:44.942 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:02:44.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:02:44.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:02:45.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:02:45.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:02:45.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:02:45.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:02:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:02:45.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:02:45.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:02:45.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:02:45.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:02:45.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:02:45.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:02:45.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:02:24
2026-05-28T21:02:45.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70002, datetime.datetime(2026, 5, 28, 21, 2, 24), datetime.datetime(2026, 5, 28, 21, 2, 23), 'salt', 8.0, 68.45, None, 15.81, 144.64, 5.45, 831.84, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:02:45.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:02:45.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:02:45.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:23, diff=22.262317s, valid=True
2026-05-28T21:02:45.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:02:45.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:02:45.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:12, diff=33.26516s, valid=True
2026-05-28T21:02:45.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:02:45.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:02:45.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:21, diff=24.27168s, valid=True
2026-05-28T21:02:45.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:02:45.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:02:45.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:02:45.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:02:45.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:02:45.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:02:45.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:12, diff=33.274699s, valid=True
2026-05-28T21:02:45.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:02:45.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:02:45.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:02:45.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927607.275341s, valid=True
2026-05-28T21:02:45.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:02:45.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:02:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:02:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:02:45.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:02:45.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:02:45.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:02:45.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:02:45.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:02:45.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:02:45.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:02:45.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:02:45.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:02:45.596 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:02:45.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:02:46.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:02:46.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:02:46.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:02:46.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-28T21:02:46.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-28T21:02:46.341 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:02:46.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:03:16.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:03:16.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:03:16.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:03:16.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:03:16.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:03:16.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:03:16.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-28T21:03:16.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:03:16.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-28T21:03:16.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:03:16.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:03:16.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:03:16.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-28T21:03:19.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-28T21:03:19.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:03:19.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:03:19.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:03:19.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:03:19.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:03:19.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:03:19.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:03:19.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:03:19.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:03:19.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:03:19.205 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:03:19.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:03:19.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:03:19.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:03:19.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:03:19.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:03:19.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:03:19.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:03:19.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:03:19.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:03:19.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:03:19.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:03:19.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:03:19.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:02:54
2026-05-28T21:03:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70003, datetime.datetime(2026, 5, 28, 21, 2, 54), datetime.datetime(2026, 5, 28, 21, 2, 53), 'salt', 8.03, 67.95, None, 17.82, 148.56, 5.55, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:03:19.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:03:19.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:03:19.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:53, diff=26.524555s, valid=True
2026-05-28T21:03:19.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:03:19.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:03:19.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:12, diff=7.527415s, valid=True
2026-05-28T21:03:19.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:03:19.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:02:51, diff=28.53401s, valid=True
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:03:19.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:03:19.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:12, diff=7.537082s, valid=True
2026-05-28T21:03:19.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:03:19.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:03:19.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:03:19.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927641.537738s, valid=True
2026-05-28T21:03:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:03:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:03:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:03:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:03:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:03:19.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:03:19.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:03:19.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:03:19.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:03:19.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:03:19.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:03:19.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:03:19.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:03:19.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:03:20.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:03:20.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:03:20.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:03:20.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:03:20.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-28T21:03:20.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-28T21:03:20.715 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:03:20.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:03:50.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:03:50.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:03:50.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:03:50.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:03:50.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:03:51.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:03:51.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-28T21:03:51.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:03:51.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-28T21:03:51.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:03:51.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:03:51.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:03:51.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-28T21:03:53.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-28T21:03:53.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:03:53.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:03:53.501 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:03:53.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:03:53.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:03:53.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:03:53.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:03:53.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:03:53.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:03:53.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:03:53.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:03:53.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:03:53.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:03:53.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:03:53.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:03:53.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:03:53.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:03:53.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:03:53.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:03:53.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:03:53.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:03:53.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:03:53.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:03:53.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:03:24
2026-05-28T21:03:53.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70004, datetime.datetime(2026, 5, 28, 21, 3, 24), datetime.datetime(2026, 5, 28, 21, 3, 24), 'salt', 8.07, 67.66, None, 15.24, 150.69, 5.62, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:03:53.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:03:53.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:03:53.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:24, diff=29.845016s, valid=True
2026-05-28T21:03:53.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:03:53.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:03:53.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:12, diff=41.848085s, valid=True
2026-05-28T21:03:53.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:03:53.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:21, diff=32.855003s, valid=True
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:03:53.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:03:53.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:03:12, diff=41.858193s, valid=True
2026-05-28T21:03:53.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:03:53.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:03:53.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:03:53.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927675.858887s, valid=True
2026-05-28T21:03:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:03:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:03:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:03:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:03:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:03:53.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:03:53.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:03:53.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:03:53.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:03:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:03:54.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:03:54.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:03:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:03:54.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:03:54.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:03:54.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:03:54.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:03:54.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:03:54.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:03:54.839 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:03:55.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:03:55.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:04:25.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:04:25.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:04:25.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:04:25.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:04:25.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:04:26.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:04:26.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-28T21:04:26.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:04:26.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-28T21:04:26.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:04:26.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:04:26.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:04:26.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:04:28.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-28T21:04:28.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:04:28.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:04:28.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:04:28.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:04:28.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:04:28.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:04:28.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:04:28.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:04:28.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:04:28.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:04:28.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:04:28.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:04:28.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:04:28.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:04:28.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:04:28.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:04:29.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:04:29.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:04:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:04:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:04:29.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:04:29.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:04:29.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:04:29.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:04:25
2026-05-28T21:04:29.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70006, datetime.datetime(2026, 5, 28, 21, 4, 25), datetime.datetime(2026, 5, 28, 21, 4, 24), 'salt', 8.2, 67.12, None, 16.76, 143.96, 5.73, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:04:29.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:04:29.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:04:29.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:24, diff=5.147959s, valid=True
2026-05-28T21:04:29.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:04:29.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:04:29.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:12, diff=17.150849s, valid=True
2026-05-28T21:04:29.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:04:29.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:21, diff=8.15801s, valid=True
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:04:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:04:29.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:12, diff=17.161538s, valid=True
2026-05-28T21:04:29.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:04:29.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:04:29.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:04:29.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927711.162207s, valid=True
2026-05-28T21:04:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:04:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:04:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:04:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:04:29.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:04:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:04:29.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:04:29.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:04:29.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:04:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:04:29.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:04:29.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:04:29.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:04:29.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:04:29.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:04:30.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:04:30.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:04:30.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:04:30.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-28T21:04:30.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-28T21:04:30.469 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:04:30.469 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:05:00.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:05:00.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:05:00.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:05:00.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:05:00.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:05:00.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:05:00.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-28T21:05:00.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:05:00.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-28T21:05:00.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:05:00.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:05:00.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:05:00.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-28T21:05:03.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:05:03.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:05:03.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:05:03.375 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:05:03.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:05:03.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:05:03.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:05:03.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:05:03.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:05:03.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:05:03.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:05:03.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:05:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:05:03.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:05:03.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:05:03.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:05:03.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:05:03.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:05:03.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:05:03.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:05:03.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:05:03.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:05:03.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:05:03.661 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:05:03.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:04:55
2026-05-28T21:05:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70007, datetime.datetime(2026, 5, 28, 21, 4, 55), datetime.datetime(2026, 5, 28, 21, 4, 54), 'salt', 8.2, 67.06, None, 16.41, 145.58, 5.74, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:05:03.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:05:03.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:05:03.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:54, diff=9.731919s, valid=True
2026-05-28T21:05:03.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:05:03.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:05:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:12, diff=-8.264679s, valid=True
2026-05-28T21:05:03.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:05:03.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:05:03.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:04:52, diff=11.743583s, valid=True
2026-05-28T21:05:03.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:05:03.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:05:03.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:05:03.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:05:03.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:05:03.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:05:03.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:12, diff=-8.252909s, valid=True
2026-05-28T21:05:03.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:05:03.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:05:03.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:05:03.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927745.747903s, valid=True
2026-05-28T21:05:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:05:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:05:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:05:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:05:03.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:05:03.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:05:03.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:05:03.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:05:03.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:05:03.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:05:03.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:05:04.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:05:04.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:05:04.103 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:05:04.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:05:04.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:05:04.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:05:04.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:05:04.911 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:05:04.911 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:05:04.996 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:05:04.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:05:35.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:05:35.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:05:35.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:05:35.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:05:35.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:05:35.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:05:35.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-28T21:05:35.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:05:35.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-28T21:05:35.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:05:35.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:05:35.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:05:35.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-28T21:05:38.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-28T21:05:38.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:05:38.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:05:38.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:05:38.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:05:38.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:05:38.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:05:38.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:05:38.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:05:38.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:05:38.593 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:05:38.593 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:05:38.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:05:38.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:05:38.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:05:38.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:05:38.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:05:38.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:05:38.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:05:38.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:05:38.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:05:38.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:05:38.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:05:38.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:05:38.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:05:25
2026-05-28T21:05:38.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70008, datetime.datetime(2026, 5, 28, 21, 5, 25), datetime.datetime(2026, 5, 28, 21, 5, 25), 'salt', 8.2, 67.06, None, 13.41, 143.79, 5.74, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:05:38.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:05:38.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:05:38.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:25, diff=13.909232s, valid=True
2026-05-28T21:05:38.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:05:38.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:05:38.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:12, diff=26.912138s, valid=True
2026-05-28T21:05:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:05:38.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:05:38.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:23, diff=15.918733s, valid=True
2026-05-28T21:05:38.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:05:38.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:05:38.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:05:38.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:05:38.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:05:38.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:05:38.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:12, diff=26.921792s, valid=True
2026-05-28T21:05:38.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:05:38.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:05:38.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:05:38.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927780.922463s, valid=True
2026-05-28T21:05:38.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:05:38.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:05:38.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:05:38.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:05:38.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:05:38.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:05:38.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:05:38.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:05:39.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:05:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:05:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:05:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:05:39.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:05:39.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:05:39.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:05:39.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:05:39.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:05:39.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:05:39.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-28T21:05:39.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-28T21:05:40.178 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:05:40.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:06:10.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:06:10.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:06:10.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:06:10.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:06:10.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:06:10.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:06:10.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-28T21:06:10.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:06:10.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-28T21:06:10.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:06:10.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:06:10.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:06:10.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-28T21:06:12.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-28T21:06:12.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:06:12.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:06:12.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:06:12.988 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:06:12.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:06:13.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:06:13.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:06:13.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:06:13.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:06:13.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:06:13.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:06:13.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:06:13.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:06:13.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:06:13.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:06:13.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:06:13.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:06:13.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:06:13.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:06:13.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:06:13.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:06:13.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:06:13.271 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:06:13.330 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:05:55
2026-05-28T21:06:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70009, datetime.datetime(2026, 5, 28, 21, 5, 55), datetime.datetime(2026, 5, 28, 21, 5, 55), 'salt', 8.13, 67.19, None, 14.12, 155.58, 5.71, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:06:13.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:06:13.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:06:13.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:55, diff=18.339311s, valid=True
2026-05-28T21:06:13.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:06:13.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:06:13.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:12, diff=1.343756s, valid=True
2026-05-28T21:06:13.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:06:13.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:06:13.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:05:52, diff=21.352856s, valid=True
2026-05-28T21:06:13.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:06:13.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:06:13.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:06:13.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:06:13.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:06:13.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:06:13.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:12, diff=1.355967s, valid=True
2026-05-28T21:06:13.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:06:13.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:06:13.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:06:13.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927815.356647s, valid=True
2026-05-28T21:06:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:06:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:06:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:06:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:06:13.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:06:13.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:06:13.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:06:13.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:06:13.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:06:13.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:06:13.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:06:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:06:13.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:06:13.686 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:06:13.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:06:14.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:06:14.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:06:14.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:06:14.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-28T21:06:14.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-28T21:06:14.639 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:06:14.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:06:44.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:06:44.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:06:44.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:06:44.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:06:44.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:06:45.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:06:45.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-28T21:06:45.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:06:45.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-28T21:06:45.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:06:45.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:06:45.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:06:45.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-28T21:06:47.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:06:47.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:06:47.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:06:47.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:06:47.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:06:47.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:06:47.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:06:47.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:06:47.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:06:47.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:06:47.620 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:06:47.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:06:47.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:06:47.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:06:47.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:06:47.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:06:47.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:06:47.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:06:47.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:06:47.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:06:47.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:06:47.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:06:47.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:06:47.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:06:47.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:06:25
2026-05-28T21:06:47.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70010, datetime.datetime(2026, 5, 28, 21, 6, 25), datetime.datetime(2026, 5, 28, 21, 6, 25), 'salt', 8.07, 67.26, None, 15.17, 149.94, 5.7, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:06:47.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:06:47.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:06:47.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:25, diff=22.938287s, valid=True
2026-05-28T21:06:47.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:06:47.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:06:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:12, diff=35.941174s, valid=True
2026-05-28T21:06:47.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:06:47.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:06:47.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:23, diff=24.947894s, valid=True
2026-05-28T21:06:47.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:06:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:06:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:06:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:06:47.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:06:47.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:06:47.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:12, diff=35.950903s, valid=True
2026-05-28T21:06:47.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:06:47.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:06:47.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:06:47.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927849.951548s, valid=True
2026-05-28T21:06:47.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:06:47.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:06:47.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:06:47.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:06:47.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:06:48.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:06:48.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:06:48.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:06:48.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:06:48.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:06:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:06:48.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:06:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:06:48.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:06:48.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:06:48.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:06:48.974 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:06:48.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:06:48.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-28T21:06:48.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-28T21:06:49.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:06:49.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:07:19.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:07:19.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:07:19.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:07:19.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:07:19.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:07:19.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:07:19.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-28T21:07:19.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:07:19.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-28T21:07:19.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:07:19.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:07:19.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:07:19.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-28T21:07:22.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-28T21:07:22.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:07:22.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:07:22.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:07:22.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:07:22.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:07:22.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:07:22.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:07:22.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:07:22.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:07:22.282 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:07:22.282 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:07:22.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:07:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:07:22.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:07:22.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:07:22.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:07:22.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:07:22.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:07:22.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:07:22.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:07:22.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:07:22.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:07:22.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:07:22.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:06:55
2026-05-28T21:07:22.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70011, datetime.datetime(2026, 5, 28, 21, 6, 55), datetime.datetime(2026, 5, 28, 21, 6, 55), 'salt', 8.0, 67.36, None, 13.69, 142.03, 5.67, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:07:22.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:07:22.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:07:22.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:55, diff=27.614717s, valid=True
2026-05-28T21:07:22.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:07:22.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:07:22.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:07:12, diff=10.617558s, valid=True
2026-05-28T21:07:22.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:07:22.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:06:53, diff=29.624s, valid=True
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:07:22.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:07:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:07:12, diff=10.626992s, valid=True
2026-05-28T21:07:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:07:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:07:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:07:22.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927884.627641s, valid=True
2026-05-28T21:07:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:07:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:07:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:07:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:07:22.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:07:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:07:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:07:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:07:22.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:07:22.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:07:22.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:07:22.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:07:22.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:07:23.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:07:23.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:07:23.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:07:23.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:07:23.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:07: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-28T21:07:23.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-28T21:07:23.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:07:23.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:07:53.918 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:07:53.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:07:53.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:07:54.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:07:54.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:07:54.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:07:54.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-28T21:07:54.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:07:54.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-28T21:07:54.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:07:54.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:07:54.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:07:54.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-28T21:07:57.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-28T21:07:57.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:07:57.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:07:57.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:07:57.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:07:57.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:07:57.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:07:57.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:07:57.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:07:57.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:07:57.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:07:57.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:07:57.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:07:57.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:07:57.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:07:57.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:07:57.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:07:57.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:07:57.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:07:57.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:07:57.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:07:57.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:07:57.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:07:57.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:07:57.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:07:56
2026-05-28T21:07:57.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70013, datetime.datetime(2026, 5, 28, 21, 7, 56), datetime.datetime(2026, 5, 28, 21, 7, 55), 'salt', 7.97, 67.69, None, 11.93, 145.37, 5.6, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:07:57.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:07:57.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:07:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:07:55, diff=2.359841s, valid=True
2026-05-28T21:07:57.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:07:57.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:07:57.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:12, diff=-14.63729s, valid=True
2026-05-28T21:07:57.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:07:57.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:07:53, diff=4.369411s, valid=True
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:07:57.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:07:57.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:12, diff=-14.627586s, valid=True
2026-05-28T21:07:57.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:07:57.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:07:57.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:07:57.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927919.373085s, valid=True
2026-05-28T21:07:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:07:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:07:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:07:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:07:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:07:57.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:07:57.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:07:57.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:07:57.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:07:57.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:07:57.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:07:57.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:07:57.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:07:57.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:07:57.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:07:58.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:07:58.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:07:58.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:07:58.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-28T21:07:58.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-28T21:07:58.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:07:58.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:08:28.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:08:28.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:08:28.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:08:28.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:08:28.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:08:29.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:08:29.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:08:29.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:08:29.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-28T21:08:29.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:08:29.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:08:29.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:08:29.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:08:31.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-28T21:08:31.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:08:31.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:08:31.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:08:31.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:08:31.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:08:31.609 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:08:31.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:08:31.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:08:31.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:08:31.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:08:31.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:08:31.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:08:31.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:08:31.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:08:31.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:08:31.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:08:31.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:08:31.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:08:31.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:08:31.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:08:31.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:08:31.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:08:31.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:08:31.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:08:26
2026-05-28T21:08:31.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70014, datetime.datetime(2026, 5, 28, 21, 8, 26), datetime.datetime(2026, 5, 28, 21, 8, 26), 'salt', 7.83, 67.59, None, 13.69, 143.56, 5.61, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:08:31.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:08:31.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:08:31.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:26, diff=5.933603s, valid=True
2026-05-28T21:08:31.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:08:31.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:08:31.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:12, diff=19.936436s, valid=True
2026-05-28T21:08:31.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:08:31.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:24, diff=7.94303s, valid=True
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:08:31.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:08:31.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:12, diff=19.946081s, valid=True
2026-05-28T21:08:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:08:31.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:08:31.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:08:31.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927953.946744s, valid=True
2026-05-28T21:08:31.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:08:31.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:08:31.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:08:31.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:08:31.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:08:32.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:08:32.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:08:32.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:08:32.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:08:32.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:08:32.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:08:32.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:08:32.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:08:32.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:08:32.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:08:32.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:08:33.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:08:33.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:08:33.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-28T21:08:33.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-28T21:08:33.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:08:33.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:09:03.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:09:03.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:09:03.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:09:03.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:09:03.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:09:03.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:09:03.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:09:03.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:09:03.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-28T21:09:03.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:09:03.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:09:04.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:09:04.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:09:06.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:09:06.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:09:06.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:09:06.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:09:06.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:09:06.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:09:06.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:09:06.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:09:06.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:09:06.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:09:06.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:09:06.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:09:06.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:09:06.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:09:06.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:09:06.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:09:06.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:09:06.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:09:06.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:09:06.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:09:06.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:09:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:09:06.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:09:06.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:09:06.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:08:57
2026-05-28T21:09:06.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70015, datetime.datetime(2026, 5, 28, 21, 8, 57), datetime.datetime(2026, 5, 28, 21, 8, 57), 'salt', 7.93, 67.79, None, 14.5, 150.77, 5.57, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:09:06.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:09:06.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:09:06.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:57, diff=9.781994s, valid=True
2026-05-28T21:09:06.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:09:06.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:09:06.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:12, diff=-5.215066s, valid=True
2026-05-28T21:09:06.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:09:06.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:08:54, diff=12.791571s, valid=True
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:09:06.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:09:06.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:09:06.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:12, diff=-5.205356s, valid=True
2026-05-28T21:09:06.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:09:06.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:09:06.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:09:06.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=927988.795298s, valid=True
2026-05-28T21:09:06.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:09:06.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:09:06.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:09:06.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:09:06.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:09:06.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:09:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:09:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:09:06.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:09:06.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:09:06.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:09:07.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:09:07.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:09:07.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:09:07.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:09:07.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:09:07.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:09:07.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:09:07.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-28T21:09:07.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-28T21:09:07.932 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:09:07.932 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:09:37.961 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:09:37.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:09:37.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:09:38.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:09:38.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:09:38.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:09:38.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-28T21:09:38.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:09:38.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-28T21:09:38.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:09:38.622 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:09:38.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:09:38.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-28T21:09:41.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-28T21:09:41.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:09:41.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:09:41.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:09:41.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:09:41.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:09:41.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:09:41.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:09:41.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:09:41.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:09:41.069 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:09:41.069 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:09:41.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:09:41.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:09:41.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:09:41.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:09:41.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:09:41.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:09:41.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:09:41.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:09:41.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:09:41.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:09:41.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:09:41.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:09:41.396 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:09:27
2026-05-28T21:09:41.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70016, datetime.datetime(2026, 5, 28, 21, 9, 27), datetime.datetime(2026, 5, 28, 21, 9, 27), 'salt', 8.03, 67.62, None, 12.81, 150.65, 5.61, 831.82, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:09:41.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:09:41.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:09:41.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:27, diff=14.40225s, valid=True
2026-05-28T21:09:41.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:09:41.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:09:41.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:12, diff=29.405087s, valid=True
2026-05-28T21:09:41.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:09:41.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:09:41.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:25, diff=16.411709s, valid=True
2026-05-28T21:09:41.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:09:41.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:09:41.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:09:41.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:09:41.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:09:41.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:09:41.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:12, diff=29.414768s, valid=True
2026-05-28T21:09:41.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:09:41.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:09:41.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:09:41.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928023.415416s, valid=True
2026-05-28T21:09:41.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:09:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:09:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:09:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:09:41.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:09:41.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:09:41.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:09:41.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:09:41.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:09:41.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:09:41.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:09:41.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:09:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:09:41.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:09:42.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:09:42.398 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:09:42.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:09:42.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:09: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-28T21:09: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-28T21:09:42.679 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:09:42.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:10:12.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:10:12.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:10:12.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:10:12.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:10:12.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:10:13.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:10:13.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-28T21:10:13.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:10:13.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-28T21:10:13.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:10:13.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:10:13.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:10:13.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-28T21:10:15.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-28T21:10:15.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:10:15.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:10:15.616 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:10:15.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:10:15.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:10:15.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:10:15.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:10:15.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:10:15.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:10:15.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:10:15.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:10:15.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:10:15.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:10:15.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:10:15.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:10:15.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:10:15.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:10:15.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:10:15.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:10:15.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:10:15.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:10:15.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:10:15.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:10:15.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:09:57
2026-05-28T21:10:15.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70017, datetime.datetime(2026, 5, 28, 21, 9, 57), datetime.datetime(2026, 5, 28, 21, 9, 57), 'salt', 7.97, 67.52, None, 14.68, 147.06, 5.64, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:10:15.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:10:15.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:10:15.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:57, diff=18.97249s, valid=True
2026-05-28T21:10:15.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:10:15.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:10:15.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:12, diff=3.975377s, valid=True
2026-05-28T21:10:15.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:10:15.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:09:57, diff=18.982076s, valid=True
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:10:15.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:10:15.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:12, diff=3.985171s, valid=True
2026-05-28T21:10:15.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:10:15.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:10:15.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:10:15.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928057.985841s, valid=True
2026-05-28T21:10:15.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:10:15.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:10:15.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:10:15.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:10:15.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:10:16.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:10:16.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:10:16.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:10:16.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:10:16.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:10:16.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:10:16.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:10:16.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:10:16.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:10:16.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:10:16.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:10:16.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:10:16.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:10:16.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-28T21:10:16.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-28T21:10:17.149 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:10:17.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:10:47.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:10:47.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:10:47.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:10:47.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:10:47.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:10:47.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:10:47.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-28T21:10:47.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:10:47.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-28T21:10:47.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:10:47.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:10:47.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:10:47.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-28T21:10:50.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-28T21:10:50.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:10:50.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:10:50.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:10:50.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:10:50.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:10:50.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:10:50.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:10:50.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:10:50.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:10:50.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:10:50.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:10:50.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:10:50.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:10:50.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:10:50.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:10:50.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:10:50.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:10:50.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:10:50.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:10:50.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:10:50.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:10:50.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:10:50.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:10:50.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:10:28
2026-05-28T21:10:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70018, datetime.datetime(2026, 5, 28, 21, 10, 28), datetime.datetime(2026, 5, 28, 21, 10, 27), 'salt', 8.0, 67.42, None, 14.79, 145.32, 5.66, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:10:50.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:10:50.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:10:50.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:27, diff=23.936335s, valid=True
2026-05-28T21:10:50.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:10:50.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:10:50.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:12, diff=38.93913s, valid=True
2026-05-28T21:10:50.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:10:50.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:10:50.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:25, diff=25.945638s, valid=True
2026-05-28T21:10:50.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:10:50.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:10:50.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:10:50.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:10:50.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:10:50.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:10:50.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:12, diff=38.948648s, valid=True
2026-05-28T21:10:50.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:10:50.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:10:50.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:10:50.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928092.949302s, valid=True
2026-05-28T21:10:50.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:10:50.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:10:50.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:10:50.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:10:50.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:10:51.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:10:51.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:10:51.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:10:51.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:10:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:10:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:10:51.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:10:51.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:10:51.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:10:51.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:10:51.827 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:10:51.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:10:51.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:10:51.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-28T21:10:51.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-28T21:10:52.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:10:52.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:11:22.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:11:22.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:11:22.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:11:22.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:11:22.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:11:22.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:11:22.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-28T21:11:22.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:11:22.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-28T21:11:22.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:11:22.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:11:22.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:11:22.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-28T21:11:25.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-28T21:11:25.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:11:25.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:11:25.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:11:25.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:11:25.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:11:25.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:11:25.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:11:25.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:11:25.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:11:25.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:11:25.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:11:25.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:11:25.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:11:25.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:11:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:11:25.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:11:25.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:11:25.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:11:25.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:11:25.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:11:25.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:11:25.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:11:25.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:11:25.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:10:58
2026-05-28T21:11:25.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70019, datetime.datetime(2026, 5, 28, 21, 10, 58), datetime.datetime(2026, 5, 28, 21, 10, 57), 'salt', 8.0, 67.42, None, 12.39, 148.66, 5.66, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:11:25.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:11:25.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:11:25.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:57, diff=28.810649s, valid=True
2026-05-28T21:11:25.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:11:25.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:11:25.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:11:12, diff=13.813501s, valid=True
2026-05-28T21:11:25.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:11:25.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:10:55, diff=30.82016s, valid=True
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:11:25.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:11:25.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:11:12, diff=13.823234s, valid=True
2026-05-28T21:11:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:11:25.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:11:25.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:11:25.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928127.82392s, valid=True
2026-05-28T21:11:25.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:11:25.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:11:25.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:11:25.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:11:25.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:11:25.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:11:25.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:11:25.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:11:25.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:11:25.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:11:26.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:11:26.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:11:26.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:11:26.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:11:26.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:11:26.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:11:26.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:11:26.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:11:26.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-28T21:11:26.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-28T21:11:27.127 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:11:27.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:11:57.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:11:57.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:11:57.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:11:57.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:11:57.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:11:57.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:11:57.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-28T21:11:57.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:11:57.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-28T21:11:57.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:11:57.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:11:57.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:11:57.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-28T21:12:00.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-28T21:12:00.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:12:00.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:12:00.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:12:00.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:12:00.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:12:00.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:12:00.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:12:00.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:12:00.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:12:00.045 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:12:00.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:12:00.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:12:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:12:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:12:00.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:12:00.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:12:00.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:12:00.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:12:00.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:12:00.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:12:00.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:12:00.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:12:00.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:12:00.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:11:58
2026-05-28T21:12:00.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70021, datetime.datetime(2026, 5, 28, 21, 11, 58), datetime.datetime(2026, 5, 28, 21, 11, 58), 'salt', 8.03, 67.26, None, 12.77, 146.82, 5.69, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:12:00.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:12:00.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:12:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:11:58, diff=2.376613s, valid=True
2026-05-28T21:12:00.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:12:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:12:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:12, diff=-11.620454s, valid=True
2026-05-28T21:12:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:12:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:11:56, diff=4.386364s, valid=True
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:12:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:12:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:12, diff=-11.610508s, valid=True
2026-05-28T21:12:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:12:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:12:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:12:00.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928162.390165s, valid=True
2026-05-28T21:12:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:12:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:12:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:12:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:12:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:12:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:12:00.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:12:00.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:12:00.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:12:00.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:12:00.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:12:00.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:12:00.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:12:00.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:12:01.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:12:01.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:12:01.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:12:01.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:12:01.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-28T21:12:01.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-28T21:12:01.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:12:01.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:12:31.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:12:31.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:12:31.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:12:31.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:12:31.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:12:32.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:12:32.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-28T21:12:32.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:12:32.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-28T21:12:32.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:12:32.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:12:32.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:12:32.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-28T21:12:34.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-28T21:12:34.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:12:34.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:12:34.582 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:12:34.582 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:12:34.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:12:34.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:12:34.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:12:34.604 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:12:34.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:12:34.604 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:12:34.604 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:12:34.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:12:34.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:12:34.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:12:34.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:12:34.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:12:34.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:12:34.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:12:34.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:12:34.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:12:34.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:12:34.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:12:34.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:12:34.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:12:28
2026-05-28T21:12:34.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70022, datetime.datetime(2026, 5, 28, 21, 12, 28), datetime.datetime(2026, 5, 28, 21, 12, 28), 'salt', 7.97, 67.29, None, 13.52, 145.35, 5.69, 831.88, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:12:34.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:12:34.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:12:34.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:28, diff=6.940081s, valid=True
2026-05-28T21:12:34.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:12:34.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:12:34.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:12, diff=22.942897s, valid=True
2026-05-28T21:12:34.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:12:34.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:26, diff=8.949406s, valid=True
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:12:34.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:12:34.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:12, diff=22.952349s, valid=True
2026-05-28T21:12:34.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:12:34.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:12:34.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:12:34.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928196.953007s, valid=True
2026-05-28T21:12:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:12:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:12:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:12:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:12:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:12:35.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:12:35.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:12:35.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:12:35.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:12:35.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:12:35.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:12:35.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:12:35.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:12:35.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:12:35.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:12:35.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:12:36.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:12:36.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:12:36.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-28T21:12:36.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-28T21:12:36.134 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:12:36.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:13:06.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:13:06.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:13:06.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:13:06.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:13:06.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:13:06.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:13:06.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-28T21:13:06.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:13:06.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-28T21:13:06.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:13:06.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:13:06.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:13:06.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-28T21:13:09.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-28T21:13:09.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:13:09.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:13:09.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:13:09.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:13:09.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:13:09.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:13:09.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:13:09.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:13:09.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:13:09.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:13:09.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:13:09.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:13:09.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:13:09.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:13:09.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:13:09.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:13:09.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:13:09.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:13:09.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:13:09.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:13:09.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:13:09.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:13:09.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:13:09.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:12:59
2026-05-28T21:13:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70023, datetime.datetime(2026, 5, 28, 21, 12, 59), datetime.datetime(2026, 5, 28, 21, 12, 58), 'salt', 8.07, 67.32, None, 13.37, 145.56, 5.68, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:13:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:13:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:13:09.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:58, diff=11.614016s, valid=True
2026-05-28T21:13:09.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:13:09.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:13:09.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:12, diff=-2.383186s, valid=True
2026-05-28T21:13:09.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:13:09.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:12:56, diff=13.623277s, valid=True
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:13:09.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:13:09.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:12, diff=-2.373757s, valid=True
2026-05-28T21:13:09.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:13:09.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:13:09.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:13:09.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928231.626892s, valid=True
2026-05-28T21:13:09.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:13:09.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:13:09.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:13:09.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:13:09.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:13:09.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:13:09.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:13:09.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:13:09.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:13:09.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:13:09.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:13:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:13:09.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:13:09.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:13:10.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:13:10.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:13:10.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:13:10.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:13:10.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-28T21:13:10.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-28T21:13:11.217 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:13:11.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:13:41.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:13:41.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:13: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-28T21:13:41.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:13:41.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:13:41.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:13:41.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:13:41.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:13:41.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:13:41.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:13:41.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:13:41.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:13:41.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:13:44.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-28T21:13:44.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:13:44.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:13:44.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:13:44.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:13:44.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:13:44.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:13:44.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:13:44.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:13:44.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:13:44.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:13:44.166 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:13:44.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:13:44.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:13:44.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:13:44.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:13:44.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:13:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:13:44.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:13:44.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:13:44.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:13:44.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:13:44.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:13:44.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:13:44.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:13:29
2026-05-28T21:13:44.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70024, datetime.datetime(2026, 5, 28, 21, 13, 29), datetime.datetime(2026, 5, 28, 21, 13, 28), 'salt', 8.07, 67.42, None, 13.27, 145.84, 5.66, 831.94, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:13:44.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:13:44.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:13:44.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:28, diff=16.484307s, valid=True
2026-05-28T21:13:44.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:13:44.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:13:44.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:12, diff=32.487239s, valid=True
2026-05-28T21:13:44.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:13:44.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:13:44.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:26, diff=18.493862s, valid=True
2026-05-28T21:13:44.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:13:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:13:44.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:13:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:13:44.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:13:44.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:13:44.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:12, diff=32.49693s, valid=True
2026-05-28T21:13:44.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:13:44.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:13:44.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:13:44.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928266.497589s, valid=True
2026-05-28T21:13:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:13:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:13:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:13:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:13:44.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:13:44.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:13:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:13:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:13:44.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:13:44.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:13:44.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:13:44.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:13:44.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:13:44.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:13:45.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:13:45.469 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:13:45.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:13:45.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:13:45.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-28T21:13:45.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-28T21:13:45.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:13:45.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:14:15.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:14:15.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:14:15.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:14:15.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:14:15.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:14:16.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:14:16.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-28T21:14:16.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:14:16.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-28T21:14:16.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:14:16.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:14:16.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:14:16.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-28T21:14: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-28T21:14:18.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:14:18.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:14:18.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:14:18.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:14:18.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:14:18.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:14:18.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:14:18.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:14:18.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:14:18.476 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:14:18.476 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:14:18.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:14:18.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:14:18.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:14:18.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:14:18.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:14:18.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:14:18.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:14:18.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:14:18.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:14:18.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:14:18.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:14:18.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:14:18.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:13:59
2026-05-28T21:14:18.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70025, datetime.datetime(2026, 5, 28, 21, 13, 59), datetime.datetime(2026, 5, 28, 21, 13, 59), 'salt', 7.97, 67.39, None, 14.26, 140.72, 5.67, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:14:18.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:14:18.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:14:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:59, diff=19.793644s, valid=True
2026-05-28T21:14:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:14:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:14:18.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:12, diff=6.796559s, valid=True
2026-05-28T21:14:18.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:14:18.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:13:58, diff=20.803258s, valid=True
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:14:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:14:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:12, diff=6.806314s, valid=True
2026-05-28T21:14:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:14:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:14:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:14:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928300.806974s, valid=True
2026-05-28T21:14:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:14:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:14:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:14:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:14:18.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:14:18.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:14:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:14:18.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:14:18.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:14:18.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:14:19.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:14:19.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:14:19.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:14:19.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:14:19.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:14:19.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:14:19.813 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:14:19.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:14:19.813 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:14:19.813 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:14:19.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:14:19.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:14:49.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:14:49.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:14:49.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:14:50.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:14:50.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:14:50.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:14:50.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:14:50.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:14:50.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-28T21:14:50.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:14:50.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:14:50.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:14:50.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-28T21:14:52.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-28T21:14:52.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:14:52.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:14:52.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:14:52.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:14:52.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:14:52.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:14:52.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:14:52.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:14:52.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:14:52.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:14:52.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:14:52.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:14:52.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:14:52.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:14:52.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:14:52.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:14:52.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:14:52.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:14:53.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:14:53.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:14:53.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:14:53.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:14:53.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:14:53.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:14:29
2026-05-28T21:14:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70026, datetime.datetime(2026, 5, 28, 21, 14, 29), datetime.datetime(2026, 5, 28, 21, 14, 29), 'salt', 7.9, 67.52, None, 12.81, 147.11, 5.63, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:14:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:14:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:14:53.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:29, diff=24.100226s, valid=True
2026-05-28T21:14:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:14:53.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:14:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:12, diff=41.103108s, valid=True
2026-05-28T21:14:53.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:14:53.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:14:53.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:27, diff=26.10983s, valid=True
2026-05-28T21:14:53.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:14:53.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:14:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:14:53.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:14:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:14:53.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:14:53.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:12, diff=41.112891s, valid=True
2026-05-28T21:14:53.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:14:53.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:14:53.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:14:53.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928335.113549s, valid=True
2026-05-28T21:14:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:14:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:14:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:14:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:14:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:14:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:14:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:14:53.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:14:53.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:14:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:14:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:14:53.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:14:53.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:14:53.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:14:53.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:14:54.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:14:54.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:14:54.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:14:54.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-28T21:14:54.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-28T21:14:54.360 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:14:54.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:15:24.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:15:24.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:15:24.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:15:24.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:15:24.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:15:24.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:15:24.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-28T21:15:24.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:15:24.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-28T21:15:24.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:15:24.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:15:24.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:15:24.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-28T21:15:27.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-28T21:15:27.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:15:27.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:15:27.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:15:27.349 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:15:27.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:15:27.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:15:27.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:15:27.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:15:27.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:15:27.370 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:15:27.370 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:15:27.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:15:27.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:15:27.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:15:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:15:27.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:15:27.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:15:27.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:15:27.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:15:27.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:15:27.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:15:27.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:15:27.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:15:27.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:14:59
2026-05-28T21:15:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70027, datetime.datetime(2026, 5, 28, 21, 14, 59), datetime.datetime(2026, 5, 28, 21, 14, 59), 'salt', 7.97, 67.62, None, 13.41, 141.54, 5.62, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:15:27.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:15:27.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:15:27.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:59, diff=28.689378s, valid=True
2026-05-28T21:15:27.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:15:27.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:15:27.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:15:12, diff=15.692169s, valid=True
2026-05-28T21:15:27.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:15:27.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:14:57, diff=30.699s, valid=True
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:15:27.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:15:27.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:15:12, diff=15.70201s, valid=True
2026-05-28T21:15:27.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:15:27.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:15:27.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:15:27.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928369.702663s, valid=True
2026-05-28T21:15:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:15:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:15:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:15:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:15:27.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:15:27.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:15:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:15:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:15:27.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:15:27.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:15:27.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:15:27.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:15:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:15:28.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:15:28.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:15:28.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:15:28.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:15:28.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:15:28.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-28T21:15:28.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-28T21:15:28.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:15:28.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:15:58.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:15:58.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:15:58.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:15:59.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:15:59.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:15:59.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:15:59.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:15:59.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:15:59.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-28T21:15:59.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:15:59.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:15:59.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:15:59.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-28T21:16:01.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-28T21:16:01.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:16:01.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:16:01.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:16:01.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:16:01.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:16:01.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:16:01.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:16:01.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:16:01.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:16:01.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:16:01.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:16:01.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:16:01.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:16:01.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:16:01.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:16:01.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:16:02.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:16:02.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:16:02.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:16:02.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:16:02.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:16:02.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:16:02.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:16:02.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:16:00
2026-05-28T21:16:02.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70029, datetime.datetime(2026, 5, 28, 21, 16), datetime.datetime(2026, 5, 28, 21, 15, 59), 'salt', 7.77, 67.82, None, 16.97, 142.43, 5.57, 832.12, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:16:02.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:16:02.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:16:02.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:15:59, diff=3.13479s, valid=True
2026-05-28T21:16:02.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:16:02.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:16:02.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:12, diff=-9.86232s, valid=True
2026-05-28T21:16:02.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:16:02.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:15:57, diff=5.144383s, valid=True
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:16:02.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:16:02.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:12, diff=-9.852514s, valid=True
2026-05-28T21:16:02.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:16:02.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:16:02.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:16:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928404.148169s, valid=True
2026-05-28T21:16:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:16:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:16:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:16:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:16:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:16:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:16:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:16:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:16:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:16:02.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:16:02.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:16:02.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:16:02.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:16:02.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:16:02.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:16:03.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:16:03.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:16:03.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:16:03.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-28T21:16:03.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-28T21:16:03.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:16:03.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:16:33.453 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:16:33.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:16:33.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:16:33.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:16:33.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:16:33.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:16:33.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:16:33.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:16:33.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-28T21:16:33.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:16:33.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:16:33.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:16:33.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-28T21:16: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-28T21:16:36.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:16:36.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:16:36.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:16:36.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:16:36.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:16:36.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:16:36.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:16:36.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:16:36.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:16:36.214 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:16:36.214 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:16:36.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:16:36.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:16:36.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:16:36.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:16:36.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:16:36.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:16:36.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:16:36.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:16:36.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:16:36.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:16:36.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:16:36.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:16:36.520 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:16:30
2026-05-28T21:16:36.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70030, datetime.datetime(2026, 5, 28, 21, 16, 30), datetime.datetime(2026, 5, 28, 21, 16, 30), 'salt', 7.9, 67.69, None, 15.42, 145.86, 5.6, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:16:36.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:16:36.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:16:36.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:30, diff=6.526667s, valid=True
2026-05-28T21:16:36.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:16:36.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:16:36.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:12, diff=24.529456s, valid=True
2026-05-28T21:16:36.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:16:36.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:28, diff=8.536056s, valid=True
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:16:36.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:16:36.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:12, diff=24.53904s, valid=True
2026-05-28T21:16:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:16:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:16:36.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:16:36.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928438.539704s, valid=True
2026-05-28T21:16:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:16:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:16:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:16:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:16:36.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:16:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:16:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:16:36.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:16:36.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:16:36.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:16:36.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:16:36.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:16:36.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:16:36.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:16:37.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:16:37.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:16:37.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:16:37.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:16:37.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-28T21:16:37.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-28T21:16:37.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:16:37.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:17:07.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:17:07.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:17:07.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:17:08.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:17:08.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:17:08.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:17:08.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-28T21:17:08.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:17:08.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-28T21:17:08.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:17:08.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:17:08.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:17:08.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:17:10.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-28T21:17:10.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:17:10.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:17:10.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:17:10.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:17:10.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:17:10.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:17:10.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:17:10.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:17:10.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:17:10.796 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:17:10.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:17:10.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:17:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:17:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:17:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:17:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:17:11.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:17:11.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:17:11.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:17:11.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:17:11.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:17:11.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:17:11.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:17:11.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:17:00
2026-05-28T21:17:11.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70031, datetime.datetime(2026, 5, 28, 21, 17), datetime.datetime(2026, 5, 28, 21, 17), 'salt', 7.83, 67.59, None, 16.27, 144.43, 5.61, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:17:11.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:17:11.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:17:11.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:00, diff=11.112297s, valid=True
2026-05-28T21:17:11.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:17:11.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:17:11.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:12, diff=-0.884837s, valid=True
2026-05-28T21:17:11.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:17:11.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:17:11.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:16:58, diff=13.121731s, valid=True
2026-05-28T21:17:11.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:17:11.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:17:11.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:17:11.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:17:11.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:17:11.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:17:11.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:12, diff=-0.875245s, valid=True
2026-05-28T21:17:11.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:17:11.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:17:11.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:17:11.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928473.125406s, valid=True
2026-05-28T21:17:11.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:17:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:17:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:17:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:17:11.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:17:11.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:17:11.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:17:11.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:17:11.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:17:11.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:17:11.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:17:11.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:17:11.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:17:11.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:17:11.657 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:17:12.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:17:12.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:17:12.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:17:12.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-28T21:17:12.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-28T21:17:12.190 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:17:12.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:17:42.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:17:42.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:17:42.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:17:42.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:17:42.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:17:42.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:17:42.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-28T21:17:42.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:17:42.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-28T21:17:42.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:17:42.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:17:42.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:17:42.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-28T21:17:45.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-28T21:17:45.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:17:45.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:17:45.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:17:45.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:17:45.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:17:45.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:17:45.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:17:45.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:17:45.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:17:45.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:17:45.292 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:17:45.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:17:45.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:17:45.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:17:45.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:17:45.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:17:45.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:17:45.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:17:45.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:17:45.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:17:45.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:17:45.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:17:45.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:17:45.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:17:30
2026-05-28T21:17:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70032, datetime.datetime(2026, 5, 28, 21, 17, 30), datetime.datetime(2026, 5, 28, 21, 17, 30), 'salt', 7.8, 67.59, None, 16.41, 151.85, 5.61, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:17:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:17:45.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:17:45.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:30, diff=15.6122s, valid=True
2026-05-28T21:17:45.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:17:45.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:17:45.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:12, diff=33.615053s, valid=True
2026-05-28T21:17:45.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:17:45.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:17:45.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:29, diff=16.621634s, valid=True
2026-05-28T21:17:45.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:17:45.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:17:45.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:17:45.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:17:45.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:17:45.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:17:45.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:17:12, diff=33.624606s, valid=True
2026-05-28T21:17:45.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:17:45.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:17:45.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:17:45.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928507.625279s, valid=True
2026-05-28T21:17:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:17:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:17:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:17:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:17:45.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:17:45.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:17:45.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:17:45.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:17:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:17:45.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:17:45.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:17:45.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:17:45.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:17:45.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:17:46.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:17:46.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:17:46.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:17:46.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:17:46.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-28T21:17:46.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-28T21:17:46.817 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:17:46.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:18:16.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:18:16.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:18:16.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:18:16.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:18:16.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:18:17.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:18:17.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:18:17.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:18:17.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-28T21:18:17.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:18:17.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:18:17.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:18:17.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:18:19.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:18:19.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:18:19.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:18:19.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:18:19.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:18:19.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:18:19.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:18:19.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:18:19.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:18:19.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:18:19.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:18:19.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:18:19.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:18:19.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:18:19.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:18:19.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:18:19.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:18:19.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:18:19.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:18:19.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:18:19.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:18:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:18:19.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:18:19.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:18:19.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:18:01
2026-05-28T21:18:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70033, datetime.datetime(2026, 5, 28, 21, 18, 1), datetime.datetime(2026, 5, 28, 21, 18), 'salt', 7.87, 67.66, None, 15.6, 141.4, 5.61, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:18:19.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:18:19.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:18:20.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:00, diff=20.005931s, valid=True
2026-05-28T21:18:20.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:18:20.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:18:20.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:12, diff=8.008897s, valid=True
2026-05-28T21:18:20.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:18:20.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:18:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:00, diff=20.016745s, valid=True
2026-05-28T21:18:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:18:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:18:20.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:18:20.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:18:20.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:18:20.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:18:20.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:12, diff=8.019904s, valid=True
2026-05-28T21:18:20.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:18:20.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:18:20.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:18:20.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928542.02056s, valid=True
2026-05-28T21:18:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:18:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:18:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:18:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:18:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:18:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:18:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:18:20.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:18:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:18:20.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:18:20.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:18:20.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:18:20.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:18:20.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:18:20.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:18:20.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:18:21.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:18:21.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:18:21.031 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:18:21.031 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:18:21.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:18:21.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:18:51.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:18:51.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:18:51.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:18:51.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:18:51.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:18:51.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:18:51.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-28T21:18:51.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:18:51.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-28T21:18:51.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:18:51.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:18:51.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:18:51.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-28T21:18:54.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-28T21:18:54.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:18:54.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:18:54.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:18:54.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:18:54.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:18:54.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:18:54.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:18:54.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:18:54.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:18:54.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:18:54.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:18:54.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:18:54.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:18:54.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:18:54.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:18:54.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:18:54.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:18:54.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:18:54.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:18:54.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:18:54.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:18:54.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:18:54.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:18:54.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:18:31
2026-05-28T21:18:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70034, datetime.datetime(2026, 5, 28, 21, 18, 31), datetime.datetime(2026, 5, 28, 21, 18, 30), 'salt', 7.87, 67.56, None, 13.37, 159.57, 5.63, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:18:54.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:18:54.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:18:54.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:30, diff=24.553079s, valid=True
2026-05-28T21:18:54.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:18:54.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:18:54.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:12, diff=42.555929s, valid=True
2026-05-28T21:18:54.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:18:54.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:29, diff=25.562424s, valid=True
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:18:54.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:18:54.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:18:12, diff=42.565449s, valid=True
2026-05-28T21:18:54.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:18:54.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:18:54.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:18:54.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928576.566111s, valid=True
2026-05-28T21:18:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:18:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:18:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:18:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:18:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:18:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:18:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:18:54.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:18:54.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:18:54.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:18:54.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:18:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:18:54.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:18:54.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:18:55.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:18:55.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:18:55.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:18:55.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:18:55.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-28T21:18:55.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-28T21:18:55.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:18:55.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:19:25.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:19:25.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:19:25.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:19:26.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:19:26.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:19:26.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:19:26.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-28T21:19:26.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:19:26.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-28T21:19:26.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:19:26.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:19:26.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:19:26.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-28T21:19:28.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-28T21:19:28.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:19:28.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:19:28.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:19:28.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:19:28.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:19:28.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:19:28.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:19:28.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:19:28.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:19:28.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:19:28.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:19:28.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:19:29.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:19:29.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:19:29.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:19:29.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:19:29.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:19:29.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:19:29.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:19:29.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:19:29.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:19:29.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:19:29.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:19:29.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:19:01
2026-05-28T21:19:29.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70035, datetime.datetime(2026, 5, 28, 21, 19, 1), datetime.datetime(2026, 5, 28, 21, 19, 1), 'salt', 7.83, 67.52, None, 15.07, 147.13, 5.62, 831.76, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:19:29.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:19:29.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:19:29.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:19:01, diff=28.263463s, valid=True
2026-05-28T21:19:29.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:19:29.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:19:29.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:19:12, diff=17.266346s, valid=True
2026-05-28T21:19:29.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:19:29.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:19:00, diff=29.273137s, valid=True
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:19:29.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:19:29.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:19:12, diff=17.276193s, valid=True
2026-05-28T21:19:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:19:29.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:19:29.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:19:29.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928611.27685s, valid=True
2026-05-28T21:19:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:19:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:19:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:19:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:19:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:19:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:19:29.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:19:29.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:19:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:19:29.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:19:29.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:19:29.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:19:29.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:19:29.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:19:29.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:19:30.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:19:30.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:19:30.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:19:30.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-28T21:19:30.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-28T21:19:30.496 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:19:30.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:20:00.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:20:00.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:20:00.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:20:00.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:20:00.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:20:00.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:20:00.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-28T21:20:00.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:20:00.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-28T21:20:00.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:20:00.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:20:00.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:20:00.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-28T21:20:03.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-28T21:20:03.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:20:03.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:20:03.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:20:03.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:20:03.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:20:03.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:20:03.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:20:03.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:20:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:20:03.351 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:20:03.351 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:20:03.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:20:03.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:20:03.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:20:03.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:20:03.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:20:03.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:20:03.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:20:03.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:20:03.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:20:03.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:20:03.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:20:03.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:20:03.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:20:02
2026-05-28T21:20:03.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70037, datetime.datetime(2026, 5, 28, 21, 20, 2), datetime.datetime(2026, 5, 28, 21, 20, 1), 'salt', 7.87, 67.76, None, 16.02, 149.78, 5.58, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:20:03.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:20:03.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:20:03.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:01, diff=2.662579s, valid=True
2026-05-28T21:20:03.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:20:03.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:20:03.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=-8.33451s, valid=True
2026-05-28T21:20:03.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:20:03.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:00, diff=3.672226s, valid=True
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:20:03.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:20:03.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=-8.324708s, valid=True
2026-05-28T21:20:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:20:03.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:20:03.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:20:03.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928645.675964s, valid=True
2026-05-28T21:20:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:20:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:20:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:20:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:20:03.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:20:03.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:20:03.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:20:03.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:20:03.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:20:03.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:20:03.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:20:03.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:20:04.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:20:04.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:20:04.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:20:04.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:20:04.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:20:04.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:20:04.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-28T21:20:04.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-28T21:20:04.985 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:20:04.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:20:35.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:20:35.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:20:35.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:20:35.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:20:35.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:20:35.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:20: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-28T21:20:35.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:20:35.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-28T21:20:35.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:20:35.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:20:35.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:20:35.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-28T21:20:37.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-28T21:20:37.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:20:37.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:20:37.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:20:37.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:20:37.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:20:38.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:20:38.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:20:38.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:20:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:20:38.001 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:20:38.001 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:20:38.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:20:38.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:20:38.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:20:38.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:20:38.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:20:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:20:38.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:20:38.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:20:38.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:20:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:20:38.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:20:38.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:20:38.307 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:20:32
2026-05-28T21:20:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70038, datetime.datetime(2026, 5, 28, 21, 20, 32), datetime.datetime(2026, 5, 28, 21, 20, 32), 'salt', 7.83, 67.96, None, 13.59, 148.28, 5.53, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:20:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:20:38.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:20:38.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:32, diff=6.313643s, valid=True
2026-05-28T21:20:38.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:20:38.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:20:38.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=26.316435s, valid=True
2026-05-28T21:20:38.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:20:38.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:30, diff=8.323087s, valid=True
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:20:38.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:20:38.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=26.326071s, valid=True
2026-05-28T21:20:38.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:20:38.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:20:38.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:20:38.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928680.326731s, valid=True
2026-05-28T21:20:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:20:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:20:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:20:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:20:38.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:20:38.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:20:38.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:20:38.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:20:38.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:20:38.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:20:38.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:20:38.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:20:38.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:20:38.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:20:38.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:20:39.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:20:39.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:20:39.333 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:20:39.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-28T21:20:39.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-28T21:20:39.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:20:39.419 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:21:09.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:21:09.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:21:09.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:21:09.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:21:09.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:21:09.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:21:09.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-28T21:21:09.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:21: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-28T21:21:09.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:21:09.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:21:09.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:21:09.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-28T21:21:12.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-28T21:21:12.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:21:12.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:21:12.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:21:12.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:21:12.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:21:12.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:21:12.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:21:12.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:21:12.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:21:12.288 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:21:12.288 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:21:12.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:21:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:21:12.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:21:12.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:21:12.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:21:12.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:21:12.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:21:12.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:21:12.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:21:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:21:12.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:21:12.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:21:12.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:21:02
2026-05-28T21:21:12.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70039, datetime.datetime(2026, 5, 28, 21, 21, 2), datetime.datetime(2026, 5, 28, 21, 21, 2), 'salt', 7.83, 68.09, None, 16.48, 152.55, 5.51, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:21:12.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:21:12.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:21:12.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:21:02, diff=10.601784s, valid=True
2026-05-28T21:21:12.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:21:12.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:21:12.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=60.60456s, valid=True
2026-05-28T21:21:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:21:12.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:21:01, diff=11.611301s, valid=True
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:21:12.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:21:12.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=60.614322s, valid=True
2026-05-28T21:21:12.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:21:12.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:21:12.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:21:12.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928714.614998s, valid=True
2026-05-28T21:21:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:21:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:21:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:21:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:21:12.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:21:12.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:21:12.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:21:12.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:21:12.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:21:12.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:21:12.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:21:12.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:21:12.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:21:13.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:21:13.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:21:13.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:21:13.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:21:13.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:21:13.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-28T21:21:13.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-28T21:21:13.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:21:13.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:21:43.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:21:43.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:21:43.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:21:44.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:21:44.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:21:44.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:21:44.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-28T21:21:44.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:21:44.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-28T21:21:44.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:21:44.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:21:44.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:21:44.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-28T21:21: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-28T21:21:46.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:21:46.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:21:46.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:21:46.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:21:46.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:21:46.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:21:46.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:21:46.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:21:46.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:21:46.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:21:46.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:21:46.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:21:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:21:46.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:21:46.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:21:46.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:21:47.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:21:47.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:21:47.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:21:47.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:21:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:21:47.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:21:47.084 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:21:47.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:21:32
2026-05-28T21:21:47.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70040, datetime.datetime(2026, 5, 28, 21, 21, 32), datetime.datetime(2026, 5, 28, 21, 21, 32), 'salt', 7.93, 67.99, None, 13.76, 155.46, 5.53, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:21:47.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:21:47.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:21:47.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:21:32, diff=15.152895s, valid=True
2026-05-28T21:21:47.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:21:47.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:21:47.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=95.155865s, valid=True
2026-05-28T21:21:47.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:21:47.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:21:31, diff=16.16321s, valid=True
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:21:47.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:21:47.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=95.166388s, valid=True
2026-05-28T21:21:47.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:21:47.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:21:47.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:21:47.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928749.167167s, valid=True
2026-05-28T21:21:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:21:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:21:47.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:21:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:21:47.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:21:47.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:21:47.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:21:47.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:21:47.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:21:47.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:21:47.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:21:47.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:21:47.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:21:47.534 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:21:47.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:21:48.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:21:48.246 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:21:48.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:21: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-28T21:21: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-28T21:21:48.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:21:48.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:22:18.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:22:18.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:22:18.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:22:18.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:22:18.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:22:18.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:22:18.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-28T21:22:18.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:22:18.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:22:18.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:22:18.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:22:18.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:22:18.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-28T21:22:21.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:22:21.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:22:21.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:22:21.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:22:21.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:22:21.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:22:21.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:22:21.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:22:21.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:22:21.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:22:21.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:22:21.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:22:21.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:22:21.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:22:21.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:22:21.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:22:21.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:22:21.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:22:21.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:22:21.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:22:21.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:22:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:22:21.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:22:21.460 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:22:21.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:22:03
2026-05-28T21:22:21.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70041, datetime.datetime(2026, 5, 28, 21, 22, 3), datetime.datetime(2026, 5, 28, 21, 22, 2), 'salt', 7.9, 67.79, None, 14.61, 148.49, 5.58, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:22:21.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:22:21.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:22:21.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:22:02, diff=19.530086s, valid=True
2026-05-28T21:22:21.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:22:21.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:22:21.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=129.536693s, valid=True
2026-05-28T21:22:21.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:22:21.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:22:01, diff=20.549456s, valid=True
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:22:21.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:22:21.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:22:21.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=129.552655s, valid=True
2026-05-28T21:22:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:22:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:22:21.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:22:21.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928783.553327s, valid=True
2026-05-28T21:22:21.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:22:21.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:22:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:22:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:22:21.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:22:21.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:22:21.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:22:21.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:22:21.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:22:21.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:22:21.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:22:21.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:22:21.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:22:21.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:22:22.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:22:22.480 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:22:22.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:22:22.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:22:22.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-28T21:22:22.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-28T21:22:22.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:22:22.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:22:52.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:22:52.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:22:52.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:22:52.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:22:52.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:22:53.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:22:53.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-28T21:22:53.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:22: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-28T21:22:53.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:22:53.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:22:53.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:22:53.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-28T21:22:55.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-28T21:22:55.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:22:55.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:22:55.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:22:55.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:22:55.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:22:55.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:22:55.661 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:22:55.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:22:55.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:22:55.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:22:55.661 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:22:55.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:22:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:22:55.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:22:55.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:22:55.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:22:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:22:55.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:22:55.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:22:55.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:22:55.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:22:55.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:22:55.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:22:55.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:22:33
2026-05-28T21:22:55.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70042, datetime.datetime(2026, 5, 28, 21, 22, 33), datetime.datetime(2026, 5, 28, 21, 22, 32), 'salt', 7.97, 67.62, None, 12.92, 144.6, 5.62, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:22:55.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:22:55.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:22:55.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:22:32, diff=23.97824s, valid=True
2026-05-28T21:22:55.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:22:55.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:22:55.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=163.981086s, valid=True
2026-05-28T21:22:55.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:22:55.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:22:55.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:22:32, diff=23.987812s, valid=True
2026-05-28T21:22:55.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:22:55.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:22:55.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:22:55.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:22:55.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:22:55.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:22:55.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=163.990824s, valid=True
2026-05-28T21:22:55.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:22:55.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:22:55.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:22:55.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928817.99148s, valid=True
2026-05-28T21:22:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:22:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:22:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:22:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:22:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:22:56.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:22:56.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:22:56.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:22:56.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:22:56.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:22:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:22:56.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:22:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:22:56.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:22:56.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:22:56.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:22:57.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:22:57.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:22:57.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-28T21:22:57.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-28T21:22:57.462 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:22:57.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:23:27.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:23:27.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:23:27.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:23:27.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:23:27.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:23:27.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:23:27.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-28T21:23:27.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:23:27.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-28T21:23:27.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:23:27.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:23:28.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:23:28.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:23:30.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-28T21:23:30.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:23:30.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:23:30.420 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:23:30.420 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:23:30.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:23:30.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:23:30.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:23:30.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:23:30.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:23:30.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:23:30.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:23:30.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:23:30.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:23:30.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:23:30.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:23:30.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:23:30.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:23:30.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:23:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:23:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:23:30.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:23:30.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:23:30.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:23:30.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:23:03
2026-05-28T21:23:30.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70043, datetime.datetime(2026, 5, 28, 21, 23, 3), datetime.datetime(2026, 5, 28, 21, 23, 3), 'salt', 7.87, 67.49, None, 15.6, 144.27, 5.64, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:23:30.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:23:30.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:23:30.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:23:03, diff=27.780566s, valid=True
2026-05-28T21:23:30.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:23:30.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:23:30.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=198.783387s, valid=True
2026-05-28T21:23:30.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:23:30.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:23:30.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:23:02, diff=28.78996s, valid=True
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:23:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:23:30.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=198.792949s, valid=True
2026-05-28T21:23:30.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:23:30.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:23:30.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:23:30.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928852.793605s, valid=True
2026-05-28T21:23:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:23:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:23:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:23:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:23:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:23:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:23:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:23:30.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:23:30.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:23:30.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:23:30.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:23:31.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:23:31.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:23:31.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:23:31.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:23:31.678 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:23:31.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:23:31.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:23:31.780 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:23:31.780 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:23:31.928 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:23:31.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:24:01.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:24:01.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:24:01.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:24:02.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:24:02.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:24:02.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:24:02.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-28T21:24:02.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:24:02.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-28T21:24:02.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:24:02.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:24:02.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:24:02.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-28T21:24:05.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-28T21:24:05.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:24:05.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:24:05.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:24:05.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:24:05.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:24:05.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:24:05.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:24:05.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:24:05.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:24:05.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:24:05.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:24:05.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:24:05.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:24:05.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:24:05.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:24:05.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:24:05.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:24:05.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:24:05.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:24:05.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:24:05.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:24:05.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:24:05.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:24:05.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:24:03
2026-05-28T21:24:05.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70045, datetime.datetime(2026, 5, 28, 21, 24, 3), datetime.datetime(2026, 5, 28, 21, 24, 3), 'salt', 8.43, 67.42, None, 13.97, 147.65, 5.67, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:24:05.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:24:05.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:24:05.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:24:03, diff=2.468284s, valid=True
2026-05-28T21:24:05.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:24:05.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:24:05.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=233.471189s, valid=True
2026-05-28T21:24:05.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:24:05.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:24:05.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:24:03, diff=2.477832s, valid=True
2026-05-28T21:24:05.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:24:05.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:24:05.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:24:05.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:24:05.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:24:05.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:24:05.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=233.480872s, valid=True
2026-05-28T21:24:05.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:24:05.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:24:05.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:24:05.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928887.481544s, valid=True
2026-05-28T21:24:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:24:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:24:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:24:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:24:05.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:24:05.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:24:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:24:05.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:24:05.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:24:05.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:24:05.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:24:05.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:24:05.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:24:05.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:24:06.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:24:06.437 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:24:06.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:24:06.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:24:06.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-28T21:24:06.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-28T21:24:06.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:24:06.776 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:24:36.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:24:36.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:24:36.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:24:37.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:24:37.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:24:37.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:24:37.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-28T21:24:37.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:24:37.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-28T21:24:37.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:24:37.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:24:37.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:24:37.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-28T21:24:39.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-28T21:24:39.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:24:39.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:24:39.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:24:39.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:24:39.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:24:39.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:24:39.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:24:39.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:24:39.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:24:39.823 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:24:39.823 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:24:39.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:24:39.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:24:39.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:24:40.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:24:40.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:24:40.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:24:40.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:24:40.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:24:40.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:24:40.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:24:40.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:24:40.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:24:40.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:24:34
2026-05-28T21:24:40.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70046, datetime.datetime(2026, 5, 28, 21, 24, 34), datetime.datetime(2026, 5, 28, 21, 24, 33), 'salt', 7.83, 67.39, None, 14.64, 143.0, 5.65, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:24:40.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:24:40.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:24:40.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:24:33, diff=7.152291s, valid=True
2026-05-28T21:24:40.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:24:40.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:24:40.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=268.155237s, valid=True
2026-05-28T21:24:40.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:24:40.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:24:33, diff=7.162252s, valid=True
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:24:40.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:24:40.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=268.165689s, valid=True
2026-05-28T21:24:40.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:24:40.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:24:40.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:24:40.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928922.166362s, valid=True
2026-05-28T21:24:40.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:24:40.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:24:40.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:24:40.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:24:40.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:24:40.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:24:40.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:24:40.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:24:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:24:40.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:24:40.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:24:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:24:40.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:24:40.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:24:40.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:24:41.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:24:41.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:24:41.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:24:41.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:24:41.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:24:41.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:24:41.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:25:11.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:25:11.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:25:11.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:25:11.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:25:11.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:25:11.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:25:11.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-28T21:25:11.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:25:11.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-28T21:25:11.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:25:11.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:25:11.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:25:11.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-28T21:25:14.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-28T21:25:14.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:25:14.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:25:14.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:25:14.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:25:14.114 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:25:14.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:25:14.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:25:14.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:25:14.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:25:14.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:25:14.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:25:14.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:25:14.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:25:14.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:25:14.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:25:14.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:25:14.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:25:14.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:25:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T21:25:14.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:25:14.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:25:14.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:25:14.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:25:14.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:25:04
2026-05-28T21:25:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70047, datetime.datetime(2026, 5, 28, 21, 25, 4), datetime.datetime(2026, 5, 28, 21, 25, 3), 'salt', 7.93, 67.42, None, 15.1, 147.18, 5.65, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:25:14.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:25:14.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:25:14.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:25:03, diff=11.462234s, valid=True
2026-05-28T21:25:14.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:25:14.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:25:14.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=302.465103s, valid=True
2026-05-28T21:25:14.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:25:14.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:25:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:25:03, diff=11.471824s, valid=True
2026-05-28T21:25:14.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:25:14.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:25:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:25:14.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:25:14.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:25:14.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T21:25:14.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:20:12, diff=302.474832s, valid=True
2026-05-28T21:25:14.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:25:14.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:25:14.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:25:14.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928956.47549s, valid=True
2026-05-28T21:25:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:25:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:25:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:25:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:25:14.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:25:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:25:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:25:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:25:14.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:25:14.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:25:14.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:25:14.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:25:14.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:25:14.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:25:15.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:25:15.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:25:15.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:25:15.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:25:15.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:25:15.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:25:15.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:25:15.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:25:45.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:25:45.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:25:45.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:25:46.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:25:46.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:25:46.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:25:46.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-28T21:25:46.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:25:46.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-28T21:25:46.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:25:46.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:25:46.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:25:46.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-28T21:25:48.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:25:48.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:25:48.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:25:48.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:25:48.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:25:48.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:25:48.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:25:48.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:25:48.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:25:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:25:48.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:25:48.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:25:48.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:25:48.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:25:48.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:25:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:25:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:25:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:25:48.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:25:49.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:25:49.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:25:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:25:49.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:25:49.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:25:49.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:25:34
2026-05-28T21:25:49.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70048, datetime.datetime(2026, 5, 28, 21, 25, 34), datetime.datetime(2026, 5, 28, 21, 25, 34), 'salt', 7.9, 67.13, None, 13.34, 149.08, 5.71, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:25:49.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:25:49.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:25:49.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:25:34, diff=15.105796s, valid=True
2026-05-28T21:25:49.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:25:49.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:25:49.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:12, diff=-22.891428s, valid=True
2026-05-28T21:25:49.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:25:49.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:25:33, diff=16.115067s, valid=True
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:25:49.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:25:49.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:12, diff=-22.881962s, valid=True
2026-05-28T21:25:49.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:25:49.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:25:49.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:25:49.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=928991.118706s, valid=True
2026-05-28T21:25:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:25:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:25:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:25:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:25:49.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:25:49.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:25:49.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:25:49.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:25:49.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:25:49.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:25:49.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:25:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:25:49.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:25:49.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:25:49.653 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:25:50.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:25:50.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:25:50.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:25:50.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-28T21:25:50.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-28T21:25:50.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:25:50.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:26:20.343 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:26:20.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:26:20.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:26:20.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:26:20.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:26:20.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:26:20.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-28T21:26:20.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:26:20.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-28T21:26:20.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:26:20.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:26:20.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:26:20.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-28T21:26:23.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-28T21:26:23.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:26:23.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:26:23.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:26:23.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:26:23.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:26:23.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:26:23.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:26:23.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:26:23.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:26:23.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:26:23.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:26:23.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:26:23.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:26:23.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:26:23.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:26:23.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:26:23.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:26:23.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:26:23.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:26:23.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:26:23.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:26:23.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:26:23.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:26:23.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:26:04
2026-05-28T21:26:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70049, datetime.datetime(2026, 5, 28, 21, 26, 4), datetime.datetime(2026, 5, 28, 21, 26, 4), 'salt', 7.87, 66.99, None, 13.97, 147.27, 5.74, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:26:23.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:26:23.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:26:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:04, diff=19.511307s, valid=True
2026-05-28T21:26:23.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:26:23.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:26:23.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:12, diff=11.51422s, valid=True
2026-05-28T21:26:23.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:26:23.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:03, diff=20.521021s, valid=True
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:26:23.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:26:23.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:12, diff=11.524088s, valid=True
2026-05-28T21:26:23.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:26:23.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:26:23.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:26:23.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929025.524758s, valid=True
2026-05-28T21:26:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:26:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:26:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:26:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:26:23.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:26:23.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:26:23.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:26:23.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:26:23.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:26:23.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:26:23.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:26:23.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:26:23.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:26:23.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:26:24.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:26:24.508 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:26:24.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:26:24.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:26:24.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-28T21:26:24.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-28T21:26:24.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:26:24.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:26:54.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:26:54.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:26:54.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:26:55.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:26:55.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:26:55.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:26:55.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:26:55.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:26:55.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-28T21:26:55.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:26:55.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:26:55.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:26:55.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:26:58.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-28T21:26:58.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:26:58.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:26:58.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:26:58.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:26:58.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:26:58.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:26:58.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:26:58.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:26:58.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:26:58.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:26:58.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:26:58.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:26:58.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:26:58.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:26:58.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:26:58.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:26:58.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:26:58.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:26:58.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:26:58.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:26:58.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:26:58.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:26:58.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:26:58.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:26:35
2026-05-28T21:26:58.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70050, datetime.datetime(2026, 5, 28, 21, 26, 35), datetime.datetime(2026, 5, 28, 21, 26, 34), 'salt', 7.87, 66.89, None, 13.23, 143.85, 5.76, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:26:58.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:26:58.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:26:58.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:34, diff=24.659129s, valid=True
2026-05-28T21:26:58.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:26:58.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:26:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:12, diff=-13.337988s, valid=True
2026-05-28T21:26:58.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:26:58.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:26:34, diff=24.668603s, valid=True
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:26:58.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:26:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:26:58.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:12, diff=-13.328348s, valid=True
2026-05-28T21:26:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:26:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:26:58.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:26:58.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929060.672321s, valid=True
2026-05-28T21:26:58.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:26:58.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:26:58.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:26:58.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:26:58.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:26:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:26:58.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:26:58.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:26:58.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:26:58.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:26:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:26:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:26:58.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:26:58.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:26:59.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:26:59.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:26:59.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:26:59.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:26:59.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-28T21:26:59.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-28T21:26:59.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:26:59.741 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:27:29.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:27:29.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:27:29.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:27:29.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:27:29.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:27:30.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:27:30.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-28T21:27:30.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:27:30.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-28T21:27:30.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:27:30.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:27:30.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:27:30.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-28T21:27:33.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-28T21:27:33.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:27:33.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:27:33.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:27:33.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:27:33.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:27:33.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:27:33.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:27:33.212 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:27:33.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:27:33.212 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:27:33.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:27:33.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:27:33.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:27:33.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:27:33.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:27:33.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:27:33.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:27:33.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:27:33.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:27:33.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:27:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:27:33.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:27:33.564 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:27:33.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:27:05
2026-05-28T21:27:33.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70051, datetime.datetime(2026, 5, 28, 21, 27, 5), datetime.datetime(2026, 5, 28, 21, 27, 4), 'salt', 7.9, 66.86, None, 13.8, 144.43, 5.77, 832.06, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:27:33.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:27:33.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:27:33.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:04, diff=29.63202s, valid=True
2026-05-28T21:27:33.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:27:33.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:27:33.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:12, diff=21.634896s, valid=True
2026-05-28T21:27:33.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:27:33.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:04, diff=29.641509s, valid=True
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:27:33.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:27:33.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:27:12, diff=21.644546s, valid=True
2026-05-28T21:27:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:27:33.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:27:33.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:27:33.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929095.6452s, valid=True
2026-05-28T21:27:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:27:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:27:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:27:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:27:33.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:27:33.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:27:33.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:27:33.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:27:33.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:27:33.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:27:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:27:33.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:27:33.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:27:33.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:27:34.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:27:34.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:27:34.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:27:34.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:27:34.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-28T21:27:34.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-28T21:27:34.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:27:34.939 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:28:04.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:28:04.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:28:04.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:28:05.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:28:05.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:28:05.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:28:05.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-28T21:28:05.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:28:05.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-28T21:28:05.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:28:05.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:28:05.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:28:05.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-28T21:28:08.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-28T21:28:08.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:28:08.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:28:08.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:28:08.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:28:08.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:28:08.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:28:08.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:28:08.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:28:08.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:28:08.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:28:08.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:28:08.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:28:08.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:28:08.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:28:08.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:28:08.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:28:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:28:08.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:28:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:28:08.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:28:08.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:28:08.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:28:08.491 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:28:08.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:28:05
2026-05-28T21:28:08.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70053, datetime.datetime(2026, 5, 28, 21, 28, 5), datetime.datetime(2026, 5, 28, 21, 28, 5), 'salt', 7.93, 66.63, None, 13.76, 147.18, 5.82, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:28:08.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:28:08.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:28:08.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:05, diff=3.553699s, valid=True
2026-05-28T21:28:08.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:28:08.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:28:08.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:12, diff=-3.443422s, valid=True
2026-05-28T21:28:08.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:28:08.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:04, diff=4.563161s, valid=True
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:28:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:28:08.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:12, diff=-3.433766s, valid=True
2026-05-28T21:28:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:28:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:28:08.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:28:08.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929130.566996s, valid=True
2026-05-28T21:28:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:28:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:28:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:28:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:28:08.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:28:08.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:28:08.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:28:08.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:28:08.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:28:08.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:28:08.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:28:08.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:28:08.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:28:08.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:28:09.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:28:09.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:28:09.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:28:09.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:28:09.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-28T21:28:09.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-28T21:28:09.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:28:09.916 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:28:39.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:28:39.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:28:39.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:28:40.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:28:40.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:28:40.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:28:40.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-28T21:28:40.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:28:40.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-28T21:28:40.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:28:40.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:28:40.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:28:40.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-28T21:28:43.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:28:43.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:28:43.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:28:43.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:28:43.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:28:43.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:28:43.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:28:43.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:28:43.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:28:43.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:28:43.600 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:28:43.600 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:28:43.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:28:43.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:28:43.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:28:43.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:28:43.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:28:43.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:28:43.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:28:43.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:28:43.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:28:43.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:28:43.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:28:43.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:28:43.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:28:35
2026-05-28T21:28:43.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70054, datetime.datetime(2026, 5, 28, 21, 28, 35), datetime.datetime(2026, 5, 28, 21, 28, 35), 'salt', 7.87, 66.43, None, 15.24, 148.23, 5.86, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:28:43.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:28:43.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:28:43.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:35, diff=8.920659s, valid=True
2026-05-28T21:28:43.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:28:43.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:28:43.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:12, diff=-28.076452s, valid=True
2026-05-28T21:28:43.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:28:43.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:28:35, diff=8.930181s, valid=True
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:28:43.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:28:43.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:12, diff=-28.066767s, valid=True
2026-05-28T21:28:43.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:28:43.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:28:43.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:28:43.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929165.9339s, valid=True
2026-05-28T21:28:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:28:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:28:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:28:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:28:43.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:28:43.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:28:43.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:28:43.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:28:44.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:28:44.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:28:44.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:28:44.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:28:44.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:28:44.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:28:44.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:28:44.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:28:44.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:28:44.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:28:44.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-28T21:28:44.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-28T21:28:45.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:28:45.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:29:15.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:29:15.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:29:15.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:29:15.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:29:15.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:29:15.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:29:15.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-28T21:29:15.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:29:15.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-28T21:29:15.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:29:15.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:29:15.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:29:15.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-28T21:29:18.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-28T21:29:18.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:29:18.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:29:18.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:29:18.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:29:18.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:29:18.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:29:18.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:29:18.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:29:18.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:29:18.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:29:18.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:29:18.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:29:18.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:29:18.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:29:18.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:29:18.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:29:18.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:29:18.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:29:18.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:29:18.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:29:18.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:29:18.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:29:18.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:29:18.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:29:06
2026-05-28T21:29:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70055, datetime.datetime(2026, 5, 28, 21, 29, 6), datetime.datetime(2026, 5, 28, 21, 29, 5), 'salt', 7.93, 66.13, None, 12.85, 142.27, 5.92, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:29:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:29:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:29:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:05, diff=13.806634s, valid=True
2026-05-28T21:29:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:29:18.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:29:18.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:12, diff=6.809501s, valid=True
2026-05-28T21:29:18.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:29:18.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:05, diff=13.816067s, valid=True
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:29:18.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:29:18.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:12, diff=6.819082s, valid=True
2026-05-28T21:29:18.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:29:18.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:29:18.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:29:18.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929200.819742s, valid=True
2026-05-28T21:29:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:29:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:29:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:29:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:29:18.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:29:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:29:18.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:29:18.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:29:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:29:18.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:29:19.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:29:19.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:29:19.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:29:19.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:29:19.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:29:19.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:29:19.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:29:19.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:29:19.891 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:29:19.891 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:29:20.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:29:20.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:29:50.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:29:50.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:29:50.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:29:50.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:29:50.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:29:50.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:29:50.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-28T21:29:50.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:29:50.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-28T21:29:50.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:29:50.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:29:50.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:29:50.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-28T21:29:52.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-28T21:29:52.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:29:52.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:29:52.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:29:52.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:29:52.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:29:52.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:29:52.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:29:52.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:29:52.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:29:52.917 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:29:52.917 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:29:52.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:29:53.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:29:53.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:29:53.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:29:53.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:29:53.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:29:53.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:29:53.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:29:53.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:29:53.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:29:53.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:29:53.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:29:53.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:29:36
2026-05-28T21:29:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70056, datetime.datetime(2026, 5, 28, 21, 29, 36), datetime.datetime(2026, 5, 28, 21, 29, 36), 'salt', 7.97, 65.63, None, 13.23, 147.77, 6.04, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:29:53.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:29:53.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:29:53.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:36, diff=17.25443s, valid=True
2026-05-28T21:29:53.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:29:53.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:29:53.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:12, diff=-18.74274s, valid=True
2026-05-28T21:29:53.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:29:53.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:29:53.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:29:35, diff=18.263755s, valid=True
2026-05-28T21:29:53.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:29:53.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:29:53.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:29:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:29:53.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:29:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:29:53.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:12, diff=-18.733233s, valid=True
2026-05-28T21:29:53.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:29:53.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:29:53.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:29:53.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929235.267412s, valid=True
2026-05-28T21:29:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:29:53.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:29:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:29:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:29:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:29:53.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:29:53.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:29:53.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:29:53.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:29:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:29:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:29:53.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:29:53.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:29:53.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:29:53.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:29:54.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:29:54.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:29:54.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:29:54.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-28T21:29:54.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-28T21:29:54.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:29:54.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:30:24.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:30:24.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:30:24.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:30:24.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:30:24.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:30:25.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:30:25.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:30:25.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:30:25.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-28T21:30:25.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:30:25.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:30:25.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:30:25.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-28T21:30:27.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-28T21:30:27.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:30:27.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:30:27.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:30:27.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:30:27.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:30:27.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:30:27.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:30:27.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:30:27.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:30:27.738 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:30:27.738 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:30:27.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:30:27.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:30:27.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:30:27.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:30:27.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:30:27.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:30:27.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:30:27.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:30:27.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:30:27.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:30:27.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:30:27.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:30:28.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:30:08
2026-05-28T21:30:28.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70057, datetime.datetime(2026, 5, 28, 21, 30, 8), datetime.datetime(2026, 5, 28, 21, 30, 7), 'salt', 7.93, 65.37, None, 14.64, 142.88, 6.08, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:30:28.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:30:28.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:30:28.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:07, diff=21.055585s, valid=True
2026-05-28T21:30:28.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:30:28.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:30:28.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:12, diff=16.058442s, valid=True
2026-05-28T21:30:28.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:30:28.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:05, diff=23.065131s, valid=True
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:30:28.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:30:28.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:12, diff=16.068173s, valid=True
2026-05-28T21:30:28.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:30:28.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:30:28.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:30:28.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929270.068844s, valid=True
2026-05-28T21:30:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:30:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:30:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:30:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:30:28.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:30:28.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:30:28.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:30:28.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:30:28.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:30:28.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:30:28.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:30:28.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:30:28.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:30:28.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:30:28.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:30:29.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:30:29.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:30:29.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:30:29.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-28T21:30:29.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-28T21:30:29.210 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:30:29.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:30:59.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:30:59.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:30:59.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:30:59.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:30:59.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:30:59.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:30:59.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-28T21:30:59.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:30:59.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-28T21:30:59.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:30:59.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:30:59.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:30:59.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:31:02.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-28T21:31:02.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:31:02.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:31:02.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:31:02.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:31:02.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:31:02.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:31:02.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:31:02.094 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:31:02.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:31:02.094 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:31:02.094 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:31:02.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:31:02.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:31:02.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:31:02.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:31:02.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:31:02.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:31:02.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:31:02.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:31:02.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:31:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:31:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:31:02.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:31:02.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:30:38
2026-05-28T21:31:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70058, datetime.datetime(2026, 5, 28, 21, 30, 38), datetime.datetime(2026, 5, 28, 21, 30, 38), 'salt', 7.97, 65.53, None, 12.42, 138.19, 6.06, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:31:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:31:02.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:31:02.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:38, diff=24.414232s, valid=True
2026-05-28T21:31:02.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:31:02.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:31:02.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:12, diff=-9.582893s, valid=True
2026-05-28T21:31:02.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:31:02.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:31:02.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:30:36, diff=26.423719s, valid=True
2026-05-28T21:31:02.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:31:02.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:31:02.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:31:02.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:31:02.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:31:02.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:31:02.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:12, diff=-9.573301s, valid=True
2026-05-28T21:31:02.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:31:02.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:31:02.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:31:02.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929304.427343s, valid=True
2026-05-28T21:31:02.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:31:02.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:31:02.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:31:02.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:31:02.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:31:02.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:31:02.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:31:02.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:31:02.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:31:02.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:31:02.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:31:02.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:31:02.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:31:02.754 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:31:02.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:31:03.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:31:03.426 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:31:03.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:31:03.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-28T21:31:03.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-28T21:31:03.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:31:03.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:31:33.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:31:33.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:31:33.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:31:34.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:31:34.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:31:34.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:31:34.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-28T21:31:34.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:31:34.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-28T21:31:34.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:31:34.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:31:34.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:31:34.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-28T21:31:36.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-28T21:31:36.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:31:36.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:31:36.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:31:36.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:31:36.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:31:36.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:31:36.732 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:31:36.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:31:36.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:31:36.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:31:36.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:31:36.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:31:36.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:31:36.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:31:36.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:31:36.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:31:36.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:31:36.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:31:36.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:31:36.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:31:36.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:31:36.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:31:36.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:31:37.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:31:08
2026-05-28T21:31:37.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70059, datetime.datetime(2026, 5, 28, 21, 31, 8), datetime.datetime(2026, 5, 28, 21, 31, 8), 'salt', 7.9, 65.67, None, 13.55, 147.46, 6.02, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:31:37.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:31:37.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:31:37.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:08, diff=29.066559s, valid=True
2026-05-28T21:31:37.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:31:37.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:31:37.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:12, diff=25.069424s, valid=True
2026-05-28T21:31:37.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:31:37.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:06, diff=31.076179s, valid=True
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:31:37.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:31:37.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:31:12, diff=25.079189s, valid=True
2026-05-28T21:31:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:31:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:31:37.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:31:37.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929339.079855s, valid=True
2026-05-28T21:31:37.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:31:37.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:31:37.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:31:37.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:31:37.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:31:37.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:31:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:31:37.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:31:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:31:37.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:31:37.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:31:37.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:31:37.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:31:37.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:31:37.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:31:38.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:31:38.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:31:38.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:31:38.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-28T21:31:38.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-28T21:31:38.264 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:31:38.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:32:08.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:32:08.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:32:08.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:32:08.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:32:08.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:32:09.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:32:09.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-28T21:32:09.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:32:09.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-28T21:32:09.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:32:09.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:32:09.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:32:09.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-28T21:32:11.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-28T21:32:11.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:32:11.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:32:11.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:32:11.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:32:11.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:32:11.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:32:11.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:32:11.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:32:11.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:32:11.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:32:11.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:32:11.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:32:11.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:32:11.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:32:11.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:32:11.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:32:11.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:32:11.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:32:11.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:32:11.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:32:11.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:32:11.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:32:11.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:32:11.998 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:32:09
2026-05-28T21:32:11.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70061, datetime.datetime(2026, 5, 28, 21, 32, 9), datetime.datetime(2026, 5, 28, 21, 32, 8), 'salt', 7.77, 65.96, None, 13.83, 145.21, 5.95, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:32:11.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:32:11.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:32:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:08, diff=4.004439s, valid=True
2026-05-28T21:32:12.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:32:12.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:32:12.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:12, diff=0.007861s, valid=True
2026-05-28T21:32:12.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:32:12.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:32:12.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:06, diff=6.014807s, valid=True
2026-05-28T21:32:12.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:32:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:32:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:32:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:32:12.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:32:12.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:32:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:12, diff=0.018043s, valid=True
2026-05-28T21:32:12.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:32:12.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:32:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:32:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929374.018698s, valid=True
2026-05-28T21:32:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:32:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:32:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:32:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:32:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:32:12.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:32:12.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:32:12.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:32:12.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:32:12.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:32:12.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:32:12.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:32:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:32:12.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:32:12.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:32:12.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:32:13.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:32:13.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:32:13.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-28T21:32:13.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-28T21:32:13.228 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:32:13.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:32:43.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:32:43.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:32:43.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:32:43.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:32:43.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:32:43.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:32:43.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-28T21:32:43.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:32:43.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:32:43.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:32:43.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:32:43.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:32:43.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-28T21:32:46.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-28T21:32:46.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:32:46.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:32:46.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:32:46.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:32:46.307 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:32:46.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:32:46.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:32:46.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:32:46.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:32:46.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:32:46.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:32:46.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:32:46.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:32:46.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:32:46.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:32:46.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:32:46.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:32:46.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:32:46.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:32:46.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:32:46.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:32:46.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:32:46.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:32:46.709 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:32:39
2026-05-28T21:32:46.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70062, datetime.datetime(2026, 5, 28, 21, 32, 39), datetime.datetime(2026, 5, 28, 21, 32, 38), 'salt', 7.7, 65.96, None, 13.73, 142.46, 5.95, 832.07, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:32:46.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:32:46.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:32:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:38, diff=8.715721s, valid=True
2026-05-28T21:32:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:32:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:32:46.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:12, diff=-25.28141s, valid=True
2026-05-28T21:32:46.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:32:46.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:32:37, diff=9.725331s, valid=True
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:32:46.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:32:46.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:12, diff=-25.271614s, valid=True
2026-05-28T21:32:46.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:32:46.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:32:46.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:32:46.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929408.729051s, valid=True
2026-05-28T21:32:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:32:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:32:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:32:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:32:46.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:32:46.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:32:46.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:32:46.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:32:46.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:32:46.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:32:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:32:46.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:32:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:32:47.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:32:47.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:32:47.645 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:32:47.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:32:47.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:32:47.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-28T21:32:47.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-28T21:32:47.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:32:47.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:33:17.859 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:33:17.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:33:17.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:33:18.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:33:18.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:33:18.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:33:18.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-28T21:33:18.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:33:18.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:33:18.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:33:18.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:33:18.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:33:18.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:33:20.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-28T21:33:20.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:33:20.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:33:20.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:33:20.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:33:20.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:33:20.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:33:20.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:33:20.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:33:20.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:33:20.963 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:33:20.963 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:33:20.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:33:21.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:33:21.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:33:21.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:33:21.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:33:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:33:21.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:33:21.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:33:21.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:33:21.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:33:21.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:33:21.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:33:21.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:33:09
2026-05-28T21:33:21.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70063, datetime.datetime(2026, 5, 28, 21, 33, 9), datetime.datetime(2026, 5, 28, 21, 33, 9), 'salt', 7.8, 66.33, None, 13.66, 138.24, 5.88, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:33:21.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:33:21.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:33:21.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:09, diff=12.279713s, valid=True
2026-05-28T21:33:21.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:33:21.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:33:21.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:12, diff=9.282565s, valid=True
2026-05-28T21:33:21.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:33:21.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:07, diff=14.28922s, valid=True
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:33:21.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:33:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:12, diff=9.292275s, valid=True
2026-05-28T21:33:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:33:21.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:33:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:33:21.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929443.292953s, valid=True
2026-05-28T21:33:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:33:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:33:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:33:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:33:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:33:21.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:33:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:33:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:33:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:33:21.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:33:21.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:33:21.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:33:21.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:33:21.615 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:33:21.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:33:22.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:33:22.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:33:22.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:33:22.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-28T21:33:22.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-28T21:33:22.424 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:33:22.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:33:52.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:33:52.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:33:52.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:33:52.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:33:52.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:33:52.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:33:52.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-28T21:33:52.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:33:52.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-28T21:33:52.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:33:52.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:33:52.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:33:52.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-28T21:33:55.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-28T21:33:55.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:33:55.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:33:55.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:33:55.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:33:55.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:33:55.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:33:55.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:33:55.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:33:55.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:33:55.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:33:55.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:33:55.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:33:55.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:33:55.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:33:55.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:33:55.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:33:55.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:33:55.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:33:55.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:33:55.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:33:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:33:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:33:55.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:33:55.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:33:39
2026-05-28T21:33:55.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70064, datetime.datetime(2026, 5, 28, 21, 33, 39), datetime.datetime(2026, 5, 28, 21, 33, 39), 'salt', 7.77, 66.5, None, 13.8, 142.02, 5.84, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:33:55.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:33:55.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:33:55.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:39, diff=16.794299s, valid=True
2026-05-28T21:33:55.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:33:55.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:33:55.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:12, diff=-16.202856s, valid=True
2026-05-28T21:33:55.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:33:55.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:33:55.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:33:38, diff=17.803798s, valid=True
2026-05-28T21:33:55.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:33:55.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:33:55.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:33:55.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:33:55.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:33:55.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:33:55.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:12, diff=-16.19321s, valid=True
2026-05-28T21:33:55.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:33:55.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:33:55.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:33:55.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929477.807439s, valid=True
2026-05-28T21:33:55.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:33:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:33:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:33:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:33:55.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:33:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:33:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:33:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:33:55.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:33:55.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:33:56.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:33:56.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:33:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:33:56.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:33:56.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:33:56.723 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:33:56.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:33:56.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:33:56.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-28T21:33: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-28T21:33:58.931 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:33:58.931 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:34:28.936 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:34:28.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:34:28.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:34:29.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:34:29.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:34:29.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:34:29.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-28T21:34:29.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:34:29.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-28T21:34:29.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:34:29.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:34:29.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:34:29.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-28T21:34:32.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:34:32.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:34:32.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:34:32.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:34:32.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:34:32.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:34:32.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:34:32.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:34:32.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:34:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:34:32.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:34:32.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:34:32.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:34:32.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:34:32.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:34:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:34:32.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:34:32.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:34:32.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:34:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:34:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:34:32.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:34:32.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:34:32.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:34:32.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:34:09
2026-05-28T21:34:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70065, datetime.datetime(2026, 5, 28, 21, 34, 9), datetime.datetime(2026, 5, 28, 21, 34, 9), 'salt', 7.7, 66.73, None, 14.43, 141.15, 5.79, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:34:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:34:32.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:34:32.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:09, diff=23.530201s, valid=True
2026-05-28T21:34:32.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:34:32.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:34:32.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:12, diff=20.533043s, valid=True
2026-05-28T21:34:32.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:34:32.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:08, diff=24.539554s, valid=True
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:34:32.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:34:32.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:34:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:12, diff=20.542587s, valid=True
2026-05-28T21:34:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:34:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:34:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:34:32.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929514.543261s, valid=True
2026-05-28T21:34:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:34:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:34:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:34:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:34:32.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:34:32.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:34:32.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:34:32.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:34:32.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:34:32.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:34:32.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:34:32.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:34:32.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:34:32.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:34:33.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:34:33.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:34:33.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:34:33.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:34:33.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-28T21:34:33.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-28T21:34:33.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:34:33.801 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:35:03.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:35:03.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:35:03.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:35:04.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:35:04.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:35:04.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:35:04.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-28T21:35:04.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:35:04.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-28T21:35:04.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:35:04.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:35:04.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:35:04.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-28T21:35:06.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-28T21:35:06.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:35:06.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:35:06.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:35:06.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:35:06.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:35:06.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:35:06.896 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:35:06.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:35:06.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:35:06.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:35:06.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:35:06.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:35:06.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:35:06.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:35:07.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:35:07.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:35:07.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:35:07.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:35:07.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:35:07.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:35:07.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:35:07.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:35:07.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:35:07.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:34:42
2026-05-28T21:35:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70066, datetime.datetime(2026, 5, 28, 21, 34, 42), datetime.datetime(2026, 5, 28, 21, 34, 39), 'salt', 7.64, 66.89, None, 13.55, 141.43, 5.76, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:35:07.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:35:07.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:35:07.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:39, diff=28.217291s, valid=True
2026-05-28T21:35:07.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:35:07.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:35:07.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:12, diff=-4.779825s, valid=True
2026-05-28T21:35:07.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:35:07.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:35:07.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:34:38, diff=29.226795s, valid=True
2026-05-28T21:35:07.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:35:07.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:35:07.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:35:07.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:35:07.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:35:07.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:35:07.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:12, diff=-4.770179s, valid=True
2026-05-28T21:35:07.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:35:07.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:35:07.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:35:07.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929549.23048s, valid=True
2026-05-28T21:35:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:35:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:35:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:35:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:35:07.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:35:07.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:35:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:35:07.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:35:07.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:35:07.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:35:07.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:35:07.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:35:07.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:35:07.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:35:07.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:35:08.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:35:08.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:35:08.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:35:08.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-28T21:35:08.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-28T21:35:08.306 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:35:08.306 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:35:38.336 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:35:38.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:35:38.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:35:38.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:35:38.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:35:39.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:35:39.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-28T21:35:39.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:35:39.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-28T21:35:39.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:35:39.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:35:39.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:35:39.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-28T21:35:41.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:35:41.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:35:41.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:35:41.492 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:35:41.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:35:41.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:35:41.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:35:41.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:35:41.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:35:41.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:35:41.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:35:41.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:35:41.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:35:41.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:35:41.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:35:41.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:35:41.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:35:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:35:41.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:35:41.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:35:41.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:35:41.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:35:41.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:35:41.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:35:41.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:35:12
2026-05-28T21:35:41.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70067, datetime.datetime(2026, 5, 28, 21, 35, 12), datetime.datetime(2026, 5, 28, 21, 35, 12), 'salt', 7.54, 67.36, None, 13.45, 144.51, 5.65, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:35:41.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:35:41.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:35:41.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:12, diff=29.828072s, valid=True
2026-05-28T21:35:41.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:35:41.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:35:41.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:12, diff=29.831014s, valid=True
2026-05-28T21:35:41.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:35:41.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:35:41.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:08, diff=33.837704s, valid=True
2026-05-28T21:35:41.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:35:41.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:35:41.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:35:41.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:35:41.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:35:41.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:35:41.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:35:12, diff=29.840769s, valid=True
2026-05-28T21:35:41.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:35:41.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:35:41.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:35:41.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929583.841428s, valid=True
2026-05-28T21:35:41.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:35:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:35:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:35:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:35:41.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:35:41.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:35:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:35:41.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:35:41.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:35:41.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:35:42.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:35:42.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:35:42.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:35:42.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:35:42.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:35:42.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:35:42.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:35:42.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:35:42.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-28T21:35:42.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-28T21:35:43.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:35:43.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:36:13.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:36:13.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:36:13.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:36:13.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:36:13.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:36:13.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:36:13.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-28T21:36:13.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:36:13.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-28T21:36:13.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:36:13.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:36:13.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:36:13.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-28T21:36:15.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-28T21:36:15.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:36:15.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:36:15.924 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:36:15.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:36:15.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:36:15.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:36:15.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:36:15.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:36:15.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:36:15.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:36:15.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:36:15.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:36:16.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:36:16.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:36:16.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:36:16.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:36:16.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:36:16.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:36:16.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:36:16.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:36:16.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:36:16.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:36:16.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:36:16.253 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:36:13
2026-05-28T21:36:16.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70069, datetime.datetime(2026, 5, 28, 21, 36, 13), datetime.datetime(2026, 5, 28, 21, 36, 12), 'salt', 7.47, 68.06, None, 12.92, 141.15, 5.5, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:36:16.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:36:16.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:36:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:12, diff=4.259763s, valid=True
2026-05-28T21:36:16.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:36:16.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:36:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:12, diff=4.262607s, valid=True
2026-05-28T21:36:16.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:36:16.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:10, diff=6.269379s, valid=True
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:36:16.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:36:16.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:12, diff=4.272384s, valid=True
2026-05-28T21:36:16.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:36:16.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:36:16.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:36:16.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929618.273045s, valid=True
2026-05-28T21:36:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:36:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:36:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:36:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:36:16.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:36:16.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:36:16.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:36:16.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:36:16.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:36:16.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:36:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:36:16.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:36:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:36:16.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:36:16.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:36:17.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:36:17.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:36:17.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:36:17.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-28T21:36:17.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-28T21:36:17.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:36:17.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:36:47.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:36:47.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:36:47.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:36:47.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:36:47.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:36:47.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:36:47.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-28T21:36:47.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:36:47.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-28T21:36:47.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:36:47.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:36:47.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:36:47.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-28T21:36:50.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-28T21:36:50.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:36:50.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:36:50.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:36:50.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:36:50.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:36:50.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:36:50.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:36:50.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:36:50.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:36:50.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:36:50.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:36:50.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:36:50.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:36:50.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:36:50.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:36:50.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:36:50.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:36:50.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:36:50.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:36:50.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:36:50.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:36:50.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:36:50.906 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:36:50.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:36:43
2026-05-28T21:36:50.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70070, datetime.datetime(2026, 5, 28, 21, 36, 43), datetime.datetime(2026, 5, 28, 21, 36, 43), 'salt', 7.4, 68.09, None, 13.55, 141.55, 5.49, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:36:50.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:36:50.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:36:50.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:43, diff=7.969968s, valid=True
2026-05-28T21:36:50.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:36:50.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:36:50.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:12, diff=-21.027216s, valid=True
2026-05-28T21:36:50.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:36:50.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:36:42, diff=8.979302s, valid=True
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:36:50.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:36:50.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:12, diff=-21.017624s, valid=True
2026-05-28T21:36:50.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:36:50.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:36:50.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:36:50.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929652.983044s, valid=True
2026-05-28T21:36:50.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:36:50.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:36:50.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:36:50.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:36:50.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:36:51.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:36:51.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:36:51.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:36:51.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:36:51.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:36:51.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:36:51.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:36:51.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:36:51.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:36:51.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:36:51.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:36:52.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:36:52.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:36:52.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-28T21:36:52.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-28T21:36:52.098 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:36:52.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:37:22.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:37:22.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:37:22.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:37:22.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:37:22.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:37:22.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:37:22.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-28T21:37:22.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:37:22.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-28T21:37:22.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:37:22.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:37:22.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:37:22.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-28T21:37:25.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-28T21:37:25.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:37:25.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:37:25.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:37:25.126 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:37:25.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:37:25.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:37:25.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:37:25.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:37:25.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:37:25.147 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:37:25.147 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:37:25.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:37:25.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:37:25.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:37:25.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:37:25.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:37:25.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:37:25.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:37:25.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:37:25.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:37:25.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:37:25.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:37:25.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:37:25.459 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:37:13
2026-05-28T21:37:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70071, datetime.datetime(2026, 5, 28, 21, 37, 13), datetime.datetime(2026, 5, 28, 21, 37, 13), 'salt', 7.24, 68.42, None, 14.33, 145.98, 5.42, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:37:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:37:25.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:37:25.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:13, diff=12.465368s, valid=True
2026-05-28T21:37:25.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:37:25.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:37:25.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:12, diff=13.468183s, valid=True
2026-05-28T21:37:25.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:37:25.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:37:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:13, diff=12.474797s, valid=True
2026-05-28T21:37:25.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:37:25.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:37:25.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:37:25.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:37:25.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:37:25.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:37:25.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:12, diff=13.477773s, valid=True
2026-05-28T21:37:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:37:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:37:25.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:37:25.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929687.478415s, valid=True
2026-05-28T21:37:25.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:37:25.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:37:25.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:37:25.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:37:25.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:37:25.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:37:25.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:37:25.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:37:25.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:37:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:37:25.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:37:25.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:37:25.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:37:25.808 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:37:26.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:37:26.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:37:26.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:37:26.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:37:26.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-28T21:37:26.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-28T21:37:26.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:37:26.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:37:56.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:37:56.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:37:56.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:37:56.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:37:56.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:37:57.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:37:57.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-28T21:37:57.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:37:57.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:37:57.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:37:57.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:37:57.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:37:57.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:37:59.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-28T21:37:59.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:37:59.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:37:59.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:37:59.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:37:59.778 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:37:59.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:37:59.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:37:59.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:37:59.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:37:59.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:37:59.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:37:59.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:37:59.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:37:59.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:37:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:37:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:38:00.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:38:00.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:38:00.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:38:00.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:38:00.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:38:00.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:38:00.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:38:00.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:37:44
2026-05-28T21:38:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70072, datetime.datetime(2026, 5, 28, 21, 37, 44), datetime.datetime(2026, 5, 28, 21, 37, 43), 'salt', 7.37, 68.52, None, 12.46, 136.59, 5.4, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:38:00.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:38:00.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:38:00.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:43, diff=17.12046s, valid=True
2026-05-28T21:38:00.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:38:00.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:38:00.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:12, diff=-11.876562s, valid=True
2026-05-28T21:38:00.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:38:00.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:37:40, diff=20.130262s, valid=True
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:38:00.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:38:00.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:12, diff=-11.866566s, valid=True
2026-05-28T21:38:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:38:00.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:38:00.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:38:00.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929722.134146s, valid=True
2026-05-28T21:38:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:38:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:38:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:38:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:38:00.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:38:00.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:38:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:38:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:38:00.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:38:00.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:38:00.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:38:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:38:00.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:38:00.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:38:00.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:38:01.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:38:01.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:38:01.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:38:01.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-28T21:38:01.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-28T21:38:01.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:38:01.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:38:31.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:38:31.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:38:31.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:38:32.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:38:32.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:38:32.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:38: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-28T21:38:32.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:38:32.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-28T21:38:32.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:38:32.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:38:32.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:38:32.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-28T21:38:35.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:38:35.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:38:35.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:38:35.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:38:35.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:38:35.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:38:35.151 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:38:35.151 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:38:35.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:38:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:38:35.152 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:38:35.152 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:38:35.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:38:35.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:38:35.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:38:35.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:38:35.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:38:35.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:38:35.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:38:35.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:38:35.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:38:35.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:38:35.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:38:35.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:38:35.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:38:14
2026-05-28T21:38:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70073, datetime.datetime(2026, 5, 28, 21, 38, 14), datetime.datetime(2026, 5, 28, 21, 38, 14), 'salt', 7.24, 68.32, None, 13.09, 141.19, 5.44, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:38:35.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:38:35.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:38:35.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:14, diff=21.475296s, valid=True
2026-05-28T21:38:35.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:38:35.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:38:35.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:12, diff=23.478134s, valid=True
2026-05-28T21:38:35.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:38:35.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:38:35.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:11, diff=24.484866s, valid=True
2026-05-28T21:38:35.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:38:35.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:38:35.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:38:35.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:38:35.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:38:35.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:38:35.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:12, diff=23.487889s, valid=True
2026-05-28T21:38:35.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:38:35.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:38:35.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:38:35.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929757.488543s, valid=True
2026-05-28T21:38:35.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:38:35.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:38:35.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:38:35.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:38:35.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:38:35.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:38:35.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:38:35.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:38:35.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:38:35.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:38:35.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:38:35.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:38:35.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:38:35.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:38:36.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:38:36.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:38:36.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:38:36.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:38:36.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:38:36.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:38:36.728 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:38:36.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:39:06.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:39:06.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:39:06.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:39:06.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:39:06.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:39:07.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:39:07.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-28T21:39:07.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:39:07.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-28T21:39:07.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:39:07.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:39:07.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:39:07.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-28T21:39:09.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-28T21:39:09.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:39:09.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:39:09.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:39:09.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:39:09.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:39:09.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:39:09.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:39:09.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:39:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:39:09.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:39:09.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:39:09.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:39:09.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:39:09.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:39:10.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:39:10.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:39:10.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:39:10.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:39:10.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:39:10.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:39:10.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:39:10.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:39:10.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:39:10.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:38:44
2026-05-28T21:39:10.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70074, datetime.datetime(2026, 5, 28, 21, 38, 44), datetime.datetime(2026, 5, 28, 21, 38, 44), 'salt', 7.37, 68.32, None, 12.7, 151.31, 5.44, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:39:10.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:39:10.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:39:10.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:44, diff=26.182309s, valid=True
2026-05-28T21:39:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:39:10.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:39:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:39:12, diff=-1.814833s, valid=True
2026-05-28T21:39:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:39:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:39:10.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:38:41, diff=29.191747s, valid=True
2026-05-28T21:39:10.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:39:10.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:39:10.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:39:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:39:10.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:39:10.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:39:10.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:39:12, diff=-1.805225s, valid=True
2026-05-28T21:39:10.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:39:10.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:39:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:39:10.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929792.19544s, valid=True
2026-05-28T21:39:10.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:39:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:39:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:39:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:39:10.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:39:10.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:39:10.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:39:10.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:39:10.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:39:10.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:39:10.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:39:10.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:39:10.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:39:10.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:39:10.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:39:11.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:39:11.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:39:11.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:39:11.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:39:11.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:39:11.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:39:11.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:39:41.421 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:39:41.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:39:41.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:39:41.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:39:41.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:39:42.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:39:42.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-28T21:39:42.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:39:42.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-28T21:39:42.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:39:42.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:39:42.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:39:42.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-28T21:39:44.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-28T21:39:44.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:39:44.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:39:44.827 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:39:44.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:39:44.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:39:44.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:39:44.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:39:44.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:39:44.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:39:44.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:39:44.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:39:44.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:39:44.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:39:44.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:39:45.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:39:45.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:39:45.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:39:45.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:39:45.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:39:45.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:39:45.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:39:45.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:39:45.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:39:45.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:39:45
2026-05-28T21:39:45.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70076, datetime.datetime(2026, 5, 28, 21, 39, 45), datetime.datetime(2026, 5, 28, 21, 39, 44), 'salt', 7.31, 68.26, None, 13.3, 136.83, 5.46, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:39:45.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:39:45.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:39:45.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:39:44, diff=1.167942s, valid=True
2026-05-28T21:39:45.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:39:45.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:39:45.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:12, diff=-26.829154s, valid=True
2026-05-28T21:39:45.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:39:45.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:39:41, diff=4.177511s, valid=True
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:39:45.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:39:45.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:12, diff=-26.819389s, valid=True
2026-05-28T21:39:45.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:39:45.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:39:45.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:39:45.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929827.18127s, valid=True
2026-05-28T21:39:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:39:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:39:45.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:39:45.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:39:45.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:39:45.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:39:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:39:45.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:39:45.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:39:45.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:39:45.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:39:45.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:39:45.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:39:45.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:39:45.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:39:46.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:39:46.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:39:46.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:39:46.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-28T21:39:46.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-28T21:39:46.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:39:46.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:40:16.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:40:16.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:40:16.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:40:16.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:40:16.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:40:16.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:40:16.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-28T21:40:16.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:40:16.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-28T21:40:16.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:40:16.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:40:16.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:40:16.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-28T21:40:19.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-28T21:40:19.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:40:19.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:40:19.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:40:19.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:40:19.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:40:19.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:40:19.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:40:19.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:40:19.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:40:19.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:40:19.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:40:19.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:40:19.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:40:19.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:40:19.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:40:19.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:40:19.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:40:19.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:40:19.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:40:19.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:40:19.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:40:19.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:40:19.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:40:19.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:40:15
2026-05-28T21:40:19.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70077, datetime.datetime(2026, 5, 28, 21, 40, 15), datetime.datetime(2026, 5, 28, 21, 40, 14), 'salt', 7.27, 68.19, None, 12.85, 136.48, 5.47, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:40:19.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:40:19.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:40:19.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:14, diff=5.845765s, valid=True
2026-05-28T21:40:19.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:40:19.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:40:19.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:12, diff=7.849252s, valid=True
2026-05-28T21:40:19.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:40:19.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:40:19.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:12, diff=7.85661s, valid=True
2026-05-28T21:40:19.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:40:19.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:40:19.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:40:19.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:40:19.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:40:19.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:40:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:12, diff=7.859744s, valid=True
2026-05-28T21:40:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:40:19.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:40:19.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:40:19.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929861.860396s, valid=True
2026-05-28T21:40:19.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:40:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:40:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:40:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:40:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:40:19.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:40:19.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:40:19.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:40:19.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:40:20.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:40:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:40:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:40:20.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:40:20.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:40:20.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:40:20.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:40:20.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:40:20.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:40:20.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-28T21:40:20.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-28T21:40:20.955 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:40:20.955 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:40:50.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:40:50.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:40:50.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:40:51.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:40:51.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:40:51.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:40:51.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-28T21:40:51.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:40:51.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:40:51.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:40:51.550 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:40:51.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:40: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-28T21:40:54.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-28T21:40:54.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:40:54.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:40:54.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:40:54.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:40:54.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:40:54.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:40:54.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:40:54.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:40:54.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:40:54.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:40:54.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:40:54.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:40:54.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:40:54.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:40:54.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:40:54.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:40:54.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:40:54.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:40:54.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:40:54.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:40:54.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:40:54.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:40:54.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:40:54.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:40:45
2026-05-28T21:40:54.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70078, datetime.datetime(2026, 5, 28, 21, 40, 45), datetime.datetime(2026, 5, 28, 21, 40, 45), 'salt', 7.31, 68.19, None, 12.53, 139.34, 5.47, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:40:54.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:40:54.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:40:54.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:45, diff=9.938597s, valid=True
2026-05-28T21:40:54.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:40:54.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:40:54.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:12, diff=-17.058572s, valid=True
2026-05-28T21:40:54.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:40:54.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:40:43, diff=11.948044s, valid=True
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:40:54.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:40:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:12, diff=-17.04893s, valid=True
2026-05-28T21:40:54.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:40:54.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:40:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:40:54.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929896.951733s, valid=True
2026-05-28T21:40:54.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:40:54.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:40:54.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:40:54.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:40:54.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:40:55.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:40:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:40:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:40:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:40:55.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:40:55.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:40:55.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:40:55.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:40:55.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:40:55.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:40:55.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:40:55.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:40:55.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:40:55.993 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:40:55.993 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:40:56.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:40:56.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:41:26.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:41:26.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:41:26.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:41:26.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:41:26.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:41:26.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:41:26.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-28T21:41:26.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:41:26.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-28T21:41:26.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:41:26.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:41:26.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:41:26.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-28T21:41:29.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-28T21:41:29.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:41:29.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:41:29.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:41:29.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:41:29.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:41:29.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:41:29.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:41:29.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:41:29.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:41:29.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:41:29.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:41:29.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:41:29.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:41:29.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:41:29.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:41:29.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:41:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:41:29.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:41:29.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:41:29.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:41:29.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:41:29.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:41:29.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:41:29.511 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:41:15
2026-05-28T21:41:29.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70079, datetime.datetime(2026, 5, 28, 21, 41, 15), datetime.datetime(2026, 5, 28, 21, 41, 15), 'salt', 7.27, 68.19, None, 12.25, 137.51, 5.47, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:41:29.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:41:29.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:41:29.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:15, diff=14.519179s, valid=True
2026-05-28T21:41:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:41:29.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:41:29.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:12, diff=17.522057s, valid=True
2026-05-28T21:41:29.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:41:29.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:15, diff=14.529399s, valid=True
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:41:29.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:41:29.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:12, diff=17.532473s, valid=True
2026-05-28T21:41:29.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:41:29.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:41:29.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:41:29.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929931.533181s, valid=True
2026-05-28T21:41:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:41:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:41:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:41:29.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:41:29.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:41:29.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:41:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:41:29.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:41:29.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:41:29.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:41:29.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:41:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:41:29.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:41:29.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:41:30.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:41:30.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:41:30.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:41:30.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:41:30.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-28T21:41:30.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-28T21:41:30.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:41:30.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:42:00.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:42:00.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:42:00.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:42:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:42:00.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:42:01.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:42:01.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-28T21:42:01.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:42:01.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-28T21:42:01.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:42:01.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:42:01.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:42:01.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:42:04.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:42:04.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:42:04.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:42:04.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:42:04.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:42:04.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:42:04.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:42:04.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:42:04.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:42:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:42:04.050 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:42:04.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:42:04.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:42:04.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:42:04.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:42:04.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:42:04.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:42:04.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:42:04.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:42:04.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:42:04.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:42:04.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:42:04.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:42:04.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:42:04.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:41:45
2026-05-28T21:42:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70080, datetime.datetime(2026, 5, 28, 21, 41, 45), datetime.datetime(2026, 5, 28, 21, 41, 45), 'salt', 7.21, 68.19, None, 13.41, 136.74, 5.47, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:42:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:42:04.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:42:04.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:45, diff=19.364253s, valid=True
2026-05-28T21:42:04.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:42:04.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:42:04.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:12, diff=-7.632958s, valid=True
2026-05-28T21:42:04.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:42:04.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:41:42, diff=22.373548s, valid=True
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:42:04.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:42:04.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:42:04.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:12, diff=-7.62346s, valid=True
2026-05-28T21:42:04.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:42:04.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:42:04.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:42:04.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=929966.377206s, valid=True
2026-05-28T21:42:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:42:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:42:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:42:04.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:42:04.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:42:04.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:42:04.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:42:04.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:42:04.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:42:04.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:42:04.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:42:04.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:42:04.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:42:04.696 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:42:04.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:42:05.312 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:42:05.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:42:05.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:42:05.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-28T21:42:05.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-28T21:42:05.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:42:05.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:42:35.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:42:35.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:42:35.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:42:36.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:42:36.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:42:36.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:42:36.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-28T21:42:36.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:42:36.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-28T21:42:36.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:42:36.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:42:36.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:42:36.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-28T21:42:38.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-28T21:42:38.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:42:38.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:42:38.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:42:38.789 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:42:38.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:42:38.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:42:38.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:42:38.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:42:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:42:38.813 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:42:38.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:42:38.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:42:38.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:42:38.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:42:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:42:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:42:39.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:42:39.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:42:39.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:42:39.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:42:39.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:42:39.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:42:39.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:42:39.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:42:16
2026-05-28T21:42:39.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70081, datetime.datetime(2026, 5, 28, 21, 42, 16), datetime.datetime(2026, 5, 28, 21, 42, 15), 'salt', 7.07, 68.26, None, 13.45, 134.74, 5.44, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:42:39.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:42:39.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:42:39.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:15, diff=24.138554s, valid=True
2026-05-28T21:42:39.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:42:39.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:42:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:12, diff=27.141395s, valid=True
2026-05-28T21:42:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:42:39.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:13, diff=26.148052s, valid=True
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:42:39.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:42:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:12, diff=27.151057s, valid=True
2026-05-28T21:42:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:42:39.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:42:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:42:39.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930001.151721s, valid=True
2026-05-28T21:42:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:42:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:42:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:42:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:42:39.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:42:39.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:42:39.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:42:39.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:42:39.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:42:39.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:42:39.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:42:39.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:42:39.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:42:39.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:42:39.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:42:40.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:42:40.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:42:40.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:42:40.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-28T21:42:40.152 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:42:40.335 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:42:40.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:43:10.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:43:10.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:43:10.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:43:10.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:43:10.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:43:10.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:43:10.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-28T21:43:10.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:43:10.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-28T21:43:10.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:43:10.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:43:10.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:43:10.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-28T21:43:13.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-28T21:43:13.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:43:13.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:43:13.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:43:13.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:43:13.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:43:13.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:43:13.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:43:13.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:43:13.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:43:13.383 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:43:13.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:43:13.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:43:13.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:43:13.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:43:13.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:43:13.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:43:13.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:43:13.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:43:13.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:43:13.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:43:13.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:43:13.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:43:13.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:43:13.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:42:46
2026-05-28T21:43:13.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70082, datetime.datetime(2026, 5, 28, 21, 42, 46), datetime.datetime(2026, 5, 28, 21, 42, 45), 'salt', 7.14, 68.59, None, 13.52, 137.32, 5.38, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:43:13.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:43:13.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:43:13.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:45, diff=28.711003s, valid=True
2026-05-28T21:43:13.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:43:13.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:43:13.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:43:12, diff=1.713841s, valid=True
2026-05-28T21:43:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:43:13.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:42:43, diff=30.720286s, valid=True
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:43:13.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:43:13.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:43:12, diff=1.723321s, valid=True
2026-05-28T21:43:13.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:43:13.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:43:13.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:43:13.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930035.723974s, valid=True
2026-05-28T21:43:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:43:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:43:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:43:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:43:13.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:43:13.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:43:13.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:43:13.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:43:13.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:43:13.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:43:13.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:43:14.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:43:14.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:43:14.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:43:14.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:43:14.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:43:14.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:43:14.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:43:14.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-28T21:43:14.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-28T21:43:14.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:43:14.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:43:44.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:43:44.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:43:44.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:43:44.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:43:44.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:43:45.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:43: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-28T21:43:45.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:43:45.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-28T21:43:45.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:43:45.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:43:45.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:43:45.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-28T21:43:47.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-28T21:43:47.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:43:47.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:43:47.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:43:47.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:43:47.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:43:47.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:43:47.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:43:47.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:43:47.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:43:47.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:43:47.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:43:47.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:43:47.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:43:47.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:43:47.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:43:47.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:43:47.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:43:47.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:43:47.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:43:47.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:43:47.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:43:47.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:43:47.915 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:43:47.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:43:46
2026-05-28T21:43:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70084, datetime.datetime(2026, 5, 28, 21, 43, 46), datetime.datetime(2026, 5, 28, 21, 43, 46), 'salt', 7.11, 68.85, None, 12.88, 133.0, 5.33, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:43:47.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:43:47.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:43:47.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:43:46, diff=1.981638s, valid=True
2026-05-28T21:43:47.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:43:47.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:43:47.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:12, diff=-24.015505s, valid=True
2026-05-28T21:43:47.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:43:47.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:43:43, diff=4.991218s, valid=True
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:43:47.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:43:47.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:12, diff=-24.005742s, valid=True
2026-05-28T21:43:47.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:43:47.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:43:47.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:43:47.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930069.994965s, valid=True
2026-05-28T21:43:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:43:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:43:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:43:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:43:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:43:48.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:43:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:43:48.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:43:48.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:43:48.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:43:48.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:43:48.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:43:48.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:43:48.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:43:48.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:43:48.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:43:48.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:43:48.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:43:48.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-28T21:43:48.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-28T21:43:49.061 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:43:49.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:44:19.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:44:19.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:44:19.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:44:19.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:44:19.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:44:19.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:44:19.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-28T21:44:19.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:44:19.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-28T21:44:19.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:44:19.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:44:19.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:44:19.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-28T21:44: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-28T21:44:21.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:44:21.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:44:21.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:44:21.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:44:21.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:44:21.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:44:21.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:44:21.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:44:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:44:21.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:44:21.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:44:21.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:44:22.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:44:22.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:44:22.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:44:22.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:44:22.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:44:22.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:44:22.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:44:22.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:44:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:44:22.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:44:22.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:44:22.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:44:17
2026-05-28T21:44:22.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70085, datetime.datetime(2026, 5, 28, 21, 44, 17), datetime.datetime(2026, 5, 28, 21, 44, 16), 'salt', 6.97, 68.82, None, 12.39, 134.36, 5.32, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:44:22.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:44:22.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:44:22.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:16, diff=6.308751s, valid=True
2026-05-28T21:44:22.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:44:22.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:44:22.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:12, diff=10.311605s, valid=True
2026-05-28T21:44:22.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:44:22.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:14, diff=8.318235s, valid=True
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:44:22.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:44:22.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:12, diff=10.321266s, valid=True
2026-05-28T21:44:22.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:44:22.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:44:22.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:44:22.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930104.321924s, valid=True
2026-05-28T21:44:22.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:44:22.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:44:22.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:44:22.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:44:22.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:44:22.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:44:22.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:44:22.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:44:22.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:44:22.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:44:22.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:44:22.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:44:22.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:44:22.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:44:22.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:44:23.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:44:23.276 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:44:23.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:44:23.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-28T21:44:23.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-28T21:44:23.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:44:23.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:44:53.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:44:53.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:44:53.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:44:53.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:44:53.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:44:53.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:44:53.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-28T21:44:53.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:44:53.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-28T21:44:53.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:44:53.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:44:53.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:44:53.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-28T21:44:56.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-28T21:44:56.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:44:56.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:44:56.404 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:44:56.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:44:56.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:44:56.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:44:56.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:44:56.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:44:56.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:44:56.425 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:44:56.425 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:44:56.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:44:56.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:44:56.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:44:56.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:44:56.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:44:56.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:44:56.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:44:56.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:44:56.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:44:56.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:44:56.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:44:56.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:44:56.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:44:47
2026-05-28T21:44:56.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70086, datetime.datetime(2026, 5, 28, 21, 44, 47), datetime.datetime(2026, 5, 28, 21, 44, 46), 'salt', 7.07, 69.15, None, 11.43, 138.83, 5.26, 832.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:44:56.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:44:56.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:44:56.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:46, diff=10.753402s, valid=True
2026-05-28T21:44:56.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:44:56.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:44:56.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:12, diff=-15.243729s, valid=True
2026-05-28T21:44:56.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:44:56.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:44:56.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:44:45, diff=11.762859s, valid=True
2026-05-28T21:44:56.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:44:56.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:44:56.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:44:56.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:44:56.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:44:56.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:44:56.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:12, diff=-15.234095s, valid=True
2026-05-28T21:44:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:44:56.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:44:56.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:44:56.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930138.766566s, valid=True
2026-05-28T21:44:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:44:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:44:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:44:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:44:56.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:44:56.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:44:56.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:44:56.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:44:56.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:44:56.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:44:56.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:44:57.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:44:57.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:44:57.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:44:57.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:44:57.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:44:57.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:44:57.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:44:57.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-28T21:44:57.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-28T21:44:57.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:44:57.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:45:27.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:45:27.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:45:27.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:45:28.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:45:28.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:45:28.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:45:28.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-28T21:45:28.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:45:28.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-28T21:45:28.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:45:28.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:45:28.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:45:28.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-28T21:45:31.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-28T21:45:31.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:45:31.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:45:31.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:45:31.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:45:31.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:45:31.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:45:31.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:45:31.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:45:31.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:45:31.077 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:45:31.077 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:45:31.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:45:31.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:45:31.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:45:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:45:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:45:31.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:45:31.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:45:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:45:31.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:45:31.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:45:31.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:45:31.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:45:31.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:45:17
2026-05-28T21:45:31.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70087, datetime.datetime(2026, 5, 28, 21, 45, 17), datetime.datetime(2026, 5, 28, 21, 45, 17), 'salt', 7.01, 69.22, None, 12.28, 135.61, 5.25, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:45:31.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:45:31.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:45:31.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:17, diff=14.408159s, valid=True
2026-05-28T21:45:31.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:45:31.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:45:31.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:12, diff=19.410995s, valid=True
2026-05-28T21:45:31.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:45:31.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:45:31.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:17, diff=14.417642s, valid=True
2026-05-28T21:45:31.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:45:31.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:45:31.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:45:31.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:45:31.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:45:31.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:45:31.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:12, diff=19.420695s, valid=True
2026-05-28T21:45:31.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:45:31.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:45:31.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:45:31.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930173.421355s, valid=True
2026-05-28T21:45:31.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:45:31.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:45:31.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:45:31.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:45:31.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:45:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:45:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:45:31.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:45:31.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:45:31.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:45:31.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:45:31.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:45:31.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:45:31.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:45:31.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:45:32.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:45:32.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:45:32.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:45:32.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-28T21:45:32.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-28T21:45:32.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:45:32.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:46:02.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:46:02.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:46:02.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:46:03.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:46:03.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:46:03.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:46:03.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-28T21:46:03.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:46:03.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-28T21:46:03.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:46:03.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:46:03.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:46:03.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-28T21:46:05.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-28T21:46:05.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:46:05.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:46:05.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:46:05.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:46:05.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:46:05.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:46:05.552 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:46:05.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:46:05.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:46:05.553 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:46:05.553 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:46:05.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:46:05.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:46:05.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:46:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:46:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:46:05.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:46:05.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:46:05.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:46:05.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:46:05.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:46:05.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:46:05.821 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:46:05.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:45:47
2026-05-28T21:46:05.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70088, datetime.datetime(2026, 5, 28, 21, 45, 47), datetime.datetime(2026, 5, 28, 21, 45, 47), 'salt', 6.97, 69.28, None, 12.92, 137.02, 5.23, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:46:05.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:46:05.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:46:05.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:47, diff=18.888086s, valid=True
2026-05-28T21:46:05.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:46:05.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:46:05.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:12, diff=-6.109024s, valid=True
2026-05-28T21:46:05.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:46:05.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:45:44, diff=21.897591s, valid=True
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:46:05.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:46:05.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:46:05.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:12, diff=-6.099297s, valid=True
2026-05-28T21:46:05.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:46:05.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:46:05.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:46:05.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930207.901358s, valid=True
2026-05-28T21:46:05.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:46:05.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:46:05.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:46:05.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:46:05.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:46:05.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:46:05.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:46:05.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:46:05.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:46:06.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:46:06.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:46:06.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:46:06.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:46:06.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:46:06.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:46:06.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:46:06.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:46:06.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:46:06.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-28T21:46:06.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-28T21:46:07.218 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:46:07.218 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:46:37.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:46:37.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:46:37.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:46:37.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:46:37.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:46:37.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:46:37.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-28T21:46:37.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:46:37.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-28T21:46:37.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:46:37.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:46:37.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:46:37.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:46:40.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-28T21:46:40.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:46:40.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:46:40.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:46:40.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:46:40.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:46:40.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:46:40.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:46:40.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:46:40.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:46:40.419 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:46:40.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:46:40.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:46:40.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:46:40.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:46:40.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:46:40.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:46:40.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:46:40.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:46:40.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:46:40.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:46:40.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:46:40.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:46:40.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:46:40.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:46:17
2026-05-28T21:46:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70089, datetime.datetime(2026, 5, 28, 21, 46, 17), datetime.datetime(2026, 5, 28, 21, 46, 17), 'salt', 6.87, 69.32, None, 13.3, 139.62, 5.22, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:46:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:46:40.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:46:40.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:17, diff=23.732912s, valid=True
2026-05-28T21:46:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:46:40.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:46:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:12, diff=28.735722s, valid=True
2026-05-28T21:46:40.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:46:40.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:15, diff=25.742109s, valid=True
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:46:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:46:40.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:12, diff=28.745096s, valid=True
2026-05-28T21:46:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:46:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:46:40.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:46:40.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930242.745754s, valid=True
2026-05-28T21:46:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:46:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:46:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:46:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:46:40.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:46:40.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:46:40.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:46:40.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:46:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:46:40.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:46:40.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:46:40.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:46:41.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:46:41.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:46:41.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:46:41.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:46:41.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:46:41.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:46:41.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-28T21:46:41.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-28T21:46:41.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:46:41.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:47:11.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:47:11.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:47:11.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:47:12.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:47:12.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:47:12.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:47:12.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-28T21:47:12.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:47:12.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-28T21:47:12.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:47:12.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:47:12.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:47:12.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-28T21:47:14.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-28T21:47:14.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:47:14.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:47:14.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:47:14.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:47:14.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:47:14.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:47:14.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:47:14.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:47:14.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:47:14.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:47:14.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:47:14.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:47:15.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:47:15.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:47:15.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:47:15.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:47:15.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:47:15.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:47:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:47:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:47:15.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:47:15.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:47:15.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:47:15.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:46:48
2026-05-28T21:47:15.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70090, datetime.datetime(2026, 5, 28, 21, 46, 48), datetime.datetime(2026, 5, 28, 21, 46, 47), 'salt', 6.97, 69.62, None, 13.45, 137.96, 5.16, 832.13, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:47:15.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:47:15.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:47:15.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:47, diff=28.372136s, valid=True
2026-05-28T21:47:15.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:47:15.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:47:15.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:47:12, diff=3.375753s, valid=True
2026-05-28T21:47:15.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:47:15.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:47:15.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:46:45, diff=30.384671s, valid=True
2026-05-28T21:47:15.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:47:15.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:47:15.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:47:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:47:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:47:15.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:47:15.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:47:12, diff=3.388561s, valid=True
2026-05-28T21:47:15.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:47:15.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:47:15.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:47:15.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930277.389379s, valid=True
2026-05-28T21:47:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:47:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:47:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:47:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:47:15.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:47:15.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:47:15.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:47:15.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:47:15.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:47:15.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:47:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:47:15.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:47:15.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:47:15.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:47:16.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:47:16.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:47:16.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:47:16.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:47:16.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-28T21:47:16.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-28T21:47:16.673 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:47:16.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:47:46.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:47:46.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:47:46.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:47:46.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:47:46.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:47:47.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:47:47.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-28T21:47:47.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:47:47.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-28T21:47:47.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:47:47.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:47:47.227 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:47:47.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-28T21:47:50.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-28T21:47:50.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:47:50.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:47:50.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:47:50.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:47:50.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:47:50.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:47:50.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:47:50.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:47:50.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:47:50.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:47:50.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:47:50.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:47:50.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:47:50.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:47:50.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:47:50.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:47:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:47:50.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:47:50.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:47:50.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:47:50.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:47:50.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:47:50.599 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:47:50.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:47:48
2026-05-28T21:47:50.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70092, datetime.datetime(2026, 5, 28, 21, 47, 48), datetime.datetime(2026, 5, 28, 21, 47, 48), 'salt', 6.84, 69.72, None, 12.92, 133.78, 5.14, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:47:50.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:47:50.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:47:50.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:47:48, diff=2.66222s, valid=True
2026-05-28T21:47:50.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:47:50.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:47:50.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:12, diff=-21.334896s, valid=True
2026-05-28T21:47:50.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:47:50.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:47:50.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:47:46, diff=4.671783s, valid=True
2026-05-28T21:47:50.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:47:50.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:47:50.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:47:50.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:47:50.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:47:50.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:47:50.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:12, diff=-21.325132s, valid=True
2026-05-28T21:47:50.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:47:50.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:47:50.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:47:50.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930312.675525s, valid=True
2026-05-28T21:47:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:47:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:47:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:47:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:47:50.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:47:50.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:47:50.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:47:50.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:47:50.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:47:50.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:47:50.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:47:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:47:50.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:47:51.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:47:51.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:47:51.589 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:47:51.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:47:51.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:47:51.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-28T21:47:51.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-28T21:47:51.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:47:51.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:48:21.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:48:21.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:48:21.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:48:22.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:48:22.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:48:22.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:48:22.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-28T21:48:22.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:48:22.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-28T21:48:22.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:48:22.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:48:22.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:48:22.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-28T21:48:24.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-28T21:48:24.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:48:24.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:48:24.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:48:24.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:48:24.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:48:24.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:48:24.739 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:48:24.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:48:24.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:48:24.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:48:24.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:48:24.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:48:24.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:48:24.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:48:24.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:48:24.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:48:24.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:48:24.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:48:24.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:48:24.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:48:24.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:48:24.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:48:24.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:48:25.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:48:19
2026-05-28T21:48:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70093, datetime.datetime(2026, 5, 28, 21, 48, 19), datetime.datetime(2026, 5, 28, 21, 48, 18), 'salt', 6.84, 69.75, None, 12.63, 139.55, 5.13, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:48:25.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:48:25.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:48:25.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:18, diff=7.057147s, valid=True
2026-05-28T21:48:25.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:48:25.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:48:25.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:12, diff=13.060076s, valid=True
2026-05-28T21:48:25.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:48:25.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:48:25.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:16, diff=9.066688s, valid=True
2026-05-28T21:48:25.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:48:25.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:48:25.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:48:25.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:48:25.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:48:25.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:48:25.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:12, diff=13.069684s, valid=True
2026-05-28T21:48:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:48:25.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:48:25.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:48:25.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930347.070337s, valid=True
2026-05-28T21:48:25.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:48:25.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:48:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:48:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:48:25.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:48:25.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:48:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:48:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:48:25.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:48:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:48:25.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:48:25.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:48:25.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:48:25.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:48:25.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:48:26.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:48:26.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:48:26.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:48: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-28T21:48: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-28T21:48:26.361 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:48:26.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:48:56.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:48:56.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:48:56.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:48:56.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:48:56.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:48:57.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:48:57.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-28T21:48:57.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:48:57.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-28T21:48:57.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:48:57.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:48:57.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:48:57.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-28T21:48:59.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-28T21:48:59.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:48:59.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:48:59.558 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:48:59.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:48:59.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:48:59.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:48:59.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:48:59.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:48:59.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:48:59.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:48:59.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:48:59.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:48:59.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:48:59.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:48:59.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:48:59.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:48:59.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:48:59.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:48:59.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:48:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:48:59.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:48:59.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:48:59.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:48:59.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:48:49
2026-05-28T21:48:59.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70094, datetime.datetime(2026, 5, 28, 21, 48, 49), datetime.datetime(2026, 5, 28, 21, 48, 48), 'salt', 6.74, 69.85, None, 12.56, 132.56, 5.11, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:48:59.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:48:59.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:48:59.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:48, diff=11.899785s, valid=True
2026-05-28T21:48:59.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:48:59.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:48:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:12, diff=-12.097288s, valid=True
2026-05-28T21:48:59.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:48:59.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:48:47, diff=12.910031s, valid=True
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:48:59.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:48:59.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:12, diff=-12.086625s, valid=True
2026-05-28T21:48:59.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:48:59.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:48:59.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:48:59.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930381.914705s, valid=True
2026-05-28T21:48:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:48:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:48:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:48:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:48:59.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:48:59.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:48:59.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:48:59.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:49:00.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:49:00.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:49:00.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:49:00.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:49:00.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:49:00.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:49:00.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:49:00.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:49:00.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:49:00.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:49:00.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-28T21:49:00.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-28T21:49:01.115 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:49:01.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:49:31.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:49:31.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:49:31.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:49:31.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:49:31.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:49:31.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:49:31.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:49:31.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:49:31.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-28T21:49:31.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:49:31.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:49:31.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:49:31.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-28T21:49:34.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-28T21:49:34.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:49:34.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:49:34.105 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:49:34.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:49:34.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:49:34.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:49:34.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:49:34.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:49:34.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:49:34.125 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:49:34.125 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:49:34.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:49:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:49:34.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:49:34.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:49:34.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:49:34.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:49:34.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:49:34.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:49:34.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:49:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:49:34.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:49:34.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:49:34.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:49:19
2026-05-28T21:49:34.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70095, datetime.datetime(2026, 5, 28, 21, 49, 19), datetime.datetime(2026, 5, 28, 21, 49, 19), 'salt', 6.81, 69.92, None, 12.18, 134.95, 5.1, 832.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:49:34.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:49:34.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:49:34.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:19, diff=15.444342s, valid=True
2026-05-28T21:49:34.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:49:34.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:49:34.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:12, diff=22.447207s, valid=True
2026-05-28T21:49:34.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:49:34.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:49:34.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:18, diff=16.453804s, valid=True
2026-05-28T21:49:34.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:49:34.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:49:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:49:34.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:49:34.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:49:34.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:49:34.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:12, diff=22.456823s, valid=True
2026-05-28T21:49:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:49:34.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:49:34.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:49:34.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930416.457477s, valid=True
2026-05-28T21:49:34.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:49:34.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:49:34.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:49:34.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:49:34.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:49:34.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:49:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:49:34.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:49:34.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:49:34.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:49:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:49:34.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:49:34.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:49:34.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:49:35.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:49:35.394 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:49:35.494 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:49:35.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:49:35.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-28T21:49:35.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-28T21:49:35.580 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:49:35.580 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:50:05.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:50:05.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:50:05.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:50:05.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:50:05.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:50:06.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:50:06.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-28T21:50:06.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:50:06.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-28T21:50:06.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:50:06.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:50:06.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:50:06.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-28T21:50:08.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-28T21:50:08.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:50:08.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:50:08.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:50:08.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:50:08.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:50:08.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:50:08.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:50:08.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:50:08.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:50:08.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:50:08.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:50:08.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:50:08.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:50:08.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:50:08.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:50:08.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:50:08.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:50:08.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:50:08.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:50:08.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:50:08.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:50:08.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:50:08.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:50:08.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:49:49
2026-05-28T21:50:08.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70096, datetime.datetime(2026, 5, 28, 21, 49, 49), datetime.datetime(2026, 5, 28, 21, 49, 49), 'salt', 6.84, 70.08, None, 12.42, 136.2, 5.06, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:50:08.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:50:08.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:50:08.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:49, diff=19.727297s, valid=True
2026-05-28T21:50:08.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:50:08.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:50:08.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:12, diff=-3.269841s, valid=True
2026-05-28T21:50:08.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:50:08.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:50:08.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:49:46, diff=22.73674s, valid=True
2026-05-28T21:50:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:50:08.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:50:08.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:50:08.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:50:08.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:50:08.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:50:08.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:12, diff=-3.260221s, valid=True
2026-05-28T21:50:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:50:08.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:50:08.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:50:08.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930450.74043s, valid=True
2026-05-28T21:50:08.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:50:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:50:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:50:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:50:08.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:50:08.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:50:08.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:50:08.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:50:08.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:50:08.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:50:08.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:50:08.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:50:09.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:50:09.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:50:09.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:50:09.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:50:09.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:50:09.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:50:09.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:50:09.728 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:50:09.815 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:50:09.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:50:39.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:50:39.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:50:39.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:50:40.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:50:40.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:50:40.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:50:40.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-28T21:50:40.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:50:40.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-28T21:50:40.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:50:40.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:50:40.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:50: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-28T21:50:43.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-28T21:50:43.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:50:43.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:50:43.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:50:43.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:50:43.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:50:43.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:50:43.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:50:43.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:50:43.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:50:43.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:50:43.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:50:43.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:50:43.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:50:43.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:50:43.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:50:43.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:50:43.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:50:43.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:50:43.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:50:43.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:50:43.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:50:43.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:50:43.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:50:43.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:50:19
2026-05-28T21:50:43.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70097, datetime.datetime(2026, 5, 28, 21, 50, 19), datetime.datetime(2026, 5, 28, 21, 50, 19), 'salt', 6.78, 70.08, None, 12.28, 135.54, 5.07, 831.96, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:50:43.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:50:43.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:50:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:19, diff=24.501212s, valid=True
2026-05-28T21:50:43.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:50:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:50:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:12, diff=31.504167s, valid=True
2026-05-28T21:50:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:50:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:17, diff=26.511076s, valid=True
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:50:43.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:50:43.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:12, diff=31.514257s, valid=True
2026-05-28T21:50:43.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:50:43.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:50:43.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:50:43.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930485.514952s, valid=True
2026-05-28T21:50:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:50:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:50:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:50:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:50:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:50:43.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:50:43.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:50:43.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:50:43.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:50:43.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:50:43.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:50:43.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:50:43.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:50:43.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:50:44.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:50:44.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:50:44.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:50:44.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:50:44.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-28T21:50:44.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-28T21:50:44.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:50:44.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:51:14.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:51:14.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:51:14.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:51:15.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:51:15.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:51:15.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:51:15.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-28T21:51:15.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:51:15.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-28T21:51:15.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:51:15.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:51:15.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:51:15.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-28T21:51:19.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-28T21:51:19.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:51:19.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:51:19.188 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:51:19.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:51:19.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:51:19.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:51:19.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:51:19.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:51:19.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:51:19.210 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:51:19.210 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:51:19.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:51:19.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:51:19.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:51:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:51:19.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:51:19.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:51:19.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:51:19.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:51:19.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:51:19.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:51:19.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:51:19.487 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:51:19.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:50:50
2026-05-28T21:51:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70098, datetime.datetime(2026, 5, 28, 21, 50, 50), datetime.datetime(2026, 5, 28, 21, 50, 49), 'salt', 6.68, 70.08, None, 12.95, 141.27, 5.06, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:51:19.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:51:19.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:51:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:49, diff=30.550606s, valid=True
2026-05-28T21:51:19.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:51:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:51:19.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:51:12, diff=7.553461s, valid=True
2026-05-28T21:51:19.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:51:19.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:50:47, diff=32.559992s, valid=True
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:51:19.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:51:19.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:51:12, diff=7.563016s, valid=True
2026-05-28T21:51:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:51:19.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:51:19.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:51:19.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930521.563677s, valid=True
2026-05-28T21:51:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:51:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:51:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:51:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:51:19.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:51:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:51:19.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:51:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:51:19.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:51:19.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:51:19.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:51:19.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:51:19.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:51:19.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:51:20.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:51:20.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:51:20.583 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:51:20.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:51:20.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-28T21:51:20.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-28T21:51:20.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:51:20.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:51:50.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:51:50.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:51:50.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:51:51.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:51:51.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:51:51.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:51:51.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-28T21:51:51.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:51:51.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-28T21:51:51.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:51:51.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:51:51.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:51:51.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-28T21:51:54.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-28T21:51:54.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:51:54.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:51:54.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:51:54.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:51:54.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:51:54.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:51:54.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:51:54.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:51:54.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:51:54.063 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:51:54.063 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:51:54.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:51:54.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:51:54.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:51:54.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:51:54.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:51:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:51:54.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:51:54.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T21:51:54.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:51:54.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:51:54.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:51:54.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:51:54.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:51:50
2026-05-28T21:51:54.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70100, datetime.datetime(2026, 5, 28, 21, 51, 50), datetime.datetime(2026, 5, 28, 21, 51, 50), 'salt', 6.84, 70.18, None, 12.42, 135.09, 5.04, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:51:54.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:51:54.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:51:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:51:50, diff=4.397102s, valid=True
2026-05-28T21:51:54.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:51:54.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:51:54.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:12, diff=-17.600099s, valid=True
2026-05-28T21:51:54.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:51:54.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:51:47, diff=7.406442s, valid=True
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:51:54.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T21:51:54.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:12, diff=-17.5906s, valid=True
2026-05-28T21:51:54.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:51:54.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:51:54.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:51:54.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930556.410047s, valid=True
2026-05-28T21:51:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:51:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:51:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:51:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:51:54.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:51:54.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:51:54.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:51:54.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:51:54.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:51:54.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:51:54.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:51:54.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:51:54.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:51:54.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:51:54.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:51:55.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:51:55.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:51:55.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:51:55.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-28T21:51:55.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-28T21:51:55.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:51:55.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:52:25.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:52:25.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:52:25.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:52:25.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:52:25.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:52:25.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:52:25.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-28T21:52:25.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:52:25.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:52:26.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:52:26.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:52:26.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:52:26.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-28T21:52:28.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-28T21:52:28.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:52:28.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:52:28.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:52:28.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:52:28.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:52:28.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:52:28.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:52:28.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:52:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:52:28.427 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:52:28.427 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:52:28.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:52:28.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:52:28.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:52:28.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:52:28.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:52:28.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:52:28.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:52:28.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:52:28.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:52:28.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:52:28.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:52:28.720 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:52:28.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:52:20
2026-05-28T21:52:28.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70101, datetime.datetime(2026, 5, 28, 21, 52, 20), datetime.datetime(2026, 5, 28, 21, 52, 20), 'salt', 6.81, 70.18, None, 13.8, 141.13, 5.05, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:52:28.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:52:28.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:52:28.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:20, diff=8.785431s, valid=True
2026-05-28T21:52:28.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:52:28.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:52:28.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:12, diff=16.788385s, valid=True
2026-05-28T21:52:28.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:52:28.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:17, diff=11.795043s, valid=True
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:52:28.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:52:28.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:12, diff=16.798152s, valid=True
2026-05-28T21:52:28.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:52:28.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:52:28.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:52:28.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930590.798826s, valid=True
2026-05-28T21:52:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:52:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:52:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:52:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:52:28.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:52:28.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:52:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:52:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:52:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:52:28.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:52:29.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:52:29.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:52:29.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:52:29.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:52:29.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:52:29.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:52:29.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:52:29.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:52:29.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-28T21:52:29.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-28T21:52:30.091 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:52:30.092 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:53:00.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:53:00.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:53:00.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:53:00.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:53:00.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:53:00.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:53:00.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-28T21:53:00.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:53:00.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:53:00.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:53:00.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:53:00.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:53:00.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-28T21:53:03.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:53:03.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:53:03.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:53:03.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:53:03.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:53:03.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:53:03.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:53:03.437 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:53:03.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:53:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:53:03.438 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:53:03.438 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:53:03.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:53:03.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:53:03.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:53:03.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:53:03.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:53:03.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:53:03.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:53:03.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:53:03.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:53:03.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:53:03.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:53:03.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:53:03.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:52:50
2026-05-28T21:53:03.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70102, datetime.datetime(2026, 5, 28, 21, 52, 50), datetime.datetime(2026, 5, 28, 21, 52, 50), 'salt', 6.74, 70.25, None, 13.66, 144.11, 5.03, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:53:03.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:53:03.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:53:03.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:50, diff=13.758007s, valid=True
2026-05-28T21:53:03.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:53:03.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:53:03.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:12, diff=-8.239183s, valid=True
2026-05-28T21:53:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:53:03.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:52:48, diff=15.767328s, valid=True
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:53:03.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:53:03.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:12, diff=-8.229703s, valid=True
2026-05-28T21:53:03.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:53:03.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:53:03.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:53:03.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930625.770946s, valid=True
2026-05-28T21:53:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:53:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:53:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:53:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:53:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:53:03.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:53:03.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:53:03.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:53:03.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:53:03.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:53:03.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:53:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:53:04.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:53:04.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:53:04.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:53:04.648 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:53:04.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:53:04.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:53:04.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-28T21:53:04.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-28T21:53:05.743 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:53:05.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:53:35.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:53:35.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:53:35.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:53:36.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:53:36.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:53:36.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:53:36.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-28T21:53:36.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:53:36.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-28T21:53:36.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:53:36.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:53:36.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:53:36.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-28T21:53:38.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:53:38.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:53:38.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:53:38.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:53:38.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:53:38.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:53:38.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:53:38.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:53:38.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:53:38.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:53:38.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:53:38.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:53:38.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:53:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:53:39.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:53:39.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:53:39.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:53:39.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:53:39.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:53:39.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:53:39.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:53:39.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:53:39.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:53:39.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:53:39.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:53:21
2026-05-28T21:53:39.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70103, datetime.datetime(2026, 5, 28, 21, 53, 21), datetime.datetime(2026, 5, 28, 21, 53, 20), 'salt', 6.74, 70.28, None, 13.37, 141.13, 5.02, 832.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:53:39.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:53:39.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:53:39.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:20, diff=19.274233s, valid=True
2026-05-28T21:53:39.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:53:39.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:53:39.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:12, diff=27.277078s, valid=True
2026-05-28T21:53:39.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:53:39.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:19, diff=20.283587s, valid=True
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:53:39.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:53:39.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:53:39.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:12, diff=27.28656s, valid=True
2026-05-28T21:53:39.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:53:39.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:53:39.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:53:39.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930661.287215s, valid=True
2026-05-28T21:53:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:53:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:53:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:53:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:53:39.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:53:39.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:53:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:53:39.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:53:39.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:53:39.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:53:39.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:53:39.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:53:39.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:53:39.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:53:39.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:53:40.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:53:40.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:53:40.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:53:40.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-28T21:53:40.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-28T21:53:40.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:53:40.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:54:10.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:54:10.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:54:10.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:54:10.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:54:10.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:54:10.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:54:10.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-28T21:54:10.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:54:10.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:54:10.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:54:10.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:54:10.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:54:10.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-28T21:54:13.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-28T21:54:13.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:54:13.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:54:13.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:54:13.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:54:13.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:54:13.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:54:13.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:54:13.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:54:13.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:54:13.263 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:54:13.264 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:54:13.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:54:13.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:54:13.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:54:13.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:54:13.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:54:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:54:13.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:54:13.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:54:13.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:54:13.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:54:13.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:54:13.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:54:13.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:53:51
2026-05-28T21:54:13.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70104, datetime.datetime(2026, 5, 28, 21, 53, 51), datetime.datetime(2026, 5, 28, 21, 53, 50), 'salt', 6.78, 70.28, None, 14.68, 143.43, 5.03, 832.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:54:13.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:54:13.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:54:13.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:50, diff=23.639999s, valid=True
2026-05-28T21:54:13.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:54:13.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:54:13.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:12, diff=1.642884s, valid=True
2026-05-28T21:54:13.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:54:13.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:53:50, diff=23.649558s, valid=True
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:54:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:54:13.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:54:13.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:12, diff=1.652575s, valid=True
2026-05-28T21:54:13.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:54:13.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:54:13.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:54:13.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930695.653233s, valid=True
2026-05-28T21:54:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:54:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:54:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:54:13.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:54:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:54:13.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:54:13.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:54:13.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:54:13.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:54:13.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:54:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:54:13.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:54:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:54:13.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:54:14.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:54:14.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:54:14.649 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:54:14.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:54:14.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-28T21:54:14.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-28T21:54:14.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:54:14.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:54:44.750 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:54:44.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:54:44.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:54:45.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:54:45.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:54:45.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:54:45.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-28T21:54:45.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:54:45.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-28T21:54:45.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:54:45.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:54:45.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:54:45.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-28T21:54:47.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:54:47.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:54:47.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:54:47.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:54:47.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:54:47.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:54:47.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:54:47.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:54:47.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:54:47.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:54:47.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:54:47.812 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:54:47.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:54:47.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:54:47.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:54:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:54:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:54:48.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:54:48.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:54:48.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:54:48.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:54:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:54:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:54:48.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:54:48.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:54:21
2026-05-28T21:54:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70105, datetime.datetime(2026, 5, 28, 21, 54, 21), datetime.datetime(2026, 5, 28, 21, 54, 21), 'salt', 6.78, 70.15, None, 13.94, 134.72, 5.05, 832.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:54:48.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:54:48.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:54:48.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:21, diff=27.142099s, valid=True
2026-05-28T21:54:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:54:48.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:54:48.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:12, diff=36.145097s, valid=True
2026-05-28T21:54:48.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:54:48.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:54:48.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:18, diff=30.151755s, valid=True
2026-05-28T21:54:48.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:54:48.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:54:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:54:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:54:48.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:54:48.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:54:48.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:54:12, diff=36.154786s, valid=True
2026-05-28T21:54:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:54:48.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:54:48.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:54:48.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930730.155446s, valid=True
2026-05-28T21:54:48.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:54:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:54:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:54:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:54:48.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:54:48.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:54:48.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:54:48.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:54:48.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:54:48.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:54:48.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:54:48.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:54:48.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:54:48.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:54:48.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:54:49.145 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:54:49.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:54:49.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:54:49.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-28T21:54:49.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-28T21:54:49.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:54:49.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:55:19.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:55:19.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:55:19.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:55:19.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:55:19.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:55:20.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:55:20.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-28T21:55:20.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:55:20.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-28T21:55:20.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:55:20.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:55:20.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:55:20.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-28T21:55: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-28T21:55:22.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:55:22.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:55:22.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:55:22.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:55:22.717 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:55:22.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:55:22.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:55:22.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:55:22.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:55:22.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:55:22.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:55:22.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:55:22.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:55:22.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:55:22.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:55:22.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:55:22.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:55:22.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:55:22.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:55:22.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:55:22.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:55:22.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:55:22.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:55:23.042 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:55:21
2026-05-28T21:55:23.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70107, datetime.datetime(2026, 5, 28, 21, 55, 21), datetime.datetime(2026, 5, 28, 21, 55, 21), 'salt', 6.81, 69.82, None, 13.76, 138.08, 5.12, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:55:23.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:55:23.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:55:23.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:21, diff=2.049375s, valid=True
2026-05-28T21:55:23.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:55:23.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:55:23.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:12, diff=11.053292s, valid=True
2026-05-28T21:55:23.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:55:23.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:19, diff=4.059995s, valid=True
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:55:23.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:55:23.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:12, diff=11.06302s, valid=True
2026-05-28T21:55:23.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:55:23.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:55:23.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:55:23.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930765.063686s, valid=True
2026-05-28T21:55:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:55:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:55:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:55:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:55:23.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:55:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:55:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:55:23.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:55:23.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:55:23.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:55:23.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:55:23.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:55:23.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:55:23.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:55:23.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:55:23.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:55:24.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:55:24.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:55:24.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-28T21:55:24.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-28T21:55:24.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:55:24.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:55:54.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:55:54.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:55:54.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:55:54.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:55:54.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:55:54.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:55:54.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-28T21:55:54.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:55:54.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-28T21:55:54.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:55:54.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:55:54.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:55:54.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-28T21:55:58.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T21:55:58.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:55:58.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:55:58.078 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:55:58.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:55:58.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:55:58.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:55:58.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:55:58.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:55:58.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:55:58.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:55:58.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:55:58.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:55:58.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:55:58.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:55:58.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:55:58.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:55:58.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:55:58.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:55:58.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:55:58.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:55:58.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:55:58.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:55:58.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:55:58.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:55:52
2026-05-28T21:55:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70108, datetime.datetime(2026, 5, 28, 21, 55, 52), datetime.datetime(2026, 5, 28, 21, 55, 51), 'salt', 6.84, 69.45, None, 14.29, 136.27, 5.19, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:55:58.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:55:58.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:55:58.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:51, diff=7.425089s, valid=True
2026-05-28T21:55:58.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:55:58.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:55:58.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:12, diff=-13.572064s, valid=True
2026-05-28T21:55:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:55:58.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:55:49, diff=9.434567s, valid=True
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:55:58.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:55:58.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:55:58.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:12, diff=-13.562369s, valid=True
2026-05-28T21:55:58.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:55:58.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:55:58.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:55:58.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930800.438358s, valid=True
2026-05-28T21:55:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:55:58.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:55:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:55:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:55:58.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:55:58.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:55:58.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:55:58.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:55:58.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:55:58.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:55:58.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:55:58.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:55:58.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:55:58.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:55:59.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:55:59.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:55:59.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:55:59.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:55:59.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-28T21:55:59.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-28T21:55:59.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:55:59.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:56:29.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:56:29.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:56:29.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:56:29.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:56:29.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:56:30.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:56:30.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-28T21:56:30.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:56:30.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-28T21:56:30.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:56:30.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:56:30.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:56:30.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-28T21:56:32.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-28T21:56:32.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:56:32.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:56:32.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:56:32.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:56:32.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:56:32.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:56:32.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:56:32.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:56:32.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:56:32.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:56:32.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:56:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:56:32.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:56:32.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:56:32.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:56:32.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:56:32.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:56:32.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:56:32.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:56:32.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:56:32.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:56:32.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:56:32.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:56:32.942 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:56:22
2026-05-28T21:56:32.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70109, datetime.datetime(2026, 5, 28, 21, 56, 22), datetime.datetime(2026, 5, 28, 21, 56, 21), 'salt', 6.98, 69.45, None, 13.48, 137.54, 5.2, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:56:32.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:56:32.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:56:32.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:21, diff=11.948207s, valid=True
2026-05-28T21:56:32.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:56:32.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:56:32.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:12, diff=20.951064s, valid=True
2026-05-28T21:56:32.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:56:32.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:56:32.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:19, diff=13.957637s, valid=True
2026-05-28T21:56:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:56:32.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:56:32.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:56:32.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:56:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:56:32.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:56:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:12, diff=20.96066s, valid=True
2026-05-28T21:56:32.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:56:32.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:56:32.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:56:32.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930834.961319s, valid=True
2026-05-28T21:56:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:56:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:56:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:56:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:56:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:56:33.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:56:33.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:56:33.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:56:33.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:56:33.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:56:33.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:56:33.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:56:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:56:33.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:56:33.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:56:33.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:56:33.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:56:33.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:56:33.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-28T21:56:33.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-28T21:56:34.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:56:34.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:57:04.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:57:04.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:57:04.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:57:04.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:57:04.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:57:04.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:57:04.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-28T21:57:04.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:57:04.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-28T21:57:04.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:57:04.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:57:04.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:57:04.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-28T21:57:07.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-28T21:57:07.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:57:07.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:57:07.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:57:07.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:57:07.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:57:07.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:57:07.032 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:57:07.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:57:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:57:07.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:57:07.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:57:07.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:57:07.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:57:07.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:57:07.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:57:07.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:57:07.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:57:07.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:57:07.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:57:07.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:57:07.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:57:07.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:57:07.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:57:07.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:56:52
2026-05-28T21:57:07.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70110, datetime.datetime(2026, 5, 28, 21, 56, 52), datetime.datetime(2026, 5, 28, 21, 56, 52), 'salt', 6.98, 69.49, None, 13.37, 138.19, 5.19, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:57:07.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:57:07.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:57:07.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:52, diff=15.344471s, valid=True
2026-05-28T21:57:07.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:57:07.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:57:07.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:12, diff=-4.652642s, valid=True
2026-05-28T21:57:07.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:57:07.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:56:50, diff=17.354153s, valid=True
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:57:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:57:07.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:12, diff=-4.642662s, valid=True
2026-05-28T21:57:07.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:57:07.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:57:07.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:57:07.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930869.358017s, valid=True
2026-05-28T21:57:07.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:57:07.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:57:07.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:57:07.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:57:07.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:57:07.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:57:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:57:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:57:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:57:07.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:57:07.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:57:07.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:57:07.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:57:07.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:57:07.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:57:08.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:57:08.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:57:08.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:57:08.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-28T21:57:08.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-28T21:57:08.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:57:08.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:57:38.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:57:38.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:57:38.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:57:38.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:57:38.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:57:39.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:57:39.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-28T21:57:39.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:57:39.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-28T21:57:39.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:57:39.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:57:39.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:57:39.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-28T21:57:41.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-28T21:57:41.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:57:41.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:57:41.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:57:41.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:57:41.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:57:41.714 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:57:41.714 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:57:41.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:57:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:57:41.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:57:41.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:57:41.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:57:41.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:57:41.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:57:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:57:41.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:57:41.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:57:41.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:57:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:57:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:57:41.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:57:41.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:57:41.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:57:42.021 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:57:22
2026-05-28T21:57:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70111, datetime.datetime(2026, 5, 28, 21, 57, 22), datetime.datetime(2026, 5, 28, 21, 57, 22), 'salt', 6.88, 69.55, None, 12.74, 136.13, 5.18, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:57:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:57:42.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:57:42.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:22, diff=20.026969s, valid=True
2026-05-28T21:57:42.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:57:42.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:57:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:12, diff=30.029814s, valid=True
2026-05-28T21:57:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:57:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:21, diff=21.036295s, valid=True
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:57:42.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:57:42.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:12, diff=30.039298s, valid=True
2026-05-28T21:57:42.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:57:42.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:57:42.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:57:42.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930904.039952s, valid=True
2026-05-28T21:57:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:57:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:57:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:57:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:57:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:57:42.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:57:42.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:57:42.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:57:42.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:57:42.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:57:42.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:57:42.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:57:42.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:57:42.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:57:42.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:57:42.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:57:43.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:57:43.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:57:43.075 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T21:57:43.075 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T21:57:43.159 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:57:43.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:58:13.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:58:13.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:58:13.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:58:13.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:58:13.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:58:13.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:58:13.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-28T21:58:13.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:58:13.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-28T21:58:13.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:58:13.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:58:13.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:58:13.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-28T21:58: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-28T21:58:16.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:58:16.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:58:16.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:58:16.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:58:16.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:58:16.117 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:58:16.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:58:16.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:58:16.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:58:16.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:58:16.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:58:16.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:58:16.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:58:16.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:58:16.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:58:16.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:58:16.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:58:16.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:58:16.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:58:16.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:58:16.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:58:16.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:58:16.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:58:16.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:57:53
2026-05-28T21:58:16.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70112, datetime.datetime(2026, 5, 28, 21, 57, 53), datetime.datetime(2026, 5, 28, 21, 57, 52), 'salt', 6.85, 69.49, None, 13.9, 135.85, 5.19, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:58:16.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:58:16.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:58:16.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:52, diff=24.43061s, valid=True
2026-05-28T21:58:16.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:58:16.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:58:16.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:12, diff=4.433438s, valid=True
2026-05-28T21:58:16.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:58:16.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:57:52, diff=24.440067s, valid=True
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:58:16.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:58:16.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:12, diff=4.443054s, valid=True
2026-05-28T21:58:16.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:58:16.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:58:16.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:58:16.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930938.443712s, valid=True
2026-05-28T21:58:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:58:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:58:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:58:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:58:16.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:58:16.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:58:16.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:58:16.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:58:16.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:58:16.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:58:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:58:16.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:58:16.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:58:16.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:58:16.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:58:17.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:58:17.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:58:17.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:58:17.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-28T21:58:17.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-28T21:58:17.577 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:58:17.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:58:47.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:58:47.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:58:47.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:58:47.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:58:47.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:58:48.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:58:48.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T21:58:48.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:58:48.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-28T21:58:48.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:58:48.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:58:48.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:58:48.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T21:58:50.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-28T21:58:50.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:58:50.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:58:50.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:58:50.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:58:50.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:58:50.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:58:50.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:58:50.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:58:50.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:58:50.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:58:50.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:58:50.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:58:50.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:58:50.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:58:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:58:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:58:50.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:58:50.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:58:50.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:58:50.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:58:50.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:58:50.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:58:50.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:58:50.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:58:23
2026-05-28T21:58:50.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70113, datetime.datetime(2026, 5, 28, 21, 58, 23), datetime.datetime(2026, 5, 28, 21, 58, 22), 'salt', 6.94, 69.59, None, 14.15, 139.06, 5.17, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:58:50.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:58:50.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T21:58:50.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:22, diff=28.849217s, valid=True
2026-05-28T21:58:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:58:50.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:58:50.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:12, diff=38.852024s, valid=True
2026-05-28T21:58:50.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:58:50.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:20, diff=30.858459s, valid=True
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:58:50.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:58:50.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:58:12, diff=38.861433s, valid=True
2026-05-28T21:58:50.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:58:50.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:58:50.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:58:50.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=930972.862086s, valid=True
2026-05-28T21:58:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:58:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:58:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:58:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:58:50.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:58:50.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:58:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:58:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:58:50.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:58:50.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:58:51.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:58:51.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:58:51.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:58:51.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:58:51.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:58:51.823 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:58:51.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:58:51.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:58:51.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-28T21:58:51.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-28T21:58:52.101 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:58:52.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:59:22.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:59:22.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:59:22.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:59:22.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:59:22.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:59:22.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:59:22.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-28T21:59:22.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:59:22.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T21:59:22.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:59:22.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:59:22.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:59:22.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-28T21:59:25.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-28T21:59:25.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:59:25.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:59:25.071 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:59:25.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:59:25.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:59:25.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:59:25.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:59:25.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:59:25.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:59:25.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:59:25.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:59:25.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:59:25.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T21:59:25.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:59:25.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T21:59:25.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:59:25.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:59:25.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:59:25.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:59:25.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T21:59:25.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T21:59:25.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T21:59:25.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T21:59:25.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:59:23
2026-05-28T21:59:25.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70115, datetime.datetime(2026, 5, 28, 21, 59, 23), datetime.datetime(2026, 5, 28, 21, 59, 23), 'salt', 6.78, 69.79, None, 15.0, 138.17, 5.12, 832.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T21:59:25.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T21:59:25.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T21:59:25.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:23, diff=2.420047s, valid=True
2026-05-28T21:59:25.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T21:59:25.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:59:25.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:12, diff=13.422898s, valid=True
2026-05-28T21:59:25.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T21:59:25.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:21, diff=4.429497s, valid=True
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T21:59:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T21:59:25.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:12, diff=13.432499s, valid=True
2026-05-28T21:59:25.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T21:59:25.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T21:59:25.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T21:59:25.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931007.433172s, valid=True
2026-05-28T21:59:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T21:59:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T21:59:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T21:59:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T21:59:25.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T21:59:25.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T21:59:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T21:59:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T21:59:25.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T21:59:25.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T21:59:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T21:59:25.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T21:59:25.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T21:59:25.752 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T21:59:25.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:59:26.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T21:59:26.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T21:59:26.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T21:59:26.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-28T21:59:26.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-28T21:59:26.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T21:59:26.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T21:59:56.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T21:59:56.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T21:59:56.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T21:59:57.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T21:59:57.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T21:59:57.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T21:59:57.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-28T21:59:57.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T21:59:57.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-28T21:59:57.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T21:59:57.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T21:59:57.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T21:59:57.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-28T21:59:59.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-28T21:59:59.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T21:59:59.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T21:59:59.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T21:59:59.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T21:59:59.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T21:59:59.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T21:59:59.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T21:59:59.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T21:59:59.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T21:59:59.759 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T21:59:59.759 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T21:59:59.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T21:59:59.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T21:59:59.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T21:59:59.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T21:59:59.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T21:59:59.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T21:59:59.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:00:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:00:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:00:00.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:00:00.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:00:00.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:00:00.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 21:59:53
2026-05-28T22:00:00.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70116, datetime.datetime(2026, 5, 28, 21, 59, 53), datetime.datetime(2026, 5, 28, 21, 59, 53), 'salt', 6.85, 69.79, None, 15.49, 139.46, 5.13, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:00:00.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:00:00.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:00:00.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:53, diff=7.087504s, valid=True
2026-05-28T22:00:00.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:00:00.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:00:00.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:12, diff=-11.905855s, valid=True
2026-05-28T22:00:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:00:00.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:00:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 21:59:51, diff=9.107667s, valid=True
2026-05-28T22:00:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:00:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:00:00.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:00:00.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:00:00.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:00:00.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:00:00.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:12, diff=-11.888883s, valid=True
2026-05-28T22:00:00.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:00:00.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:00:00.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:00:00.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931042.111827s, valid=True
2026-05-28T22:00:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:00:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:00:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:00:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:00:00.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:00:00.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:00:00.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:00:00.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:00:00.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:00:00.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:00:00.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:00:00.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:00:00.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:00:00.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:00:00.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:00:01.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:00:01.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:00:01.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:00:01.192 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:00:01.192 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:00:01.371 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:00:01.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:00:31.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:00:31.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:00:31.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:00:31.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:00:31.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:00:32.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:00:32.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-28T22:00:32.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:00:32.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-28T22:00:32.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:00:32.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:00:32.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:00:32.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-28T22:00:34.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-28T22:00:34.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:00:34.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:00:34.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:00:34.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:00:34.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:00:34.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:00:34.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:00:34.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:00:34.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:00:34.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:00:34.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:00:34.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:00:34.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:00:34.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:00:34.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:00:34.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:00:34.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:00:34.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:00:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:00:35.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:00:35.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:00:35.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:00:35.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:00:35.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:00:24
2026-05-28T22:00:35.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70117, datetime.datetime(2026, 5, 28, 22, 0, 24), datetime.datetime(2026, 5, 28, 22, 0, 23), 'salt', 6.81, 69.72, None, 14.82, 138.12, 5.14, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:00:35.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:00:35.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:00:35.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:23, diff=12.102896s, valid=True
2026-05-28T22:00:35.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:00:35.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:00:35.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:12, diff=23.105762s, valid=True
2026-05-28T22:00:35.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:00:35.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:21, diff=14.112438s, valid=True
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:00:35.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:00:35.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:12, diff=23.115518s, valid=True
2026-05-28T22:00:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:00:35.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:00:35.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:00:35.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931077.116193s, valid=True
2026-05-28T22:00:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:00:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:00:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:00:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:00:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:00:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:00:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:00:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:00:35.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:00:35.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:00:35.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:00:35.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:00:35.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:00:35.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:00:35.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:00:35.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:00:36.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:00:36.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:00:36.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-28T22:00:36.095 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:00:36.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:00:36.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:01:06.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:01:06.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:01:06.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:01:06.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:01:06.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:01:06.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:01:06.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-28T22:01:06.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:01:06.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-28T22:01:06.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:01:06.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:01:06.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:01:06.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:01:09.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:01:09.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:01:09.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:01:09.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:01:09.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:01:09.406 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:01:09.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:01:09.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:01:09.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:01:09.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:01:09.418 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:01:09.419 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:01:09.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:01:09.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:01:09.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:01:09.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:01:09.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:01:09.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:01:09.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:01:09.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:01:09.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:01:09.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:01:09.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:01:09.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:01:09.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:00:54
2026-05-28T22:01:09.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70118, datetime.datetime(2026, 5, 28, 22, 0, 54), datetime.datetime(2026, 5, 28, 22, 0, 54), 'salt', 6.88, 69.62, None, 13.97, 144.09, 5.16, 832.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:01:09.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:01:09.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:01:09.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:54, diff=15.732134s, valid=True
2026-05-28T22:01:09.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:01:09.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:01:09.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:12, diff=-2.265008s, valid=True
2026-05-28T22:01:09.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:01:09.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:01:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:00:51, diff=18.741662s, valid=True
2026-05-28T22:01:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:01:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:01:09.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:01:09.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:01:09.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:01:09.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:01:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:12, diff=-2.255318s, valid=True
2026-05-28T22:01:09.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:01:09.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:01:09.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:01:09.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931111.745346s, valid=True
2026-05-28T22:01:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:01:09.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:01:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:01:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:01:09.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:01:09.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:01:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:01:09.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:01:09.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:01:09.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:01:10.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:01:10.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:01:10.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:01:10.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:01:10.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:01:10.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:01:10.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:01:10.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:01:10.828 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:01:10.828 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:01:11.036 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:01:11.036 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:01:41.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:01:41.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:01:41.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:01:41.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:01:41.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:01:41.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:01:41.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-28T22:01:41.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:01:41.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-28T22:01:41.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:01:41.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:01:41.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:01:41.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-28T22:01:43.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-28T22:01:43.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:01:43.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:01:43.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:01:43.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:01:43.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:01:43.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:01:43.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:01:43.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:01:43.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:01:43.987 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:01:43.987 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:01:43.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:01:44.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:01:44.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:01:44.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:01:44.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:01:44.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:01:44.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:01:44.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:01:44.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:01:44.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:01:44.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:01:44.241 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:01:44.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:01:24
2026-05-28T22:01:44.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70119, datetime.datetime(2026, 5, 28, 22, 1, 24), datetime.datetime(2026, 5, 28, 22, 1, 24), 'salt', 6.98, 69.59, None, 14.54, 137.91, 5.17, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:01:44.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:01:44.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:01:44.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:24, diff=20.304006s, valid=True
2026-05-28T22:01:44.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:01:44.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:01:44.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:12, diff=32.306813s, valid=True
2026-05-28T22:01:44.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:01:44.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:22, diff=22.313337s, valid=True
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:01:44.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:01:44.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:12, diff=32.316363s, valid=True
2026-05-28T22:01:44.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:01:44.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:01:44.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:01:44.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931146.317034s, valid=True
2026-05-28T22:01:44.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:01:44.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:01:44.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:01:44.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:01:44.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:01:44.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:01:44.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:01:44.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:01:44.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:01:44.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:01:44.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:01:44.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:01:44.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:01:44.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:01:44.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:01:45.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:01:45.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:01:45.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:01:45.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-28T22:01:45.364 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:01:45.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:01:45.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:02:15.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:02:15.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:02:15.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:02:15.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:02:15.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:02:16.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:02:16.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-28T22:02:16.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:02:16.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-28T22:02:16.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:02:16.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:02:16.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:02:16.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-28T22:02:18.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-28T22:02:18.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:02:18.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:02:18.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:02:18.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:02:18.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:02:19.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:02:19.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:02:19.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:02:19.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:02:19.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:02:19.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:02:19.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:02:19.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:02:19.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:02:19.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:02:19.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:02:19.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:02:19.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:02:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:02:19.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:02:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:02:19.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:02:19.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:02:19.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:01:54
2026-05-28T22:02:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70120, datetime.datetime(2026, 5, 28, 22, 1, 54), datetime.datetime(2026, 5, 28, 22, 1, 54), 'salt', 7.01, 69.32, None, 15.03, 139.44, 5.22, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:02:19.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:02:19.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:02:19.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:54, diff=25.32542s, valid=True
2026-05-28T22:02:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:02:19.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:02:19.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:12, diff=7.329533s, valid=True
2026-05-28T22:02:19.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:02:19.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:01:54, diff=25.336508s, valid=True
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:02:19.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:02:19.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:12, diff=7.339522s, valid=True
2026-05-28T22:02:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:02:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:02:19.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:02:19.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931181.340187s, valid=True
2026-05-28T22:02:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:02:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:02:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:02:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:02:19.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:02:19.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:02:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:02:19.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:02:19.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:02:19.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:02:19.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:02:19.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:02:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:02:19.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:02:19.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:02:20.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:02:20.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:02:20.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:02:20.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-28T22:02:20.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-28T22:02:20.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:02:20.535 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:02:50.565 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:02:50.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:02:50.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:02:50.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:02:50.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:02:51.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:02:51.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-28T22:02:51.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:02:51.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-28T22:02:51.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:02:51.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:02:51.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:02:51.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-28T22:02:53.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-28T22:02:53.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:02:53.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:02:53.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:02:53.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:02:53.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:02:53.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:02:53.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:02:53.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:02:53.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:02:53.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:02:53.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:02:53.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:02:53.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:02:53.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:02:53.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:02:53.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:02:53.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:02:53.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:02:53.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:02:53.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:02:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:02:53.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:02:53.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:02:53.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:02:25
2026-05-28T22:02:53.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70121, datetime.datetime(2026, 5, 28, 22, 2, 25), datetime.datetime(2026, 5, 28, 22, 2, 24), 'salt', 6.98, 69.26, None, 13.2, 140.59, 5.24, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:02:53.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:02:53.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:02:53.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:24, diff=29.857775s, valid=True
2026-05-28T22:02:53.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:02:53.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:02:53.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:12, diff=41.860639s, valid=True
2026-05-28T22:02:53.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:02:53.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:22, diff=31.867123s, valid=True
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:02:53.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:02:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:02:12, diff=41.870131s, valid=True
2026-05-28T22:02:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:02:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:02:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:02:53.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931215.87079s, valid=True
2026-05-28T22:02:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:02:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:02:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:02:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:02:53.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:02:53.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:02:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:02:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:02:53.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:02:54.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:02:54.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:02:54.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:02:54.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:02:54.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:02:54.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:02:54.772 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:02:54.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:02:54.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:02:54.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-28T22:02:54.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:02:55.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:02:55.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:03:25.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:03:25.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:03:25.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:03:25.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:03:25.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:03:25.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:03:25.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-28T22:03:25.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:03:25.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-28T22:03:25.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:03:25.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:03:25.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:03:25.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-28T22:03:28.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-28T22:03:28.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:03:28.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:03:28.129 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:03:28.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:03:28.138 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:03:28.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:03:28.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:03:28.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:03:28.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:03:28.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:03:28.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:03:28.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:03:28.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:03:28.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:03:28.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:03:28.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:03:28.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:03:28.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:03:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:03:28.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:03:28.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:03:28.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:03:28.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:03:28.474 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:03:25
2026-05-28T22:03:28.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70123, datetime.datetime(2026, 5, 28, 22, 3, 25), datetime.datetime(2026, 5, 28, 22, 3, 25), 'salt', 7.08, 69.32, None, 13.27, 146.55, 5.23, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:03:28.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:03:28.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:03:28.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:25, diff=3.480055s, valid=True
2026-05-28T22:03:28.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:03:28.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:03:28.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:12, diff=16.482834s, valid=True
2026-05-28T22:03:28.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:03:28.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:23, diff=5.489275s, valid=True
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:03:28.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:03:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:12, diff=16.492275s, valid=True
2026-05-28T22:03:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:03:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:03:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:03:28.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931250.492936s, valid=True
2026-05-28T22:03:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:03:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:03:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:03:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:03:28.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:03:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:03:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:03:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:03:28.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:03:28.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:03:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:03:28.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:03:28.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:03:28.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:03:29.047 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:03:29.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:03:29.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:03:29.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:03:29.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-28T22:03:29.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-28T22:03:29.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:03:29.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:03:59.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:03:59.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:03:59.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:03:59.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:03:59.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:04:00.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:04:00.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-28T22:04:00.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:04:00.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-28T22:04:00.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:04:00.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:04:00.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:04:00.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:04:03.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-28T22:04:03.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:04:03.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:04:03.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:04:03.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:04:03.197 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:04:03.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:04:03.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:04:03.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:04:03.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:04:03.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:04:03.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:04:03.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:04:03.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:04:03.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:04:03.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:04:03.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:04:03.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:04:03.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:04:03.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:04:03.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:04:03.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:04:03.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:04:03.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:04:03.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:03:55
2026-05-28T22:04:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70124, datetime.datetime(2026, 5, 28, 22, 3, 55), datetime.datetime(2026, 5, 28, 22, 3, 55), 'salt', 7.08, 69.16, None, 15.28, 144.11, 5.26, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:04:03.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:04:03.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:04:03.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:55, diff=8.517146s, valid=True
2026-05-28T22:04:03.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:04:03.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:04:03.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:12, diff=-8.479958s, valid=True
2026-05-28T22:04:03.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:04:03.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:04:03.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:03:54, diff=9.526809s, valid=True
2026-05-28T22:04:03.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:04:03.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:04:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:04:03.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:04:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:04:03.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:04:03.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:12, diff=-8.470183s, valid=True
2026-05-28T22:04:03.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:04:03.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:04:03.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:04:03.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931285.530473s, valid=True
2026-05-28T22:04:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:04:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:04:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:04:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:04:03.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:04:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:04:03.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:04:03.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:04:03.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:04:03.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:04:03.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:04:03.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:04:03.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:04:03.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:04:04.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:04:04.452 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:04:04.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:04:04.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:04:04.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:04:04.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:04:04.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:04:04.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:04:34.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:04:34.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:04:34.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:04:35.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:04:35.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:04:35.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:04:35.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-28T22:04:35.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:04:35.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-28T22:04:35.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:04:35.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:04:35.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:04:35.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:04:37.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-28T22:04:37.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:04:37.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:04:37.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:04:37.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:04:37.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:04:37.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:04:37.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:04:37.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:04:37.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:04:37.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:04:37.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:04:37.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:04:38.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:04:38.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:04:38.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:04:38.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:04:38.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:04:38.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:04:38.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:04:38.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:04:38.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:04:38.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:04:38.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:04:38.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:04:26
2026-05-28T22:04:38.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70125, datetime.datetime(2026, 5, 28, 22, 4, 26), datetime.datetime(2026, 5, 28, 22, 4, 25), 'salt', 7.11, 68.99, None, 13.02, 152.52, 5.3, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:04:38.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:04:38.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:04:38.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:25, diff=13.269924s, valid=True
2026-05-28T22:04:38.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:04:38.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:04:38.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:12, diff=26.272957s, valid=True
2026-05-28T22:04:38.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:04:38.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:04:38.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:24, diff=14.279878s, valid=True
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:04:38.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:04:38.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:12, diff=26.283074s, valid=True
2026-05-28T22:04:38.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:04:38.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:04:38.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:04:38.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931320.283736s, valid=True
2026-05-28T22:04:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:04:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:04:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:04:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:04:38.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:04:38.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:04:38.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:04:38.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:04:38.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:04:38.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:04:38.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:04:38.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:04:38.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:04:38.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:04:38.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:04:39.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:04:39.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:04:39.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:04:39.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-28T22:04:39.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-28T22:04:39.481 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:04:39.481 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:05:09.511 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:05:09.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:05:09.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:05:09.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:05:09.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:05:10.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:05:10.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-28T22:05:10.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:05:10.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-28T22:05:10.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:05:10.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:05:10.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:05:10.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-28T22:05:12.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-28T22:05:12.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:05:12.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:05:12.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:05:12.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:05:12.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:05:12.457 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:05:12.457 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:05:12.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:05:12.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:05:12.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:05:12.457 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:05:12.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:05:12.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:05:12.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:05:12.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:05:12.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:05:12.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:05:12.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:05:12.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:05:12.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:05:12.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:05:12.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:05:12.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:05:12.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:04:56
2026-05-28T22:05:12.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70126, datetime.datetime(2026, 5, 28, 22, 4, 56), datetime.datetime(2026, 5, 28, 22, 4, 55), 'salt', 7.21, 68.66, None, 13.27, 142.68, 5.37, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:05:12.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:05:12.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:05:12.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:55, diff=17.774419s, valid=True
2026-05-28T22:05:12.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:05:12.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:05:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:12, diff=0.777326s, valid=True
2026-05-28T22:05:12.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:05:12.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:05:12.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:04:54, diff=18.783954s, valid=True
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:05:12.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:05:12.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:12, diff=0.786963s, valid=True
2026-05-28T22:05:12.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:05:12.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:05:12.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:05:12.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931354.787615s, valid=True
2026-05-28T22:05:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:05:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:05:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:05:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:05:12.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:05:12.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:05:12.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:05:12.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:05:12.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:05:12.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:05:12.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:05:13.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:05:13.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:05:13.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:05:13.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:05:13.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:05:13.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:05:13.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:05:13.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-28T22:05:13.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-28T22:05:14.032 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:05:14.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:05:44.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:05:44.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:05:44.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:05:44.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:05:44.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:05:44.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:05:44.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-28T22:05:44.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:05:44.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-28T22:05:44.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:05:44.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:05:44.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:05:44.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-28T22:05:47.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-28T22:05:47.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:05:47.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:05:47.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:05:47.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:05:47.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:05:47.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:05:47.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:05:47.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:05:47.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:05:47.606 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:05:47.606 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:05:47.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:05:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:05:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:05:47.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:05:47.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:05:47.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:05:47.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:05:47.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:05:47.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:05:47.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:05:47.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:05:47.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:05:47.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:05:26
2026-05-28T22:05:47.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70127, datetime.datetime(2026, 5, 28, 22, 5, 26), datetime.datetime(2026, 5, 28, 22, 5, 26), 'salt', 7.31, 68.23, None, 13.41, 144.37, 5.46, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:05:47.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:05:47.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:05:47.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:26, diff=21.919832s, valid=True
2026-05-28T22:05:47.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:05:47.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:05:47.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:12, diff=35.922688s, valid=True
2026-05-28T22:05:47.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:05:47.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:24, diff=23.929278s, valid=True
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:05:47.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:05:47.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:12, diff=35.93232s, valid=True
2026-05-28T22:05:47.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:05:47.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:05:47.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:05:47.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931389.932983s, valid=True
2026-05-28T22:05:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:05:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:05:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:05:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:05:47.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:05:47.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:05:47.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:05:47.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:05:48.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:05:48.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:05:48.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:05:48.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:05:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:05:48.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:05:48.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:05:48.852 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:05:48.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:05:48.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:05:48.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-28T22:05:48.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-28T22:05:49.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:05:49.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:06:19.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:06:19.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:06:19.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:06:19.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:06:19.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:06:19.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:06:19.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-28T22:06:19.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22: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-28T22:06:19.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:06:19.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:06:19.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:06:19.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-28T22:06: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-28T22:06:22.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:06:22.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:06:22.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:06:22.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:06:22.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:06:22.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:06:22.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:06:22.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:06:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:06:22.187 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:06:22.187 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:06:22.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:06:22.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:06:22.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:06:22.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:06:22.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:06:22.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:06:22.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:06:22.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:06:22.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:06:22.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:06:22.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:06:22.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:06:22.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:05:56
2026-05-28T22:06:22.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70128, datetime.datetime(2026, 5, 28, 22, 5, 56), datetime.datetime(2026, 5, 28, 22, 5, 56), 'salt', 7.28, 67.83, None, 13.06, 145.69, 5.54, 832.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:06:22.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:06:22.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:06:22.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:56, diff=26.506165s, valid=True
2026-05-28T22:06:22.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:06:22.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:06:22.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:12, diff=10.509041s, valid=True
2026-05-28T22:06:22.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:06:22.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:05:55, diff=27.515563s, valid=True
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:06:22.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:06:22.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:06:22.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:12, diff=10.518657s, valid=True
2026-05-28T22:06:22.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:06:22.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:06:22.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:06:22.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931424.519336s, valid=True
2026-05-28T22:06:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:06:22.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:06:22.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:06:22.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:06:22.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:06:22.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:06:22.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:06:22.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:06:22.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:06:22.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:06:22.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:06:22.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:06:22.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:06:22.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:06:23.143 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:06:23.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:06:23.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:06:23.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:06:23.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-28T22:06:23.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-28T22:06:23.799 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:06:23.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:06:53.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:06:53.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:06:53.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:06:54.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:06:54.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:06:54.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:06:54.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-28T22:06:54.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:06:54.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-28T22:06:54.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:06:54.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:06:54.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:06:54.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-28T22:06:56.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:06:56.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:06:56.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:06:56.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:06:56.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:06:56.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:06:56.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:06:56.978 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:06:56.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:06:56.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:06:56.979 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:06:56.979 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:06:56.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:06:57.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:06:57.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:06:57.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:06:57.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:06:57.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:06:57.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:06:57.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:06:57.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:06:57.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:06:57.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:06:57.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:06:57.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:06:26
2026-05-28T22:06:57.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70129, datetime.datetime(2026, 5, 28, 22, 6, 26), datetime.datetime(2026, 5, 28, 22, 6, 26), 'salt', 7.38, 67.83, None, 13.83, 146.53, 5.55, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:06:57.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:06:57.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:06:57.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:26, diff=31.29805s, valid=True
2026-05-28T22:06:57.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:06:57.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:06:57.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:12, diff=45.300931s, valid=True
2026-05-28T22:06:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:06:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:25, diff=32.307527s, valid=True
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:06:57.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:06:57.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:06:12, diff=45.310571s, valid=True
2026-05-28T22:06:57.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:06:57.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:06:57.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:06:57.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931459.31123s, valid=True
2026-05-28T22:06:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:06:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:06:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:06:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:06:57.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:06:57.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:06:57.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:06:57.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:06:57.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:06:57.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:06:57.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:06:57.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:06:57.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:06:57.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:06:57.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:06:58.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:06:58.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:06:58.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:06:58.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:06:58.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-28T22:06:58.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:06:58.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:07:28.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:07:28.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:07:28.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:07:28.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:07:28.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:07:28.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:07:28.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-28T22:07:28.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:07:28.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-28T22:07:28.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:07:28.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:07:28.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:07:28.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-28T22:07:32.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-28T22:07:32.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:07:32.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:07:32.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:07:32.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:07:32.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:07:32.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:07:32.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:07:32.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:07:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:07:32.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:07:32.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:07:32.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:07:32.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:07:32.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:07:32.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:07:32.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:07:32.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:07:32.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:07:32.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:07:32.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:07:32.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:07:32.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:07:32.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:07:32.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:07:28
2026-05-28T22:07:32.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70131, datetime.datetime(2026, 5, 28, 22, 7, 28), datetime.datetime(2026, 5, 28, 22, 7, 27), 'salt', 7.21, 68.13, None, 12.74, 141.62, 5.48, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:07:32.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:07:32.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:07:32.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:27, diff=5.811074s, valid=True
2026-05-28T22:07:32.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:07:32.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:07:32.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:12, diff=20.813932s, valid=True
2026-05-28T22:07:32.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:07:32.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:25, diff=7.820513s, valid=True
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:07:32.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:07:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:12, diff=20.82349s, valid=True
2026-05-28T22:07:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:07:32.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:07:32.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:07:32.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931494.824152s, valid=True
2026-05-28T22:07:32.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:07:32.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:07:32.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:07:32.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:07:32.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:07:32.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:07:32.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:07:32.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:07:32.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:07:32.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:07:33.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:07:33.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:07:33.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:07:33.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:07:33.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:07:33.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:07:33.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:07:33.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:07:33.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-28T22:07:33.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-28T22:07:34.138 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:07:34.138 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:08:04.155 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:08:04.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:08:04.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:08:04.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:08:04.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:08:04.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:08:04.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-28T22:08:04.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:08:04.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-28T22:08:04.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:08:04.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:08:04.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:08:04.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:08:07.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-28T22:08:07.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:08:07.309 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:08:07.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:08:07.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:08:07.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:08:07.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:08:07.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:08:07.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:08:07.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:08:07.331 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:08:07.331 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:08:07.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:08:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:08:07.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:08:07.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:08:07.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:08:07.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:08:07.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:08:07.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:08:07.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:08:07.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:08:07.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:08:07.590 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:08:07.651 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:07:58
2026-05-28T22:08:07.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70132, datetime.datetime(2026, 5, 28, 22, 7, 58), datetime.datetime(2026, 5, 28, 22, 7, 58), 'salt', 7.14, 68.43, None, 12.7, 136.76, 5.41, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:08:07.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:08:07.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:08:07.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:58, diff=9.658019s, valid=True
2026-05-28T22:08:07.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:08:07.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:08:07.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:12, diff=-4.339072s, valid=True
2026-05-28T22:08:07.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:08:07.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:07:56, diff=11.667466s, valid=True
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:08:07.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:08:07.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:12, diff=-4.328067s, valid=True
2026-05-28T22:08:07.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:08:07.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:08:07.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:08:07.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931529.672863s, valid=True
2026-05-28T22:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:08:07.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:08:07.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:08:07.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:08:07.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:08:07.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:08:07.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:08:07.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:08:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:08:07.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:08:08.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:08:08.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:08:08.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:08:08.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:08:08.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:08:08.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-28T22:08:08.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-28T22:08:08.833 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:08:08.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:08:38.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:08:38.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:08:38.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:08:39.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:08:39.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:08:39.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:08:39.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-28T22:08:39.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:08:39.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-28T22:08:39.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:08:39.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:08:39.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:08:39.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-28T22:08:42.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-28T22:08:42.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:08:42.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:08:42.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:08:42.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:08:42.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:08:42.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:08:42.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:08:42.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:08:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:08:42.242 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:08:42.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:08:42.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:08:42.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:08:42.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:08:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:08:42.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:08:42.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:08:42.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:08:42.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:08:42.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:08:42.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:08:42.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:08:42.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:08:42.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:08:28
2026-05-28T22:08:42.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70133, datetime.datetime(2026, 5, 28, 22, 8, 28), datetime.datetime(2026, 5, 28, 22, 8, 28), 'salt', 7.11, 68.79, None, 11.96, 137.66, 5.34, 832.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:08:42.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:08:42.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:08:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:28, diff=14.568086s, valid=True
2026-05-28T22:08:42.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:08:42.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:08:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:12, diff=30.571032s, valid=True
2026-05-28T22:08:42.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:08:42.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:08:42.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:26, diff=16.577685s, valid=True
2026-05-28T22:08:42.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:08:42.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:08:42.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:08:42.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:08:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:08:42.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:08:42.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:12, diff=30.580676s, valid=True
2026-05-28T22:08:42.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:08:42.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:08:42.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:08:42.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931564.581323s, valid=True
2026-05-28T22:08:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:08:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:08:42.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:08:42.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:08:42.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:08:42.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:08:42.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:08:42.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:08:42.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:08:42.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:08:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:08:42.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:08:42.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:08:42.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:08:43.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:08:43.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:08:43.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:08:43.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:08:43.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-28T22:08:43.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-28T22:08:43.753 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:08:43.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:09:13.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:09:13.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:09: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-28T22:09:13.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:09:13.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:09:14.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:09:14.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:09:14.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:09:14.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-28T22:09:14.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:09:14.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:09:14.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:09:14.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-28T22:09:16.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-28T22:09:16.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:09:16.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:09:16.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:09:16.812 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:09:16.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:09:16.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:09:16.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:09:16.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:09:16.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:09:16.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:09:16.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:09:16.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:09:16.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:09:16.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:09:17.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:09:17.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:09:17.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:09:17.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:09:17.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:09:17.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:09:17.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:09:17.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:09:17.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:09:17.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:08:58
2026-05-28T22:09:17.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70134, datetime.datetime(2026, 5, 28, 22, 8, 58), datetime.datetime(2026, 5, 28, 22, 8, 58), 'salt', 7.01, 69.06, None, 11.75, 140.71, 5.28, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:09:17.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:09:17.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:09:17.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:58, diff=19.175407s, valid=True
2026-05-28T22:09:17.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:09:17.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:09:17.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:12, diff=5.17822s, valid=True
2026-05-28T22:09:17.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:09:17.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:09:17.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:08:56, diff=21.184652s, valid=True
2026-05-28T22:09:17.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:09:17.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:09:17.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:09:17.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:09:17.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:09:17.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:09:17.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:12, diff=5.187606s, valid=True
2026-05-28T22:09:17.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:09:17.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:09:17.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:09:17.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931599.188253s, valid=True
2026-05-28T22:09:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:09:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:09:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:09:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:09:17.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:09:17.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:09:17.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:09:17.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:09:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:09:17.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:09:17.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:09:17.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:09:17.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:09:17.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:09:17.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:09:18.104 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:09:18.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:09:18.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:09:18.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-28T22:09:18.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-28T22:09:18.302 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:09:18.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:09:48.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:09:48.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:09:48.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:09:48.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:09:48.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:09:48.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:09:48.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-28T22:09:48.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:09:48.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-28T22:09:48.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:09:48.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:09:48.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:09:48.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:09:51.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-28T22:09:51.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:09:51.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:09:51.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:09:51.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:09:51.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:09:51.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:09:51.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:09:51.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:09:51.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:09:51.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:09:51.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:09:51.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:09:51.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:09:51.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:09:51.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:09:51.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:09:51.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:09:51.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:09:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:09:51.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:09:51.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:09:51.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:09:51.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:09:51.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:09:29
2026-05-28T22:09:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70135, datetime.datetime(2026, 5, 28, 22, 9, 29), datetime.datetime(2026, 5, 28, 22, 9, 28), 'salt', 6.91, 69.59, None, 12.46, 133.95, 5.17, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:09:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:09:51.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:09:51.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:28, diff=23.678709s, valid=True
2026-05-28T22:09:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:09:51.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:09:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:12, diff=39.681611s, valid=True
2026-05-28T22:09:51.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:09:51.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:26, diff=25.68818s, valid=True
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:09:51.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:09:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:12, diff=39.691166s, valid=True
2026-05-28T22:09:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:09:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:09:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:09:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931633.691822s, valid=True
2026-05-28T22:09:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:09:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:09:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:09:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:09:51.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:09:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:09:51.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:09:51.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:09:51.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:09:51.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:09:51.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:09:51.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:09:51.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:09:52.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:09:52.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:09:52.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:09:52.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:09:52.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:09:52.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-28T22:09:52.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-28T22:09:52.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:09:52.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:10:22.923 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:10:22.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:10:22.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:10:23.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:10:23.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:10:23.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:10:23.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-28T22:10:23.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:10:23.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-28T22:10:23.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:10:23.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:10:23.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:10:23.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-28T22:10:25.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-28T22:10:25.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:10:25.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:10:25.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:10:25.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:10:25.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:10:25.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:10:25.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:10:25.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:10:25.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:10:25.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:10:25.933 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:10:25.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:10:26.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:10:26.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:10:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:10:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:10:26.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:10:26.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:10:26.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:10:26.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:10:26.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:10:26.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:10:26.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:10:26.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:09:59
2026-05-28T22:10:26.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70136, datetime.datetime(2026, 5, 28, 22, 9, 59), datetime.datetime(2026, 5, 28, 22, 9, 58), 'salt', 6.81, 69.62, None, 12.21, 136.15, 5.15, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:10:26.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:10:26.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:10:26.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:58, diff=28.261s, valid=True
2026-05-28T22:10:26.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:10:26.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:10:26.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:10:12, diff=14.263857s, valid=True
2026-05-28T22:10:26.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:10:26.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:09:57, diff=29.270402s, valid=True
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:10:26.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:10:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:10:12, diff=14.273344s, valid=True
2026-05-28T22:10:26.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:10:26.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:10:26.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:10:26.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931668.274015s, valid=True
2026-05-28T22:10:26.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:10:26.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:10:26.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:10:26.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:10:26.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:10:26.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:10:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:10:26.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:10:26.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:10:26.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:10:26.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:10:26.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:10:26.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:10:26.613 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:10:26.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:10:27.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:10:27.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:10:27.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:10:27.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:10:27.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-28T22:10:27.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:10:27.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:10:57.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:10:57.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:10:57.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:10:57.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:10:57.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:10:57.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:10: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-28T22:10:57.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:10:57.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-28T22:10:57.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:10:57.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:10:57.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:10:57.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-28T22:11:00.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-28T22:11:00.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:11:00.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:11:00.703 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:11:00.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:11:00.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:11:00.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:11:00.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:11:00.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:11:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:11:00.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:11:00.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:11:00.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:11:00.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:11:00.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:11:00.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:11:00.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:11:00.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:11:00.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:11:00.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:11:00.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:11:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:11:00.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:11:00.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:11:01.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:10:59
2026-05-28T22:11:01.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70138, datetime.datetime(2026, 5, 28, 22, 10, 59), datetime.datetime(2026, 5, 28, 22, 10, 59), 'salt', 6.81, 70.49, None, 12.03, 137.96, 4.98, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:11:01.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:11:01.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:11:01.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:10:59, diff=2.062402s, valid=True
2026-05-28T22:11:01.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:11:01.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:11:01.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:12, diff=-10.930736s, valid=True
2026-05-28T22:11:01.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:11:01.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:11:01.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:10:57, diff=4.084583s, valid=True
2026-05-28T22:11:01.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:11:01.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:11:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:11:01.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:11:01.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:11:01.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:11:01.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:12, diff=-10.911995s, valid=True
2026-05-28T22:11:01.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:11:01.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:11:01.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:11:01.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931703.088729s, valid=True
2026-05-28T22:11:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:11:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:11:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:11:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:11:01.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:11:01.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:11:01.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:11:01.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:11:01.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:11:01.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:11:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:11:01.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:11:01.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:11:01.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:11:01.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:11:02.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:11:02.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:11:02.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:11:02.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-28T22:11:02.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-28T22:11:02.203 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:11:02.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:11:32.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:11:32.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:11:32.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:11:32.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:11:32.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:11:32.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:11:32.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-28T22:11:32.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:11:32.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-28T22:11:32.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:11:32.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:11:32.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:11:32.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-28T22:11: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-28T22:11:36.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:11:36.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:11:36.133 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:11:36.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:11:36.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:11:36.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:11:36.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:11:36.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:11:36.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:11:36.153 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:11:36.153 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:11:36.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:11:36.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:11:36.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:11:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:11:36.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:11:36.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:11:36.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:11:36.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:11:36.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:11:36.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:11:36.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:11:36.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:11:36.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:11:29
2026-05-28T22:11:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70139, datetime.datetime(2026, 5, 28, 22, 11, 29), datetime.datetime(2026, 5, 28, 22, 11, 29), 'salt', 6.78, 70.92, None, 12.6, 139.0, 4.9, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:11:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:11:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:11:36.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:29, diff=7.477978s, valid=True
2026-05-28T22:11:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:11:36.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:11:36.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:12, diff=24.480835s, valid=True
2026-05-28T22:11:36.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:11:36.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:28, diff=8.487349s, valid=True
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:11:36.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:11:36.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:12, diff=24.490365s, valid=True
2026-05-28T22:11:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:11:36.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:11:36.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:11:36.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931738.491078s, valid=True
2026-05-28T22:11:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:11:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:11:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:11:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:11:36.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:11:36.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:11:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:11:36.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:11:36.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:11:36.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:11:36.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:11:36.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:11:36.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:11:36.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:11:37.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:11:37.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:11:37.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:11:37.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:11:37.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-28T22:11:37.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-28T22:11:37.698 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:11:37.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:12:07.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:12:07.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:12:07.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:12:08.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:12:08.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:12:08.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:12:08.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-28T22:12:08.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:12:08.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-28T22:12:08.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:12:08.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:12:08.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:12:08.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-28T22:12:10.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-28T22:12:10.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:12:10.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:12:10.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:12:10.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:12:10.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:12:10.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:12:10.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:12:10.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:12:10.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:12:10.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:12:10.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:12:10.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:12:11.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:12:11.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:12:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:12:11.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:12:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:12:11.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:12:11.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:12:11.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:12:11.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:12:11.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:12:11.220 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:12:11.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:12:00
2026-05-28T22:12:11.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70140, datetime.datetime(2026, 5, 28, 22, 12), datetime.datetime(2026, 5, 28, 22, 11, 59), 'salt', 6.71, 70.98, None, 12.74, 138.22, 4.88, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:12:11.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:12:11.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:12:11.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:59, diff=12.289597s, valid=True
2026-05-28T22:12:11.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:12:11.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:12:11.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:12, diff=-0.706932s, valid=True
2026-05-28T22:12:11.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:12:11.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:11:52, diff=19.300429s, valid=True
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:12:11.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:12:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:12, diff=-0.696514s, valid=True
2026-05-28T22:12:11.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:12:11.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:12:11.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:12:11.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931773.304165s, valid=True
2026-05-28T22:12:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:12:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:12:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:12:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:12:11.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:12:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:12:11.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:12:11.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:12:11.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:12:11.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:12:11.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:12:11.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:12:11.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:12:11.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:12:11.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:12:12.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:12:12.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:12:12.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:12:12.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-28T22:12:12.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-28T22:12:12.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:12:12.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:12:42.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:12:42.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:12: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-28T22:12:43.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:12:43.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:12:43.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:12:43.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:12:43.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:12:43.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:12:43.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:12:43.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:12:43.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:12:43.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-28T22:12:45.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:12:45.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:12:45.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:12:45.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:12:45.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:12:45.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:12:45.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:12:45.929 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:12:45.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:12:45.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:12:45.929 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:12:45.929 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:12:45.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:12:46.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:12:46.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:12:46.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:12:46.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:12:46.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:12:46.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:12:46.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:12:46.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:12:46.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:12:46.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:12:46.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:12:46.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:12:30
2026-05-28T22:12:46.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70141, datetime.datetime(2026, 5, 28, 22, 12, 30), datetime.datetime(2026, 5, 28, 22, 12, 30), 'salt', 6.75, 71.02, None, 13.06, 138.29, 4.88, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:12:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:12:46.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:12:46.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:30, diff=16.251966s, valid=True
2026-05-28T22:12:46.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:12:46.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:12:46.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:12, diff=34.254805s, valid=True
2026-05-28T22:12:46.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:12:46.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:28, diff=18.261433s, valid=True
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:12:46.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:12:46.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:12, diff=34.264427s, valid=True
2026-05-28T22:12:46.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:12:46.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:12:46.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:12:46.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931808.265107s, valid=True
2026-05-28T22:12:46.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:12:46.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:12:46.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:12:46.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:12:46.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:12:46.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:12:46.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:12:46.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:12:46.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:12:46.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:12:46.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:12:46.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:12:46.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:12:46.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:12:46.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:12:47.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:12:47.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:12:47.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:12:47.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-28T22:12:47.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-28T22:12:47.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:12:47.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:13:17.636 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:13:17.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:13:17.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:13:17.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:13:17.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:13:18.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:13:18.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-28T22:13:18.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:13:18.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-28T22:13:18.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:13:18.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:13:18.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:13:18.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-28T22:13:20.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-28T22:13:20.802 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:13:20.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:13:20.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:13:20.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:13:20.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:13:20.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:13:20.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:13:20.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:13:20.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:13:20.826 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:13:20.826 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:13:20.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:13:20.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:13:20.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:13:20.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:13:20.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:13:21.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:13:21.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:13:21.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:13:21.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:13:21.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:13:21.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:13:21.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:13:21.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:13:00
2026-05-28T22:13:21.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70142, datetime.datetime(2026, 5, 28, 22, 13), datetime.datetime(2026, 5, 28, 22, 13), 'salt', 6.75, 71.08, None, 12.85, 136.81, 4.87, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:13:21.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:13:21.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:13:21.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:00, diff=21.14529s, valid=True
2026-05-28T22:13:21.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:13:21.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:13:21.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:12, diff=9.148136s, valid=True
2026-05-28T22:13:21.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:13:21.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:13:21.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:12:58, diff=23.154645s, valid=True
2026-05-28T22:13:21.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:13:21.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:13:21.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:13:21.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:13:21.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:13:21.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:13:21.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:12, diff=9.157631s, valid=True
2026-05-28T22:13:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:13:21.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:13:21.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:13:21.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931843.158425s, valid=True
2026-05-28T22:13:21.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:13:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:13:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:13:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:13:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:13:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:13:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:13:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:13:21.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:13:21.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:13:21.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:13:21.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:13:21.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:13:21.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:13:21.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:13:22.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:13:22.176 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:13:22.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:13:22.176 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:13:22.176 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:13:22.261 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:13:22.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:13:52.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:13:52.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:13:52.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:13:52.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:13:52.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:13:52.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:13:52.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-28T22:13:52.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:13:52.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-28T22:13:52.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:13:52.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:13:52.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:13:52.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-28T22:13:55.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-28T22:13:55.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:13:55.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:13:55.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:13:55.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:13:55.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:13:55.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:13:55.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:13:55.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:13:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:13:55.403 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:13:55.403 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:13:55.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:13:55.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:13:55.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:13:55.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:13:55.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:13:55.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:13:55.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:13:55.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:13:55.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:13:55.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:13:55.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:13:55.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:13:55.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:13:30
2026-05-28T22:13:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70143, datetime.datetime(2026, 5, 28, 22, 13, 30), datetime.datetime(2026, 5, 28, 22, 13, 30), 'salt', 6.78, 71.18, None, 13.23, 139.61, 4.85, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:13:55.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:13:55.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:13:55.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:30, diff=25.795666s, valid=True
2026-05-28T22:13:55.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:13:55.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:13:55.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:12, diff=43.798521s, valid=True
2026-05-28T22:13:55.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:13:55.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:29, diff=26.805182s, valid=True
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:13:55.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:13:55.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:12, diff=43.808238s, valid=True
2026-05-28T22:13:55.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:13:55.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:13:55.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:13:55.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931877.808896s, valid=True
2026-05-28T22:13:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:13:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:13:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:13:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:13:55.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:13:55.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:13:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:13:55.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:13:55.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:13:55.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:13:56.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:13:56.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:13:56.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:13:56.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:13:56.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:13:56.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:13:56.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:13:56.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:13:56.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-28T22:13:56.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-28T22:13:56.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:13:56.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:14:26.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:14:26.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:14:26.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:14:27.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:14:27.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:14:27.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:14:27.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:14:27.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:14:27.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-28T22:14:27.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:14:27.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:14:27.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:14:27.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-28T22:14:29.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-28T22:14:29.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:14:29.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:14:29.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:14:29.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:14:29.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:14:29.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:14:29.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:14:29.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:14:29.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:14:29.863 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:14:29.863 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:14:29.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:14:29.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:14:29.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:14:30.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:14:30.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:14:30.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:14:30.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:14:30.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:14:30.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:14:30.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:14:30.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:14:30.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:14:30.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:14:01
2026-05-28T22:14:30.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70144, datetime.datetime(2026, 5, 28, 22, 14, 1), datetime.datetime(2026, 5, 28, 22, 14), 'salt', 6.78, 71.12, None, 12.67, 138.39, 4.86, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:14:30.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:14:30.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:14:30.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:14:00, diff=30.229382s, valid=True
2026-05-28T22:14:30.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:14:30.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:14:30.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:14:12, diff=18.238232s, valid=True
2026-05-28T22:14:30.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:14:30.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:13:59, diff=31.258171s, valid=True
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:14:30.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:14:30.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:14:30.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:14:12, diff=18.265779s, valid=True
2026-05-28T22:14:30.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:14:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:14:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:14:30.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931912.267236s, valid=True
2026-05-28T22:14:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:14:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:14:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:14:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:14:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:14:30.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:14:30.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:14:30.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:14:30.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:14:30.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:14:30.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:14:30.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:14:30.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:14:30.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:14:30.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:14:31.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:14:31.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:14:31.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:14:31.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-28T22:14:31.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-28T22:14:31.665 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:14:31.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:15:01.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:15:01.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:15:01.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:15:01.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:15:01.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:15:02.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:15:02.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-28T22:15:02.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:15:02.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-28T22:15:02.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:15:02.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:15:02.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:15:02.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-28T22:15:04.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:15:04.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:15:04.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:15:04.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:15:04.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:15:04.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:15:04.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:15:04.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:15:04.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:15:04.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:15:04.537 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:15:04.538 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:15:04.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:15:04.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:15:04.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:15:04.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:15:04.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:15:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:15:04.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:15:04.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:15:04.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:15:04.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:15:04.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:15:04.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:15:04.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:15:01
2026-05-28T22:15:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70146, datetime.datetime(2026, 5, 28, 22, 15, 1), datetime.datetime(2026, 5, 28, 22, 15, 1), 'salt', 6.65, 71.22, None, 13.02, 138.97, 4.84, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:15:04.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:15:04.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:15:04.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:01, diff=3.852376s, valid=True
2026-05-28T22:15:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:15:04.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:15:04.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:12, diff=-7.144848s, valid=True
2026-05-28T22:15:04.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:15:04.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:01, diff=3.861562s, valid=True
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:15:04.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:15:04.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:15:04.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:12, diff=-7.135456s, valid=True
2026-05-28T22:15:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:15:04.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:15:04.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:15:04.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931946.865237s, valid=True
2026-05-28T22:15:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:15:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:15:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:15:04.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:15:04.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:15:04.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:15:04.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:15:04.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:15:04.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:15:04.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:15:05.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:15:05.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:15:05.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:15:05.184 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:15:05.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:15:05.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:15:05.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:15:05.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:15:05.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-28T22:15:05.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-28T22:15:05.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:15:05.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:15:35.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:15:35.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:15:35.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:15:36.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:15:36.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:15:36.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:15:36.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-28T22:15:36.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:15:36.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-28T22:15:36.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:15:36.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:15:36.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:15:36.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-28T22:15:38.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-28T22:15:38.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:15:38.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:15:38.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:15:38.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:15:38.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:15:38.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:15:38.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:15:38.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:15:38.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:15:38.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:15:38.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:15:38.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:15:38.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:15:38.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:15:38.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:15:38.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:15:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:15:38.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:15:39.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:15:39.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:15:39.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:15:39.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:15:39.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:15:39.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:15:31
2026-05-28T22:15:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70147, datetime.datetime(2026, 5, 28, 22, 15, 31), datetime.datetime(2026, 5, 28, 22, 15, 31), 'salt', 6.65, 71.45, None, 12.67, 138.62, 4.79, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:15:39.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:15:39.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:15:39.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:31, diff=8.098173s, valid=True
2026-05-28T22:15:39.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:15:39.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:15:39.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:12, diff=27.101048s, valid=True
2026-05-28T22:15:39.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:15:39.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:30, diff=9.108049s, valid=True
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:15:39.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:15:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:15:12, diff=27.111475s, valid=True
2026-05-28T22:15:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:15:39.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:15:39.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:15:39.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=931981.112318s, valid=True
2026-05-28T22:15:39.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:15:39.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:15:39.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:15:39.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:15:39.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:15:39.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:15:39.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:15:39.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:15:39.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:15:39.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:15:39.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:15:39.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:15:40.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:15:40.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:15:40.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:15:40.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-28T22:15:40.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-28T22:15:40.378 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:15:40.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:16:10.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:16:10.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:16:10.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:16:10.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:16:10.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:16:10.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:16:10.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-28T22:16:10.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:16:10.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:16:10.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:16:10.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:16:10.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:16:10.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-28T22:16:13.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-28T22:16:13.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:16:13.426 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:16:13.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:16:13.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:16:13.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:16:13.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:16:13.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:16:13.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:16:13.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:16:13.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:16:13.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:16:13.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:16:13.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:16:13.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:16:13.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:16:13.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:16:13.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:16:13.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:16:13.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:16:13.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:16:13.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:16:13.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:16:13.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:16:13.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:16:02
2026-05-28T22:16:13.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70148, datetime.datetime(2026, 5, 28, 22, 16, 2), datetime.datetime(2026, 5, 28, 22, 16, 1), 'salt', 6.65, 71.65, None, 12.7, 140.38, 4.75, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:16:13.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:16:13.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:16:13.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:01, diff=12.778772s, valid=True
2026-05-28T22:16:13.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:16:13.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:16:13.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=1.781604s, valid=True
2026-05-28T22:16:13.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:16:13.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:01, diff=12.7881s, valid=True
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:16:13.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:16:13.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=1.791091s, valid=True
2026-05-28T22:16:13.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:16:13.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:16:13.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:16:13.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932015.79175s, valid=True
2026-05-28T22:16:13.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:16:13.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:16:13.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:16:13.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:16:13.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:16:13.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:16:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:16:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:16:13.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:16:13.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:16:13.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:16:14.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:16:14.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:16:14.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:16:14.329 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:16:14.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:16:14.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:16:14.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:16:14.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-28T22:16:14.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:16:14.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:16:14.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:16:44.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:16:44.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:16:44.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:16:45.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:16:45.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:16:45.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:16:45.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-28T22:16:45.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:16:45.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-28T22:16:45.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:16:45.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:16:45.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:16:45.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-28T22:16:47.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-28T22:16:47.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:16:47.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:16:47.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:16:47.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:16:47.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:16:47.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:16:47.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:16:47.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:16:47.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:16:47.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:16:47.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:16:47.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:16:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:16:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:16:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:16:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:16:48.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:16:48.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:16:48.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:16:48.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:16:48.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:16:48.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:16:48.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:16:48.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:16:32
2026-05-28T22:16:48.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70149, datetime.datetime(2026, 5, 28, 22, 16, 32), datetime.datetime(2026, 5, 28, 22, 16, 31), 'salt', 6.58, 71.98, None, 13.69, 137.89, 4.68, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:16:48.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:16:48.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:16:48.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:31, diff=17.1552s, valid=True
2026-05-28T22:16:48.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:16:48.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:16:48.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=36.158056s, valid=True
2026-05-28T22:16:48.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:16:48.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:16:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:31, diff=17.164798s, valid=True
2026-05-28T22:16:48.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:16:48.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:16:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:16:48.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:16:48.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:16:48.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:16:48.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=36.167841s, valid=True
2026-05-28T22:16:48.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:16:48.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:16:48.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:16:48.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932050.1685s, valid=True
2026-05-28T22:16:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:16:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:16:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:16:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:16:48.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:16:48.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:16:48.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:16:48.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:16:48.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:16:48.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:16:48.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:16:48.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:16:48.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:16:48.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:16:48.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:16:49.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:16:49.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:16:49.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:16:49.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-28T22:16:49.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-28T22:16:49.312 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:16:49.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:17:19.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:17:19.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:17:19.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:17:19.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:17:19.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:17:19.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:17:19.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-28T22:17:19.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:17:19.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-28T22:17:19.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:17:19.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:17:19.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:17:19.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-28T22:17: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-28T22:17:22.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:17:22.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:17:22.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:17:22.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:17:22.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:17:22.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:17:22.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:17:22.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:17:22.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:17:22.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:17:22.364 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:17:22.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:17:22.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:17:22.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:17:22.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:17:22.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:17:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:17:22.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:17:22.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:17:22.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:17:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:17:22.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:17:22.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:17:22.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:17:02
2026-05-28T22:17:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70150, datetime.datetime(2026, 5, 28, 22, 17, 2), datetime.datetime(2026, 5, 28, 22, 17, 1), 'salt', 6.55, 72.21, None, 13.52, 136.18, 4.64, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:17:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:17:22.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:17:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:17:01, diff=21.700575s, valid=True
2026-05-28T22:17:22.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:17:22.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:17:22.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=70.703434s, valid=True
2026-05-28T22:17:22.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:17:22.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:17:02, diff=20.710024s, valid=True
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:17:22.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:17:22.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=70.713044s, valid=True
2026-05-28T22:17:22.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:17:22.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:17:22.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:17:22.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932084.713705s, valid=True
2026-05-28T22:17:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:17:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:17:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:17:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:17:22.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:17:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:17:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:17:22.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:17:22.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:17:22.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:17:22.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:17:22.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:17:23.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:17:23.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:17:23.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:17:23.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:17:23.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:17:23.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:17:23.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-28T22:17:23.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-28T22:17:23.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:17:23.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:17:53.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:17:53.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:17:53.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:17:54.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:17:54.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:17:54.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:17:54.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-28T22:17:54.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:17:54.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-28T22:17:54.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:17:54.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:17:54.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:17:54.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-28T22:17:57.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-28T22:17:57.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:17:57.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:17:57.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:17:57.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:17:57.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:17:57.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:17:57.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:17:57.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:17:57.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:17:57.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:17:57.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:17:57.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:17:57.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:17:57.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:17:57.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:17:57.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:17:57.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:17:57.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:17:57.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:17:57.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:17:57.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:17:57.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:17:57.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:17:57.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:17:32
2026-05-28T22:17:57.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70151, datetime.datetime(2026, 5, 28, 22, 17, 32), datetime.datetime(2026, 5, 28, 22, 17, 32), 'salt', 6.51, 72.48, None, 13.52, 138.5, 4.58, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:17:57.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:17:57.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:17:57.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:17:32, diff=25.552236s, valid=True
2026-05-28T22:17:57.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:17:57.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:17:57.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=105.555157s, valid=True
2026-05-28T22:17:57.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:17:57.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:17:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:17:32, diff=25.561821s, valid=True
2026-05-28T22:17:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:17:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:17:57.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:17:57.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:17:57.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:17:57.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:17:57.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=105.564893s, valid=True
2026-05-28T22:17:57.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:17:57.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:17:57.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:17:57.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932119.565557s, valid=True
2026-05-28T22:17:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:17:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:17:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:17:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:17:57.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:17:57.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:17:57.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:17:57.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:17:57.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:17:57.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:17:57.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:17:57.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:17:57.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:17:57.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:17:58.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:17:58.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:17:58.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:17:58.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:17:58.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-28T22:17:58.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-28T22:17:59.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:17:59.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:18:29.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:18:29.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:18:29.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:18:29.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:18:29.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:18:30.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:18:30.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-28T22:18:30.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:18:30.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-28T22:18:30.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:18:30.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:18:30.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:18:30.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-28T22:18:33.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-28T22:18:33.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:18:33.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:18:33.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:18:33.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:18:33.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:18:33.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:18:33.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:18:33.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:18:33.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:18:33.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:18:33.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:18:33.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:18:33.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:18:33.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:18:33.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:18:33.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:18:33.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:18:33.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:18:33.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:18:33.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:18:33.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:18:33.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:18:33.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:18:33.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:18:33
2026-05-28T22:18:33.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70153, datetime.datetime(2026, 5, 28, 22, 18, 33), datetime.datetime(2026, 5, 28, 22, 18, 32), 'salt', 6.51, 72.81, None, 14.12, 140.01, 4.52, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:18:33.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:18:33.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:18:33.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:18:32, diff=1.832544s, valid=True
2026-05-28T22:18:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:18:33.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:18:33.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=141.835394s, valid=True
2026-05-28T22:18:33.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:18:33.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:18:33.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:18:31, diff=2.841854s, valid=True
2026-05-28T22:18:33.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:18:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:18:33.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:18:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:18:33.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:18:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:18:33.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=141.844882s, valid=True
2026-05-28T22:18:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:18:33.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:18:33.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:18:33.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932155.845541s, valid=True
2026-05-28T22:18:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:18:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:18:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:18:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:18:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:18:33.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:18:33.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:18:33.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:18:33.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:18:33.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:18:34.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:18:34.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:18:34.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:18:34.167 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:18:34.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:18:34.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:18:34.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:18:34.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:18:34.828 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:18:34.828 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:18:35.068 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:18:35.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:19:05.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:19:05.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:19:05.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:19:05.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:19:05.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:19:05.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:19:05.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-28T22:19:05.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:19:05.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-28T22:19:05.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:19:05.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:19:05.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:19:05.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-28T22:19:08.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:19:08.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:19:08.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:19:08.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:19:08.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:19:08.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:19:08.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:19:08.026 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:19:08.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:19:08.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:19:08.026 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:19:08.026 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:19:08.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:19:08.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:19:08.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:19:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:19:08.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:19:08.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:19:08.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:19:08.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:19:08.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:19:08.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:19:08.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:19:08.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:19:08.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:19:03
2026-05-28T22:19:08.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70154, datetime.datetime(2026, 5, 28, 22, 19, 3), datetime.datetime(2026, 5, 28, 22, 19, 2), 'salt', 6.58, 72.97, None, 13.9, 138.03, 4.49, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:19:08.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:19:08.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:19:08.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:19:02, diff=6.431993s, valid=True
2026-05-28T22:19:08.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:19:08.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:19:08.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=176.434861s, valid=True
2026-05-28T22:19:08.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:19:08.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:19:02, diff=6.441453s, valid=True
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:19:08.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:19:08.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=176.444489s, valid=True
2026-05-28T22:19:08.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:19:08.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:19:08.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:19:08.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932190.445149s, valid=True
2026-05-28T22:19:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:19:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:19:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:19:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:19:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:19:08.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:19:08.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:19:08.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:19:08.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:19:08.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:19:08.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:19:08.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:19:08.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:19:08.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:19:08.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:19:09.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:19:09.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:19:09.453 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:19:09.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-28T22:19:09.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-28T22:19:09.535 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:19:09.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:19:39.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:19:39.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:19:39.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:19:39.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:19:39.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:19:39.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:19:39.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:19:39.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:19:39.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-28T22:19:39.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:19:39.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:19:39.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:19:39.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:19:42.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-28T22:19:42.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:19:42.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:19:42.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:19:42.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:19:42.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:19:42.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:19:42.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:19:42.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:19:42.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:19:42.381 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:19:42.381 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:19:42.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:19:42.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:19:42.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:19:42.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:19:42.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:19:42.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:19:42.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:19:42.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:19:42.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:19:42.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:19:42.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:19:42.646 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:19:42.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:19:33
2026-05-28T22:19:42.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70155, datetime.datetime(2026, 5, 28, 22, 19, 33), datetime.datetime(2026, 5, 28, 22, 19, 33), 'salt', 6.61, 73.04, None, 14.29, 136.67, 4.48, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:19:42.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:19:42.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:19:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:19:33, diff=9.710378s, valid=True
2026-05-28T22:19:42.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:19:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:19:42.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=210.713199s, valid=True
2026-05-28T22:19:42.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:19:42.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:19:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:19:23, diff=19.719899s, valid=True
2026-05-28T22:19:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:19:42.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:19:42.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:19:42.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:19:42.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:19:42.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:19:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=210.72289s, valid=True
2026-05-28T22:19:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:19:42.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:19:42.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:19:42.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932224.723542s, valid=True
2026-05-28T22:19:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:19:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:19:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:19:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:19:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:19:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:19:42.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:19:42.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:19:42.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:19:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:19:42.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:19:42.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:19:43.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:19:43.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:19:43.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:19:43.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:19:43.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:19:43.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:19:43.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-28T22:19:43.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-28T22:19:43.968 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:19:43.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:20:13.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:20:13.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:20:13.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:20:14.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:20:14.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:20:14.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:20:14.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-28T22:20:14.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:20:14.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:20:14.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:20:14.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:20:14.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:20: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-28T22:20:17.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-28T22:20:17.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:20:17.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:20:17.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:20:17.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:20:17.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:20:17.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:20:17.230 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:20:17.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:20:17.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:20:17.231 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:20:17.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:20:17.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:20:17.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:20:17.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:20:17.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:20:17.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:20:17.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:20:17.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:20:17.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:20:17.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:20:17.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:20:17.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:20:17.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:20:17.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:20:03
2026-05-28T22:20:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70156, datetime.datetime(2026, 5, 28, 22, 20, 3), datetime.datetime(2026, 5, 28, 22, 20, 3), 'salt', 6.51, 73.01, None, 14.12, 140.03, 4.48, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:20:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:20:17.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:20:17.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:20:03, diff=14.544204s, valid=True
2026-05-28T22:20:17.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:20:17.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:20:17.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=245.547086s, valid=True
2026-05-28T22:20:17.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:20:17.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:20:17.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:19:55, diff=22.553768s, valid=True
2026-05-28T22:20:17.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:20:17.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:20:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:20:17.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:20:17.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:20:17.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:20:17.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=245.556808s, valid=True
2026-05-28T22:20:17.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:20:17.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:20:17.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:20:17.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932259.557462s, valid=True
2026-05-28T22:20:17.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:20:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:20:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:20:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:20:17.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:20:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:20:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:20:17.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:20:17.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:20:17.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:20:17.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:20:17.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:20:17.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:20:17.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:20:18.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:20:18.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:20:18.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:20:18.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:20:18.533 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:20:18.533 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:20:18.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:20:18.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:20:48.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:20:48.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:20:48.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:20:48.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:20:48.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:20:49.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:20:49.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-28T22:20:49.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:20:49.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-28T22:20:49.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:20:49.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:20:49.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:20:49.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-28T22:20:51.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:20:51.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:20:51.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:20:51.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:20:51.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:20:51.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:20:51.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:20:51.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:20:51.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:20:51.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:20:51.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:20:51.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:20:51.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:20:51.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:20:51.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:20:51.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:20:51.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:20:51.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:20:51.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:20:51.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:20:51.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:20:51.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:20:51.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:20:51.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:20:52.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:20:34
2026-05-28T22:20:52.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70157, datetime.datetime(2026, 5, 28, 22, 20, 34), datetime.datetime(2026, 5, 28, 22, 20, 33), 'salt', 6.58, 73.17, None, 13.8, 138.64, 4.45, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:20:52.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:20:52.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:20:52.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:20:33, diff=19.045753s, valid=True
2026-05-28T22:20:52.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:20:52.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:20:52.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=280.050556s, valid=True
2026-05-28T22:20:52.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:20:52.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:20:26, diff=26.057446s, valid=True
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:20:52.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:20:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=280.060522s, valid=True
2026-05-28T22:20:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:20:52.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:20:52.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:20:52.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932294.061202s, valid=True
2026-05-28T22:20:52.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:20:52.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:20:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:20:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:20:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:20:52.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:20:52.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:20:52.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:20:52.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:20:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:20:52.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:20:52.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:20:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:20:52.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:20:52.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:20:53.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:20:53.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:20:53.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:20:53.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-28T22:20:53.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-28T22:20:53.377 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:20:53.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:21:23.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:21:23.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:21:23.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:21:23.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:21:23.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:21:24.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:21:24.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-28T22:21:24.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:21:24.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-28T22:21:24.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:21:24.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:21:24.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:21:24.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-28T22:21:26.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:21:26.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:21:26.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:21:26.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:21:26.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:21:26.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:21:26.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:21:26.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:21:26.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:21:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:21:26.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:21:26.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:21:26.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:21:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:21:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:21:26.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:21:26.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:21:26.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T22:21:26.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:21:26.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-28T22:21:26.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:21:26.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:21:26.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:21:26.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:21:27.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:21:04
2026-05-28T22:21:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70158, datetime.datetime(2026, 5, 28, 22, 21, 4), datetime.datetime(2026, 5, 28, 22, 21, 3), 'salt', 6.51, 73.34, None, 13.9, 138.15, 4.41, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:21:27.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:21:27.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:21:27.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:21:03, diff=24.063666s, valid=True
2026-05-28T22:21:27.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:21:27.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T22:21:27.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=315.06649s, valid=True
2026-05-28T22:21:27.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:21:27.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:20:58, diff=29.073014s, valid=True
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:21:27.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-28T22:21:27.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:16:12, diff=315.076014s, valid=True
2026-05-28T22:21:27.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:21:27.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:21:27.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:21:27.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932329.076667s, valid=True
2026-05-28T22:21:27.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:21:27.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:21:27.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:21:27.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:21:27.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:21:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:21:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:21:27.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:21:27.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:21:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:21:27.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:21:27.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:21:27.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:21:27.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:21:27.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:21:27.983 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:21:28.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:21:28.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:21:28.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-28T22:21:28.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-28T22:21:28.260 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:21:28.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:21:58.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:21:58.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:21:58.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:21:58.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:21:58.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:21:58.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:21:58.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-28T22:21:58.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:21:58.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-28T22:21:58.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:21:58.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:21:58.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:21:58.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-28T22:22:01.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-28T22:22:01.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:22:01.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:22:01.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:22:01.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:22:01.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:22:01.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:22:01.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:22:01.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:22:01.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:22:01.311 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:22:01.311 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:22:01.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:22:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:22:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:22:01.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:22:01.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:22:01.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:22:01.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:22:01.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:22:01.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:22:01.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:22:01.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:22:01.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:22:01.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:21:34
2026-05-28T22:22:01.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70159, datetime.datetime(2026, 5, 28, 22, 21, 34), datetime.datetime(2026, 5, 28, 22, 21, 34), 'salt', 6.71, 73.51, None, 14.12, 139.89, 4.39, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:22:01.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:22:01.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:22:01.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:21:34, diff=27.646663s, valid=True
2026-05-28T22:22:01.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:22:01.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:22:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:22:12, diff=-10.350452s, valid=True
2026-05-28T22:22:01.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:22:01.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:21:29, diff=32.656274s, valid=True
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:22:01.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:22:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:22:12, diff=-10.340682s, valid=True
2026-05-28T22:22:01.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:22:01.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:22:01.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:22:01.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932363.659987s, valid=True
2026-05-28T22:22:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:22:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:22:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:22:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:22:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:22:01.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:22:01.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:22:01.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:22:01.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:22:01.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:22:01.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:22:01.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:22:01.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:22:01.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:22:02.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:22:02.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:22:02.741 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:22:02.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:22:02.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-28T22:22:02.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-28T22:22:02.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:22:02.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:22:32.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:22:32.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:22:32.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:22:33.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:22:33.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:22:33.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:22:33.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:22:33.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:22:33.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-28T22:22:33.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:22:33.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:22:33.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:22:33.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-28T22:22:36.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-28T22:22:36.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:22:36.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:22:36.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:22:36.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:22:36.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:22:36.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:22:36.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:22:36.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:22:36.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:22:36.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:22:36.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:22:36.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:22:36.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:22:36.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:22:36.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:22:36.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:22:36.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:22:36.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:22:36.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:22:36.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:22:36.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:22:36.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:22:36.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:22:36.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:22:34
2026-05-28T22:22:36.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70161, datetime.datetime(2026, 5, 28, 22, 22, 34), datetime.datetime(2026, 5, 28, 22, 22, 34), 'salt', 6.75, 73.41, None, 13.48, 137.75, 4.42, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:22:36.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:22:36.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:22:36.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:22:34, diff=2.376092s, valid=True
2026-05-28T22:22:36.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:22:36.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:22:36.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:12, diff=-35.621062s, valid=True
2026-05-28T22:22:36.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:22:36.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:22:32, diff=4.385553s, valid=True
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:22:36.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:22:36.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:22:36.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:12, diff=-35.611455s, valid=True
2026-05-28T22:22:36.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:22:36.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:22:36.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:22:36.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932398.38922s, valid=True
2026-05-28T22:22:36.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:22:36.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:22:36.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:22:36.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:22:36.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:22:36.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:22:36.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:22:36.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:22:36.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:22:36.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:22:36.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:22:36.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:22:36.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:22:36.709 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:22:36.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:22:37.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:22:37.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:22:37.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:22:37.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-28T22:22:37.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-28T22:22:37.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:22:37.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:23:07.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:23:07.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:23:07.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:23:07.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:23:08.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:23:08.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:23:08.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:23:08.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:23:08.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-28T22:23:08.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:23:08.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:23:08.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:23:08.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-28T22:23:10.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:23:10.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:23:10.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:23:10.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:23:10.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:23:10.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:23:10.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:23:10.740 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:23:10.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:23:10.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:23:10.740 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:23:10.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:23:10.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:23:10.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:23:10.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:23:10.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:23:10.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:23:10.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:23:10.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:23:10.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T22:23:10.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:23:11.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:23:11.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:23:11.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:23:11.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:23:05
2026-05-28T22:23:11.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70162, datetime.datetime(2026, 5, 28, 22, 23, 5), datetime.datetime(2026, 5, 28, 22, 23, 4), 'salt', 6.68, 73.31, None, 13.66, 139.65, 4.43, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:23:11.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:23:11.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:23:11.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:04, diff=7.065881s, valid=True
2026-05-28T22:23:11.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:23:11.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:23:11.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:12, diff=-0.93133s, valid=True
2026-05-28T22:23:11.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:23:11.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:04, diff=7.075224s, valid=True
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:23:11.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T22:23:11.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:12, diff=-0.921795s, valid=True
2026-05-28T22:23:11.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:23:11.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:23:11.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:23:11.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932433.07887s, valid=True
2026-05-28T22:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:23:11.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:23:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:23:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:23:11.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:23:11.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:23:11.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:23:11.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:23:11.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:23:11.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:23:11.704 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:23:12.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:23:12.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:23:12.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:23:12.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-28T22:23:12.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-28T22:23:12.314 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:23:12.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:23:42.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:23:42.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:23:42.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:23:42.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:23:42.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:23:42.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:23:42.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-28T22:23:43.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:23:43.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-28T22:23:43.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:23:43.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:23:43.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:23:43.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-28T22:23:45.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-28T22:23:45.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:23:45.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:23:45.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:23:45.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:23:45.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:23:45.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:23:45.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:23:45.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:23:45.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:23:45.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:23:45.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:23:45.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:23:45.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:23:45.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:23:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:23:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:23:45.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:23:45.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:23:45.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:23:45.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:23:45.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:23:45.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:23:45.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:23:45.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:23:35
2026-05-28T22:23:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70163, datetime.datetime(2026, 5, 28, 22, 23, 35), datetime.datetime(2026, 5, 28, 22, 23, 34), 'salt', 6.75, 73.17, None, 13.66, 136.81, 4.46, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:23:45.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:23:45.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:23:45.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:34, diff=11.780282s, valid=True
2026-05-28T22:23:45.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:23:45.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:23:45.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:12, diff=-26.216869s, valid=True
2026-05-28T22:23:45.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:23:45.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:23:45.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:25, diff=20.789688s, valid=True
2026-05-28T22:23:45.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:23:45.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:23:45.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:23:45.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:23:45.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:23:45.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:23:45.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:12, diff=-26.207322s, valid=True
2026-05-28T22:23:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:23:45.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:23:45.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:23:45.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932467.793355s, valid=True
2026-05-28T22:23:45.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:23:45.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:23:45.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:23:45.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:23:45.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:23:45.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:23:45.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:23:45.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:23:45.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:23:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:23:45.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:23:46.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:23:46.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:23:46.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:23:46.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:23:46.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:23:46.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:23:46.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:23:46.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-28T22:23:46.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-28T22:23:46.864 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:23:46.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:24:16.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:24:16.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:24:16.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:24:17.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:24:17.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:24:17.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:24: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-28T22:24:17.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:24:17.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-28T22:24:17.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:24:17.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:24:17.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:24:17.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-28T22:24:20.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:24:20.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:24:20.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:24:20.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:24:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:24:20.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:24:20.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:24:20.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:24:20.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:24:20.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:24:20.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:24:20.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:24:20.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:24:20.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:24:20.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:24:20.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:24:20.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:24:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:24:20.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:24:20.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T22:24:20.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:24:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:24:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:24:20.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:24:20.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:24:05
2026-05-28T22:24:20.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70164, datetime.datetime(2026, 5, 28, 22, 24, 5), datetime.datetime(2026, 5, 28, 22, 24, 5), 'salt', 6.75, 73.21, None, 13.41, 139.51, 4.46, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:24:20.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:24:20.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:24:20.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:05, diff=15.383916s, valid=True
2026-05-28T22:24:20.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:24:20.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:24:20.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:12, diff=8.386779s, valid=True
2026-05-28T22:24:20.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:24:20.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:23:56, diff=24.393312s, valid=True
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:24:20.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T22:24:20.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:12, diff=8.396326s, valid=True
2026-05-28T22:24:20.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:24:20.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:24:20.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:24:20.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932502.396977s, valid=True
2026-05-28T22:24:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:24:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:24:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:24:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:24:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:24:20.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:24:20.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:24:20.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:24:20.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:24:20.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:24:20.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:24:20.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:24:20.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:24:20.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:24:21.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:24:21.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:24:21.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:24:21.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:24:21.454 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:24:21.454 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:24:21.625 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:24:21.626 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:24:51.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:24:51.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:24:51.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:24:51.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:24:51.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:24:52.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:24:52.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:24:52.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:24:52.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-28T22:24:52.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:24:52.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:24:52.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:24:52.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-28T22:24:54.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-28T22:24:54.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:24:54.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:24:54.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:24:54.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:24:54.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:24:54.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:24:54.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:24:54.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:24:54.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:24:54.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:24:54.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:24:54.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:24:54.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:24:54.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:24:54.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:24:54.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:24:54.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:24:54.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:24:54.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:24:54.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:24:54.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:24:54.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:24:54.873 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:24:54.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:24:35
2026-05-28T22:24:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70165, datetime.datetime(2026, 5, 28, 22, 24, 35), datetime.datetime(2026, 5, 28, 22, 24, 35), 'salt', 6.75, 73.04, None, 12.85, 139.89, 4.49, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:24:54.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:24:54.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:24:54.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:35, diff=19.937667s, valid=True
2026-05-28T22:24:54.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:24:54.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:24:54.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:12, diff=-17.059522s, valid=True
2026-05-28T22:24:54.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:24:54.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:28, diff=26.947132s, valid=True
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:24:54.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:24:54.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:12, diff=-17.049804s, valid=True
2026-05-28T22:24:54.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:24:54.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:24:54.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:24:54.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932536.950864s, valid=True
2026-05-28T22:24:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:24:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:24:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:24:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:24:54.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:24:55.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:24:55.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:24:55.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:24:55.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:24:55.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:24:55.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:24:55.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:24:55.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:24:55.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:24:55.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:24:55.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:24:56.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:24:56.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:24:56.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-28T22:24:56.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-28T22:24:56.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:24:56.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:25:26.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:25:26.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:25:26.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:25:26.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:25:26.746 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:25:27.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:25:27.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-28T22:25:27.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:25:27.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-28T22:25:27.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:25:27.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:25:27.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:25:27.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:25:29.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:25:29.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:25:29.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:25:29.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:25:29.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:25:29.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:25:29.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:25:29.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:25:29.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:25:29.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:25:29.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:25:29.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:25:29.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:25:29.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:25:29.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:25:29.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:25:29.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:25:29.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:25:29.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:25:29.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T22:25:29.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:25:29.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:25:29.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:25:29.808 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:25:29.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:25:06
2026-05-28T22:25:29.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70166, datetime.datetime(2026, 5, 28, 22, 25, 6), datetime.datetime(2026, 5, 28, 22, 25, 6), 'salt', 6.78, 73.01, None, 13.48, 136.55, 4.49, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:25:29.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:25:29.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:25:29.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:06, diff=23.875431s, valid=True
2026-05-28T22:25:29.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:25:29.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:25:29.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:12, diff=17.879157s, valid=True
2026-05-28T22:25:29.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:25:29.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:25:29.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:24:59, diff=30.885786s, valid=True
2026-05-28T22:25:29.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:25:29.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:25:29.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:25:29.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:25:29.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:25:29.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T22:25:29.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:12, diff=17.888932s, valid=True
2026-05-28T22:25:29.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:25:29.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:25:29.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:25:29.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932571.889614s, valid=True
2026-05-28T22:25:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:25:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:25:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:25:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:25:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:25:29.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:25:29.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:25:29.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:25:29.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:25:30.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:25:30.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:25:30.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:25:30.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:25:30.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:25:30.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:25:30.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:25:31.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:25:31.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:25:31.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:25:31.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:25:31.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:25:31.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:26:01.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:26:01.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:26:01.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:26:01.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:26:01.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:26:01.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:26:01.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-28T22:26:01.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:26:01.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-28T22:26:01.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:26:01.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:26:01.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:26:01.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-28T22:26:03.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:26:03.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:26:03.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:26:03.943 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:26:03.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:26:03.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:26:03.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:26:03.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:26:03.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:26:03.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:26:03.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:26:03.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:26:03.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:26:04.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:26:04.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:26:04.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:26:04.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:26:04.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:26:04.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:26:04.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T22:26:04.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:26:04.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:26:04.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:26:04.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:26:04.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:25:36
2026-05-28T22:26:04.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70167, datetime.datetime(2026, 5, 28, 22, 25, 36), datetime.datetime(2026, 5, 28, 22, 25, 36), 'salt', 6.81, 72.91, None, 14.43, 140.03, 4.51, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:26:04.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:26:04.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:26:04.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:36, diff=28.281042s, valid=True
2026-05-28T22:26:04.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:26:04.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:26:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:26:12, diff=-7.714649s, valid=True
2026-05-28T22:26:04.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:26:04.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:25:31, diff=33.294134s, valid=True
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:26:04.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T22:26:04.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:26:12, diff=-7.702693s, valid=True
2026-05-28T22:26:04.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:26:04.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:26:04.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:26:04.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932606.298002s, valid=True
2026-05-28T22:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:26:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:26:04.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:26:04.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:26:04.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:26:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:26:04.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:26:04.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:26:04.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:26:04.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:26:04.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:26:05.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:26:05.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:26:05.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:26:05.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:26:05.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-28T22:26:05.432 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:26:05.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:26:35.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:26:35.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:26:35.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:26:35.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:26:35.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:26:35.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:26:35.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-28T22:26:35.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:26:35.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-28T22:26:35.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:26:35.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:26:35.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:26:35.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-28T22:26:39.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-28T22:26:39.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:26:39.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:26:39.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:26:39.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:26:39.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:26:39.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:26:39.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:26:39.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:26:39.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:26:39.050 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:26:39.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:26:39.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:26:39.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:26:39.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:26:39.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:26:39.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:26:39.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:26:39.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:26:39.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:26:39.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:26:39.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:26:39.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:26:39.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:26:39.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:26:37
2026-05-28T22:26:39.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70169, datetime.datetime(2026, 5, 28, 22, 26, 37), datetime.datetime(2026, 5, 28, 22, 26, 36), 'salt', 6.71, 72.44, None, 13.52, 138.95, 4.59, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:26:39.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:26:39.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:26:39.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:26:36, diff=3.40912s, valid=True
2026-05-28T22:26:39.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:26:39.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:26:39.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:12, diff=-32.586953s, valid=True
2026-05-28T22:26:39.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:26:39.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:26:39.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:26:34, diff=5.421554s, valid=True
2026-05-28T22:26:39.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:26:39.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:26:39.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:26:39.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:26:39.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:26:39.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:26:39.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:12, diff=-32.574566s, valid=True
2026-05-28T22:26:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:26:39.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:26:39.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:26:39.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932641.426257s, valid=True
2026-05-28T22:26:39.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:26:39.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:26:39.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:26:39.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:26:39.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:26:39.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:26:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:26:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:26:39.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:26:39.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:26:39.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:26:39.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:26:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:26:39.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:26:40.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:26:40.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:26:40.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:26:40.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:26:40.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-28T22:26:40.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-28T22:26:40.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:26:40.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:27:10.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:27:10.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:27:10.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:27:11.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:27:11.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:27:11.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:27:11.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:27:11.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:27:11.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-28T22:27:11.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:27:11.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:27:11.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:27:11.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-28T22:27:14.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-28T22:27:14.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:27:14.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:27:14.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:27:14.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:27:14.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:27:14.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:27:14.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:27:14.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:27:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:27:14.065 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:27:14.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:27:14.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:27:14.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:27:14.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:27:14.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:27:14.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:27:14.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:27:14.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:27:14.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:27:14.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:27:14.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:27:14.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:27:14.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:27:14.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:27:07
2026-05-28T22:27:14.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70170, datetime.datetime(2026, 5, 28, 22, 27, 7), datetime.datetime(2026, 5, 28, 22, 27, 6), 'salt', 6.88, 72.35, None, 13.66, 139.96, 4.62, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:27:14.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:27:14.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:27:14.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:06, diff=8.414713s, valid=True
2026-05-28T22:27:14.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:27:14.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:27:14.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:12, diff=2.417578s, valid=True
2026-05-28T22:27:14.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:27:14.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:05, diff=9.424273s, valid=True
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:27:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:27:14.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:12, diff=2.427383s, valid=True
2026-05-28T22:27:14.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:27:14.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:27:14.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:27:14.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932676.428084s, valid=True
2026-05-28T22:27:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:27:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:27:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:27:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:27:14.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:27:14.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:27:14.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:27:14.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:27:14.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:27:14.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:27:14.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:27:14.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:27:14.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:27:14.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:27:15.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:27:15.416 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:27:15.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:27:15.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:27:15.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-28T22:27:15.516 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:27:15.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:27:15.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:27:45.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:27:45.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:27:45.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:27:46.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:27:46.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:27:46.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:27:46.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-28T22:27:46.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:27:46.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-28T22:27:46.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:27:46.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:27:46.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:27: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-28T22:27:48.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:27:48.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:27:48.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:27:48.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:27:48.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:27:48.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:27:48.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:27:48.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:27:48.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:27:48.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:27:48.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:27:48.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:27:48.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:27:48.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:27:48.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:27:48.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:27:48.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:27:48.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:27:48.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:27:48.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:27:48.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:27:48.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:27:48.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:27:48.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:27:49.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:27:37
2026-05-28T22:27:49.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70171, datetime.datetime(2026, 5, 28, 22, 27, 37), datetime.datetime(2026, 5, 28, 22, 27, 37), 'salt', 6.95, 72.18, None, 13.69, 139.07, 4.66, 832.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:27:49.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:27:49.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:27:49.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:37, diff=12.050471s, valid=True
2026-05-28T22:27:49.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:27:49.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:27:49.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:12, diff=-22.946624s, valid=True
2026-05-28T22:27:49.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:27:49.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:36, diff=13.060002s, valid=True
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:27:49.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:27:49.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:12, diff=-22.936942s, valid=True
2026-05-28T22:27:49.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:27:49.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:27:49.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:27:49.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932711.063718s, valid=True
2026-05-28T22:27:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:27:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:27:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:27:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:27:49.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:27:49.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:27:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:27:49.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:27:49.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:27:49.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:27:49.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:27:49.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:27:49.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:27:49.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:27:49.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:27:50.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:27:50.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:27:50.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:27:50.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-28T22:27:50.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-28T22:27:50.307 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:27:50.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:28:20.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:28:20.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:28:20.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:28:20.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:28:20.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:28:20.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:28:20.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:28:20.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:28:20.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-28T22:28:20.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:28:20.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:28:20.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:28:20.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-28T22:28:23.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-28T22:28:23.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:28:23.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:28:23.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:28:23.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:28:23.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:28:23.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:28:23.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:28:23.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:28:23.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:28:23.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:28:23.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:28:23.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:28:23.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:28:23.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:28:23.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:28:23.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:28:23.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:28:23.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:28:23.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:28:23.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:28:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:28:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:28:23.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:28:23.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:28:07
2026-05-28T22:28:23.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70172, datetime.datetime(2026, 5, 28, 22, 28, 7), datetime.datetime(2026, 5, 28, 22, 28, 7), 'salt', 6.91, 71.85, None, 13.2, 140.41, 4.72, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:28:23.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:28:23.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:28:23.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:07, diff=16.614902s, valid=True
2026-05-28T22:28:23.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:28:23.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:28:23.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:12, diff=11.617714s, valid=True
2026-05-28T22:28:23.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:28:23.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:27:58, diff=25.624314s, valid=True
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:28:23.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:28:23.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:12, diff=11.627329s, valid=True
2026-05-28T22:28:23.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:28:23.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:28:23.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:28:23.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932745.627999s, valid=True
2026-05-28T22:28:23.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:28:23.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:28:23.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:28:23.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:28:23.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:28:23.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:28:23.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:28:23.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:28:23.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:28:23.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:28:23.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:28:23.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:28:23.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:28:24.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:28:24.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:28:24.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:28:24.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:28:24.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:28:24.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-28T22:28:24.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-28T22:28:24.940 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:28:24.940 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:28:54.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:28:54.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:28:54.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:28:55.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:28:55.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:28:55.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:28:55.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-28T22:28:55.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:28:55.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:28:55.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:28:55.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:28:55.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:28:55.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-28T22:28:57.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:28:57.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:28:57.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:28:57.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:28:57.977 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:28:57.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:28:58.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:28:58.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:28:58.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:28:58.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:28:58.000 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:28:58.000 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:28:58.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:28:58.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:28:58.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:28:58.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:28:58.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:28:58.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:28:58.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:28:58.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:28:58.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:28:58.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:28:58.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:28:58.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:28:58.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:28:37
2026-05-28T22:28:58.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70173, datetime.datetime(2026, 5, 28, 22, 28, 37), datetime.datetime(2026, 5, 28, 22, 28, 37), 'salt', 6.95, 71.75, None, 13.2, 138.81, 4.75, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:28:58.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:28:58.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:28:58.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:37, diff=21.3268s, valid=True
2026-05-28T22:28:58.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:28:58.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:28:58.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:12, diff=-13.670294s, valid=True
2026-05-28T22:28:58.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:28:58.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:28:29, diff=29.336377s, valid=True
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:28:58.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:28:58.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:12, diff=-13.660578s, valid=True
2026-05-28T22:28:58.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:28:58.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:28:58.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:28:58.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932780.340105s, valid=True
2026-05-28T22:28:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:28:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:28:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:28:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:28:58.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:28:58.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:28:58.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:28:58.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:28:58.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:28:58.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:28:58.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:28:58.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:28:58.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:28:58.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:28:58.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:28:59.229 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:28:59.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:28:59.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:28:59.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-28T22:28:59.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-28T22:28:59.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:28:59.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:29:29.428 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:29:29.428 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:29:29.428 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:29:29.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:29:29.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:29:30.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:29:30.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-28T22:29:30.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:29:30.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-28T22:29:30.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:29:30.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:29:30.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:29:30.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:29:32.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-28T22:29:32.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:29:32.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:29:32.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:29:32.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:29:32.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:29:32.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:29:32.638 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:29:32.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:29:32.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:29:32.638 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:29:32.638 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:29:32.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:29:32.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:29:32.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:29:32.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:29:32.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:29:32.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:29:32.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:29:32.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:29:32.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:29:32.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:29:32.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:29:32.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:29:32.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:29:08
2026-05-28T22:29:32.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70174, datetime.datetime(2026, 5, 28, 22, 29, 8), datetime.datetime(2026, 5, 28, 22, 29, 7), 'salt', 7.01, 71.45, None, 13.9, 140.9, 4.8, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:29:32.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:29:32.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:29:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:07, diff=25.952206s, valid=True
2026-05-28T22:29:32.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:29:32.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:29:32.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:12, diff=20.955091s, valid=True
2026-05-28T22:29:32.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:29:32.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:00, diff=32.96159s, valid=True
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:29:32.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:29:32.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:29:32.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:12, diff=20.96468s, valid=True
2026-05-28T22:29:32.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:29:32.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:29:32.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:29:32.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932814.965341s, valid=True
2026-05-28T22:29:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:29:32.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:29:32.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:29:32.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:29:32.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:29:33.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:29:33.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:29:33.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:29:33.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:29:33.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:29:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:29:33.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:29:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:29:33.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:29:33.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:29:33.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:29:34.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:29:34.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:29:34.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-28T22:29:34.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-28T22:29:34.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:29:34.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:30:04.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:30:04.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:30: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-28T22:30:04.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:30:04.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:30:04.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:30:04.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-28T22:30:05.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:30:05.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-28T22:30:05.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:30:05.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:30:05.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:30:05.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:30:07.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-28T22:30:07.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:30:07.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:30:07.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:30:07.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:30:07.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:30:07.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:30:07.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:30:07.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:30:07.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:30:07.400 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:30:07.400 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:30:07.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:30:07.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:30:07.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:30:07.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:30:07.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:30:07.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:30:07.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:30:07.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:30:07.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:30:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:30:07.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:30:07.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:30:07.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:29:38
2026-05-28T22:30:07.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70175, datetime.datetime(2026, 5, 28, 22, 29, 38), datetime.datetime(2026, 5, 28, 22, 29, 38), 'salt', 7.01, 71.28, None, 13.59, 138.43, 4.83, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:30:07.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:30:07.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:30:07.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:38, diff=29.718493s, valid=True
2026-05-28T22:30:07.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:30:07.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:30:07.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:30:12, diff=-4.278721s, valid=True
2026-05-28T22:30:07.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:30:07.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:30:07.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:29:31, diff=36.727734s, valid=True
2026-05-28T22:30:07.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:30:07.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:30:07.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:30:07.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:30:07.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:30:07.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:30:07.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:30:12, diff=-4.26941s, valid=True
2026-05-28T22:30:07.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:30:07.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:30:07.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:30:07.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932849.731216s, valid=True
2026-05-28T22:30:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:30:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:30:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:30:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:30:07.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:30:07.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:30:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:30:07.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:30:07.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:30:07.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:30:07.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:30:07.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:30:08.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:30:08.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:30:08.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:30:08.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:30:08.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:30:08.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:30:08.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:30:08.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:30:08.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:30:08.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:30:38.842 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:30:38.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:30:38.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:30:39.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:30:39.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:30:39.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:30:39.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-28T22:30:39.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:30:39.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-28T22:30:39.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:30:39.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:30:39.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:30:39.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-28T22:30:42.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-28T22:30:42.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:30:42.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:30:42.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:30:42.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:30:42.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:30:42.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:30:42.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:30:42.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:30:42.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:30:42.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:30:42.670 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:30:42.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:30:42.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:30:42.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:30:42.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:30:42.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:30:42.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:30:42.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:30:42.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:30:42.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:30:42.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:30:42.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:30:42.927 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:30:42.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:30:38
2026-05-28T22:30:42.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70177, datetime.datetime(2026, 5, 28, 22, 30, 38), datetime.datetime(2026, 5, 28, 22, 30, 38), 'salt', 7.01, 71.08, None, 12.85, 139.51, 4.87, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:30:42.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:30:42.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:30:42.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:30:38, diff=4.990203s, valid=True
2026-05-28T22:30:42.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:30:42.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:30:42.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:12, diff=-29.006881s, valid=True
2026-05-28T22:30:42.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:30:42.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:30:42.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:30:34, diff=8.999827s, valid=True
2026-05-28T22:30:42.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:30:42.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:30:43.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:30:43.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:30:43.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:30:43.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:30:43.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:12, diff=-28.997101s, valid=True
2026-05-28T22:30:43.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:30:43.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:30:43.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:30:43.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932885.003569s, valid=True
2026-05-28T22:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:30:43.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:30:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:30:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:30:43.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:30:43.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:30:43.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:30:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:30:43.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:30:43.407 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:30:43.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:30:43.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:30:44.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:30:44.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:30:44.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-28T22:30:44.085 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:30:44.362 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:30:44.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:31:14.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:31:14.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:31:14.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:31:14.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:31:14.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:31:14.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:31:14.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-28T22:31:14.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:31:14.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-28T22:31:14.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:31:14.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:31:14.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:31:14.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-28T22:31:17.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-28T22:31:17.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:31:17.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:31:17.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:31:17.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:31:17.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:31:17.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:31:17.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:31:17.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:31:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:31:17.189 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:31:17.189 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:31:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:31:17.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:31:17.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:31:17.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:31:17.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:31:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:31:17.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:31:17.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:31:17.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:31:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:31:17.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:31:17.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:31:17.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:31:09
2026-05-28T22:31:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70178, datetime.datetime(2026, 5, 28, 22, 31, 9), datetime.datetime(2026, 5, 28, 22, 31, 8), 'salt', 6.98, 70.88, None, 14.36, 140.99, 4.91, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:31:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:31:17.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:31:17.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:08, diff=9.530198s, valid=True
2026-05-28T22:31:17.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:31:17.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:31:17.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:12, diff=5.533089s, valid=True
2026-05-28T22:31:17.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:31:17.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:31:17.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:06, diff=11.539804s, valid=True
2026-05-28T22:31:17.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:31:17.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:31:17.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:31:17.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:31:17.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:31:17.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:31:17.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:12, diff=5.542875s, valid=True
2026-05-28T22:31:17.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:31:17.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:31:17.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:31:17.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932919.543529s, valid=True
2026-05-28T22:31:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:31:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:31:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:31:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:31:17.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:31:17.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:31:17.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:31:17.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:31:17.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:31:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:31:17.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:31:17.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:31:17.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:31:17.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:31:18.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:31:18.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:31:18.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:31:18.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:31:18.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-28T22:31:18.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-28T22:31:18.769 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:31:18.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:31:48.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:31:48.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:31:48.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:31:49.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:31:49.210 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:31:49.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:31:49.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-28T22:31:49.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:31:49.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-28T22:31:49.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:31:49.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:31:49.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:31:49.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-28T22:31:51.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:31:51.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:31:51.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:31:51.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:31:51.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:31:51.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:31:51.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:31:51.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:31:51.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:31:51.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:31:51.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:31:51.949 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:31:51.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:31:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:31:52.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:31:52.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:31:52.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:31:52.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:31:52.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:31:52.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:31:52.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:31:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:31:52.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:31:52.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:31:52.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:31:39
2026-05-28T22:31:52.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70179, datetime.datetime(2026, 5, 28, 22, 31, 39), datetime.datetime(2026, 5, 28, 22, 31, 38), 'salt', 6.95, 70.85, None, 14.47, 139.87, 4.92, 832.52, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:31:52.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:31:52.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:31:52.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:38, diff=14.280113s, valid=True
2026-05-28T22:31:52.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:31:52.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:31:52.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:12, diff=-19.716854s, valid=True
2026-05-28T22:31:52.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:31:52.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:31:52.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:31:37, diff=15.289678s, valid=True
2026-05-28T22:31:52.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:31:52.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:31:52.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:31:52.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:31:52.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:31:52.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:31:52.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:12, diff=-19.707332s, valid=True
2026-05-28T22:31:52.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:31:52.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:31:52.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:31:52.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932954.293305s, valid=True
2026-05-28T22:31:52.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:31:52.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:31:52.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:31:52.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:31:52.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:31:52.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:31:52.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:31:52.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:31:52.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:31:52.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:31:52.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:31:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:31:52.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:31:52.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:31:52.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:31:53.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:31:53.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:31:53.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:31:53.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-28T22:31:53.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-28T22:31:53.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:31:53.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:32:23.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:32:23.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:32:23.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:32:23.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:32:23.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:32:23.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:32:23.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-28T22:32:23.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:32:23.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-28T22:32:23.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:32:23.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:32:23.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:32:23.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:32:26.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-28T22:32:26.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:32:26.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:32:26.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:32:26.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:32:26.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:32:26.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:32:26.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:32:26.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:32:26.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:32:26.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:32:26.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:32:26.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:32:26.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:32:26.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:32:26.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:32:26.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:32:26.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:32:26.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:32:26.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:32:26.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:32:26.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:32:26.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:32:26.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:32:26.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:32:09
2026-05-28T22:32:26.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70180, datetime.datetime(2026, 5, 28, 22, 32, 9), datetime.datetime(2026, 5, 28, 22, 32, 9), 'salt', 6.98, 70.88, None, 14.64, 139.33, 4.91, 832.46, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:32:26.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:32:26.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:32:26.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:09, diff=17.781264s, valid=True
2026-05-28T22:32:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:32:26.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:32:26.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:12, diff=14.784097s, valid=True
2026-05-28T22:32:26.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:32:26.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:32:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:09, diff=17.790749s, valid=True
2026-05-28T22:32:26.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:32:26.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:32:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:32:26.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:32:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:32:26.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:32:26.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:12, diff=14.793769s, valid=True
2026-05-28T22:32:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:32:26.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:32:26.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:32:26.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=932988.794422s, valid=True
2026-05-28T22:32:26.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:32:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:32:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:32:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:32:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:32:26.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:32:26.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:32:26.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:32:26.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:32:26.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:32:27.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:32:27.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:32:27.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:32:27.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:32:27.350 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:32:27.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:32:27.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:32:27.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:32:27.878 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:32:27.878 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:32:28.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:32:28.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:32:58.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:32:58.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:32:58.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:32:58.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:32:58.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:32:58.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:32:58.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-28T22:32:58.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:32:58.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-28T22:32:58.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:32:58.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:32:58.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:32:58.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:33:01.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-28T22:33:01.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:33:01.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:33:01.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:33:01.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:33:01.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:33:01.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:33:01.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:33:01.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:33:01.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:33:01.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:33:01.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:33:01.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:33:01.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:33:01.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:33:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:33:01.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:33:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:33:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:33:01.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:33:01.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:33:01.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:33:01.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:33:01.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:33:01.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:32:39
2026-05-28T22:33:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70181, datetime.datetime(2026, 5, 28, 22, 32, 39), datetime.datetime(2026, 5, 28, 22, 32, 39), 'salt', 6.85, 70.82, None, 13.87, 141.58, 4.92, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:33:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:33:01.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:33:01.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:39, diff=22.541247s, valid=True
2026-05-28T22:33:01.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:33:01.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:33:01.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:12, diff=-10.455948s, valid=True
2026-05-28T22:33:01.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:33:01.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:33:01.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:32:30, diff=31.550797s, valid=True
2026-05-28T22:33:01.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:33:01.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:33:01.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:33:01.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:33:01.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:33:01.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:33:01.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:12, diff=-10.446213s, valid=True
2026-05-28T22:33:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:33:01.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:33:01.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:33:01.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933023.554441s, valid=True
2026-05-28T22:33:01.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:33:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:33:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:33:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:33:01.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:33:01.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:33:01.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:33:01.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:33:01.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:33:01.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:33:01.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:33:01.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:33:01.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:33:01.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:33:02.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:33:02.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:33:02.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:33:02.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:33: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-28T22:33:02.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-28T22:33:02.758 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:33:02.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:33:32.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:33:32.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:33:32.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:33:33.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:33:33.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:33:33.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:33:33.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-28T22:33:33.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:33:33.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-28T22:33:33.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:33:33.284 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:33:33.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:33:33.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-28T22:33:35.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-28T22:33:35.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:33:35.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:33:35.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:33:35.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:33:35.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:33:35.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:33:35.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:33:35.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:33:35.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:33:35.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:33:35.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:33:35.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:33:35.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:33:35.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:33:36.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:33:36.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:33:36.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:33:36.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:33:36.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:33:36.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:33:36.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:33:36.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:33:36.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:33:36.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:33:09
2026-05-28T22:33:36.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70182, datetime.datetime(2026, 5, 28, 22, 33, 9), datetime.datetime(2026, 5, 28, 22, 33, 9), 'salt', 6.85, 70.75, None, 13.69, 145.67, 4.94, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:33:36.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:33:36.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:33:36.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:09, diff=27.163856s, valid=True
2026-05-28T22:33:36.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:33:36.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:33:36.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:12, diff=24.166679s, valid=True
2026-05-28T22:33:36.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:33:36.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:01, diff=35.17315s, valid=True
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:33:36.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:33:36.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:33:12, diff=24.176131s, valid=True
2026-05-28T22:33:36.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:33:36.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:33:36.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:33:36.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933058.176803s, valid=True
2026-05-28T22:33:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:33:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:33:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:33:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:33:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:33:36.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:33:36.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:33:36.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:33:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:33:36.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:33:36.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:33:36.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:33:36.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:33:36.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:33:36.810 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:33:37.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:33:37.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:33:37.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:33:37.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-28T22:33:37.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-28T22:33:37.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:33:37.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:34:07.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:34:07.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:34:07.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:34:07.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:34:07.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:34:08.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:34:08.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-28T22:34:08.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:34:08.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-28T22:34:08.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:34:08.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:34:08.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:34:08.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-28T22:34:10.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-28T22:34:10.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:34:10.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:34:10.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:34:10.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:34:10.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:34:10.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:34:10.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:34:10.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:34:10.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:34:10.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:34:10.700 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:34:10.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:34:10.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:34:10.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:34:10.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:34:10.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:34:10.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:34:10.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:34:10.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:34:10.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:34:10.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:34:10.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:34:10.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:34:11.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:34:10
2026-05-28T22:34:11.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70184, datetime.datetime(2026, 5, 28, 22, 34, 10), datetime.datetime(2026, 5, 28, 22, 34, 10), 'salt', 6.95, 70.32, None, 13.87, 147.07, 5.03, 832.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:34:11.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:34:11.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:34:11.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:10, diff=1.01856s, valid=True
2026-05-28T22:34:11.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:34:11.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:34:11.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:12, diff=-0.978641s, valid=True
2026-05-28T22:34:11.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:34:11.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:34:11.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:04, diff=7.027838s, valid=True
2026-05-28T22:34:11.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:34:11.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:34:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:34:11.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:34:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:34:11.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:34:11.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:12, diff=-0.969141s, valid=True
2026-05-28T22:34:11.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:34:11.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:34:11.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:34:11.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933093.031517s, valid=True
2026-05-28T22:34:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:34:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:34:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:34:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:34:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:34:11.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:34:11.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:34:11.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:34:11.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:34:11.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:34:11.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:34:11.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:34:11.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:34:11.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:34:11.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:34:11.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:34:12.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:34:12.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:34:12.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-28T22:34:12.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-28T22:34:12.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:34:12.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:34:42.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:34:42.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:34:42.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:34:42.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:34:42.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:34:42.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:34:42.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-28T22:34:42.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:34:42.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-28T22:34:42.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:34:42.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:34:42.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:34:42.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-28T22:34:45.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-28T22:34:45.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:34:45.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:34:45.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:34:45.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:34:45.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:34:45.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:34:45.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:34:45.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:34:45.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:34:45.084 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:34:45.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:34:45.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:34:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:34:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:34:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:34:45.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:34:45.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:34:45.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:34:45.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:34:45.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:34:45.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:34:45.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:34:45.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:34:45.410 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:34:40
2026-05-28T22:34:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70185, datetime.datetime(2026, 5, 28, 22, 34, 40), datetime.datetime(2026, 5, 28, 22, 34, 40), 'salt', 7.01, 70.25, None, 13.41, 137.38, 5.04, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:34:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:34:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:34:45.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:40, diff=5.417158s, valid=True
2026-05-28T22:34:45.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:34:45.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:34:45.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:12, diff=-26.579985s, valid=True
2026-05-28T22:34:45.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:34:45.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:34:45.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:34:36, diff=9.426783s, valid=True
2026-05-28T22:34:45.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:34:45.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:34:45.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:34:45.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:34:45.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:34:45.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:34:45.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:12, diff=-26.570157s, valid=True
2026-05-28T22:34:45.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:34:45.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:34:45.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:34:45.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933127.430511s, valid=True
2026-05-28T22:34:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:34:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:34:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:34:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:34:45.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:34:45.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:34:45.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:34:45.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:34:45.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:34:45.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:34:45.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:34:45.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:34:45.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:34:45.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:34:46.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:34:46.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:34:46.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:34:46.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:34:46.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-28T22:34:46.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-28T22:34:46.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:34:46.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:35:16.789 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:35:16.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:35:16.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:35:17.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:35:17.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:35:17.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:35:17.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-28T22:35:17.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:35:17.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-28T22:35:17.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:35:17.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:35:17.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:35:17.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-28T22:35:19.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-28T22:35:19.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:35:19.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:35:19.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:35:19.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:35:19.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:35:19.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:35:19.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:35:19.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:35:19.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:35:19.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:35:19.768 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:35:19.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:35:19.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:35:19.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:35:19.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:35:19.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:35:20.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:35:20.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:35:20.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:35:20.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:35:20.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:35:20.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:35:20.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:35:20.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:35:10
2026-05-28T22:35:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70186, datetime.datetime(2026, 5, 28, 22, 35, 10), datetime.datetime(2026, 5, 28, 22, 35, 10), 'salt', 7.11, 69.49, None, 13.34, 147.08, 5.19, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:35:20.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:35:20.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:35:20.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:10, diff=10.144109s, valid=True
2026-05-28T22:35:20.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:35:20.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:35:20.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:12, diff=8.147043s, valid=True
2026-05-28T22:35:20.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:35:20.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:35:20.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:07, diff=13.153719s, valid=True
2026-05-28T22:35:20.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:35:20.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:35:20.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:35:20.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:35:20.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:35:20.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:35:20.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:12, diff=8.15684s, valid=True
2026-05-28T22:35:20.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:35:20.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:35:20.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:35:20.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933162.15749s, valid=True
2026-05-28T22:35:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:35:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:35:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:35:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:35:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:35:20.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:35:20.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:35:20.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:35:20.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:35:20.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:35:20.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:35:20.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:35:20.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:35:20.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:35:20.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:35:21.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:35:21.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:35:21.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:35:21.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-28T22:35:21.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-28T22:35:21.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:35:21.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:35:51.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:35:51.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:35:51.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:35:51.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:35:51.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:35:52.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:35:52.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-28T22:35:52.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:35:52.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:35:52.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:35:52.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:35:52.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:35:52.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-28T22:35:54.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-28T22:35:54.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:35:54.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:35:54.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:35:54.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:35:54.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:35:54.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:35:54.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:35:54.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:35:54.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:35:54.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:35:54.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:35:54.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:35:54.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:35:54.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:35:54.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:35:54.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:35:54.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:35:54.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:35:54.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:35:54.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:35:54.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:35:54.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:35:54.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:35:54.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:35:41
2026-05-28T22:35:54.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70187, datetime.datetime(2026, 5, 28, 22, 35, 41), datetime.datetime(2026, 5, 28, 22, 35, 40), 'salt', 7.18, 69.03, None, 14.75, 149.31, 5.29, 832.4, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:35:54.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:35:54.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:35:54.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:40, diff=14.842547s, valid=True
2026-05-28T22:35:54.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:35:54.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:35:54.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:12, diff=-17.154606s, valid=True
2026-05-28T22:35:54.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:35:54.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:35:38, diff=16.852065s, valid=True
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:35:54.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:35:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:12, diff=-17.144872s, valid=True
2026-05-28T22:35:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:35:54.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:35:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:35:54.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933196.855803s, valid=True
2026-05-28T22:35:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:35:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:35:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:35:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:35:54.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:35:54.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:35:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:35:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:35:54.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:35:54.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:35:55.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:35:55.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:35:55.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:35:55.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:35:55.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:35:55.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:35:55.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:35:55.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:35:55.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-28T22:35:55.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-28T22:35:56.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:35:56.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:36:26.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:36:26.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:36:26.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:36:26.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:36:26.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:36:26.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:36: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-28T22:36:26.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:36:26.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-28T22:36:26.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:36:26.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:36:26.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:36:26.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-28T22:36:29.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-28T22:36:29.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:36:29.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:36:29.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:36:29.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:36:29.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:36:29.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:36:29.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:36:29.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:36:29.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:36:29.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:36:29.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:36:29.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:36:29.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:36:29.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:36:29.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:36:29.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:36:29.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:36:29.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:36:29.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:36:29.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:36:29.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:36:29.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:36:29.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:36:29.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:36:11
2026-05-28T22:36:29.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70188, datetime.datetime(2026, 5, 28, 22, 36, 11), datetime.datetime(2026, 5, 28, 22, 36, 10), 'salt', 7.48, 67.97, None, 15.46, 147.43, 5.52, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:36:29.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:36:29.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:36:29.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:10, diff=19.758072s, valid=True
2026-05-28T22:36:29.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:36:29.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:36:29.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:12, diff=17.760952s, valid=True
2026-05-28T22:36:29.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:36:29.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:36:29.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:10, diff=19.768682s, valid=True
2026-05-28T22:36:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:36:29.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:36:29.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:36:29.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:36:29.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:36:29.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:36:29.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:12, diff=17.771747s, valid=True
2026-05-28T22:36:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:36:29.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:36:29.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:36:29.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933231.772395s, valid=True
2026-05-28T22:36:29.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:36:29.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:36:29.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:36:29.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:36:29.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:36:29.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:36:29.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:36:29.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:36:29.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:36:29.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:36:30.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:36:30.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:36:30.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:36:30.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:36:30.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:36:30.768 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:36:30.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:36:30.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:36:30.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-28T22:36:30.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-28T22:36:30.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:36:30.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:37:01.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:37:01.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:37:01.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:37:01.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:37:01.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:37:01.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:37:01.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-28T22:37:01.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:37:01.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-28T22:37:01.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:37:01.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:37:01.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:37:01.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-28T22:37: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-28T22:37:04.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:37:04.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:37:04.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:37:04.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:37:04.233 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:37:04.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:37:04.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:37:04.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:37:04.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:37:04.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:37:04.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:37:04.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:37:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:37:04.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:37:04.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:37:04.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:37:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:37:04.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:37:04.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:37:04.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:37:04.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:37:04.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:37:04.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:37:04.628 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:36:41
2026-05-28T22:37:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70189, datetime.datetime(2026, 5, 28, 22, 36, 41), datetime.datetime(2026, 5, 28, 22, 36, 41), 'salt', 7.58, 67.43, None, 15.42, 148.95, 5.64, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:37:04.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:37:04.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:37:04.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:41, diff=23.634931s, valid=True
2026-05-28T22:37:04.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:37:04.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:37:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:12, diff=-7.362187s, valid=True
2026-05-28T22:37:04.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:37:04.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:36:33, diff=31.644323s, valid=True
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:37:04.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:37:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:12, diff=-7.352652s, valid=True
2026-05-28T22:37:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:37:04.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:37:04.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:37:04.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933266.647998s, valid=True
2026-05-28T22:37:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:37:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:37:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:37:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:37:04.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:37:04.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:37:04.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:37:04.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:37:04.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:37:04.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:37:04.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:37:04.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:37:04.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:37:04.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:37:05.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:37:05.520 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:37:05.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:37:05.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:37:05.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-28T22:37:05.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-28T22:37:05.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:37:05.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:37:35.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:37:35.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:37:35.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:37:36.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:37:36.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:37:36.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:37:36.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-28T22:37:36.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:37:36.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-28T22:37:36.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:37:36.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:37:36.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:37:36.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-28T22:37:38.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-28T22:37:38.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:37:38.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:37:38.974 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:37:38.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:37:38.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:37:38.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:37:38.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:37:38.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:37:38.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:37:38.995 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:37:38.995 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:37:39.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:37:39.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:37:39.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:37:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:37:39.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:37:39.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:37:39.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:37:39.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:37:39.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:37:39.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:37:39.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:37:39.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:37:39.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:37:11
2026-05-28T22:37:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70190, datetime.datetime(2026, 5, 28, 22, 37, 11), datetime.datetime(2026, 5, 28, 22, 37, 11), 'salt', 7.71, 66.27, None, 15.91, 147.99, 5.88, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:37:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:37:39.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:37:39.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:11, diff=28.326266s, valid=True
2026-05-28T22:37:39.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:37:39.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:37:39.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:12, diff=27.329129s, valid=True
2026-05-28T22:37:39.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:37:39.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:37:39.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:03, diff=36.33572s, valid=True
2026-05-28T22:37:39.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:37:39.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:37:39.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:37:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:37:39.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:37:39.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:37:39.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:37:12, diff=27.33877s, valid=True
2026-05-28T22:37:39.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:37:39.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:37:39.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:37:39.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933301.339427s, valid=True
2026-05-28T22:37:39.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:37:39.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:37:39.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:37:39.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:37:39.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:37:39.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:37:39.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:37:39.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:37:39.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:37:39.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:37:39.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:37:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:37:39.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:37:39.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:37:39.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:37:40.234 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:37:40.334 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:37:40.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:37:40.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-28T22:37:40.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-28T22:37:40.417 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:37:40.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:38:10.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:38:10.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:38:10.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:38:10.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:38:10.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:38:10.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:38:10.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-28T22:38:10.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:38:10.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-28T22:38:11.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:38:11.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:38:11.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:38:11.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-28T22:38:13.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-28T22:38:13.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:38:13.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:38:13.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:38:13.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:38:13.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:38:13.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:38:13.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:38:13.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:38:13.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:38:13.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:38:13.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:38:13.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:38:13.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:38:13.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:38:13.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:38:13.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:38:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:38:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:38:13.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:38:13.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:38:13.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:38:13.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:38:13.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:38:13.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:38:12
2026-05-28T22:38:13.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70192, datetime.datetime(2026, 5, 28, 22, 38, 12), datetime.datetime(2026, 5, 28, 22, 38, 11), 'salt', 7.78, 64.71, None, 15.21, 146.72, 6.22, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:38:13.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:38:13.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:38:13.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:11, diff=2.81763s, valid=True
2026-05-28T22:38:13.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:38:13.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:38:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:12, diff=1.82046s, valid=True
2026-05-28T22:38:13.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:38:13.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:38:13.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:05, diff=8.826968s, valid=True
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:38:13.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:38:13.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:12, diff=1.829937s, valid=True
2026-05-28T22:38:13.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:38:13.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:38:13.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:38:13.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933335.83058s, valid=True
2026-05-28T22:38:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:38:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:38:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:38:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:38:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:38:13.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:38:13.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:38:13.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:38:13.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:38:13.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:38:14.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:38:14.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:38:14.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:38:14.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:38:14.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:38:14.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:38:14.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:38:14.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:38:14.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:38:14.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:38:14.978 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:38:14.978 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:38:45.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:38:45.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:38:45.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:38:45.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:38:45.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:38:45.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:38:45.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-28T22:38:45.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:38:45.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-28T22:38:45.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:38:45.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:38:45.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:38:45.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-28T22:38:49.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-28T22:38:49.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:38:49.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:38:49.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:38:49.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:38:49.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:38:49.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:38:49.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:38:49.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:38:49.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:38:49.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:38:49.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:38:49.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:38:49.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:38:49.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:38:49.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:38:49.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:38:49.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:38:49.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:38:49.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:38:49.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:38:49.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:38:49.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:38:49.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:38:49.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:38:42
2026-05-28T22:38:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70193, datetime.datetime(2026, 5, 28, 22, 38, 42), datetime.datetime(2026, 5, 28, 22, 38, 41), 'salt', 7.88, 64.35, None, 15.14, 144.45, 6.31, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:38:49.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:38:49.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:38:49.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:41, diff=8.367662s, valid=True
2026-05-28T22:38:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:38:49.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:38:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:12, diff=-22.629448s, valid=True
2026-05-28T22:38:49.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:38:49.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:38:36, diff=13.377176s, valid=True
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:38:49.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:38:49.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:12, diff=-22.619801s, valid=True
2026-05-28T22:38:49.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:38:49.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:38:49.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:38:49.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933371.380862s, valid=True
2026-05-28T22:38:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:38:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:38:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:38:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:38:49.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:38:49.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:38:49.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:38:49.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:38:49.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:38:49.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:38:49.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:38:49.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:38:49.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:38:49.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:38:49.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:38:50.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:38:50.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:38:50.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:38:50.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-28T22:38:50.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-28T22:38:50.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:38:50.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:39:20.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:39:20.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:39:20.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:39:21.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:39:21.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:39:21.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:39:21.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-28T22:39:21.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:39:21.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-28T22:39:21.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:39:21.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:39:21.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:39:21.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-28T22:39:23.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-28T22:39:23.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:39:23.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:39:23.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:39:23.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:39:23.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:39:23.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:39:23.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:39:23.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:39:23.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:39:23.667 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:39:23.667 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:39:23.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:39:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:39:23.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:39:23.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:39:23.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:39:23.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:39:23.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:39:23.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:39:23.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:39:23.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:39:23.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:39:23.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:39:23.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:39:12
2026-05-28T22:39:23.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70194, datetime.datetime(2026, 5, 28, 22, 39, 12), datetime.datetime(2026, 5, 28, 22, 39, 12), 'salt', 7.94, 64.22, None, 15.56, 143.88, 6.33, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:39:23.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:39:23.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:39:23.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:12, diff=11.997431s, valid=True
2026-05-28T22:39:23.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:39:23.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:39:24.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:12, diff=12.000264s, valid=True
2026-05-28T22:39:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:39:24.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:39:24.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:08, diff=16.006718s, valid=True
2026-05-28T22:39:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:39:24.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:39:24.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:39:24.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:39:24.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:39:24.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:39:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:12, diff=12.011475s, valid=True
2026-05-28T22:39:24.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:39:24.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:39:24.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:39:24.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933406.012688s, valid=True
2026-05-28T22:39:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:39:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:39:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:39:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:39:24.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:39:24.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:39:24.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:39:24.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:39:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:39:24.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:39:24.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:39:24.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:39:24.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:39:24.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:39:24.582 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:39:24.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:39:25.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:39:25.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:39:25.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-28T22:39:25.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-28T22:39:25.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:39:25.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:39:55.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:39:55.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:39:55.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:39:55.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:39:55.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:39:55.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:39:55.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-28T22:39:55.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:39:55.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-28T22:39:55.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:39:55.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:39:55.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:39:55.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-28T22:39:58.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-28T22:39:58.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:39:58.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:39:58.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:39:58.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:39:58.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:39:58.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:39:58.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:39:58.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:39:58.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:39:58.328 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:39:58.328 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:39:58.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:39:58.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:39:58.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:39:58.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:39:58.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:39:58.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:39:58.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:39:58.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:39:58.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:39:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:39:58.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:39:58.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:39:58.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:39:42
2026-05-28T22:39:58.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70195, datetime.datetime(2026, 5, 28, 22, 39, 42), datetime.datetime(2026, 5, 28, 22, 39, 42), 'salt', 7.94, 64.08, None, 15.0, 148.65, 6.36, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:39:58.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:39:58.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:39:58.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:42, diff=16.643045s, valid=True
2026-05-28T22:39:58.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:39:58.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:39:58.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:12, diff=-13.354147s, valid=True
2026-05-28T22:39:58.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:39:58.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:39:39, diff=19.652558s, valid=True
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:39:58.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:39:58.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:39:58.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:12, diff=-13.344383s, valid=True
2026-05-28T22:39:58.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:39:58.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:39:58.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:39:58.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933440.656296s, valid=True
2026-05-28T22:39:58.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:39:58.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:39:58.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:39:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:39:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:39:58.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:39:58.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:39:58.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:39:58.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:39:58.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:39:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:39:58.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:39:58.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:39:58.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:39:59.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:39:59.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:39:59.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:39:59.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:39:59.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-28T22:39:59.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-28T22:39:59.942 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:39:59.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:40:29.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:40:29.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:40:29.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:40:30.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:40:30.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:40:30.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:40:30.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-28T22:40:30.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:40: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-28T22:40:30.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:40:30.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:40:30.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:40:30.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-28T22:40: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-28T22:40:32.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:40:32.932 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:40:32.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:40:32.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:40:32.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:40:32.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:40:32.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:40:32.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:40:32.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:40:32.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:40:32.954 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:40:32.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:40:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:40:33.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:40:33.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:40:33.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:40:33.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:40:33.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:40:33.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:40:33.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:40:33.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:40:33.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:40:33.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:40:33.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:40:12
2026-05-28T22:40:33.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70196, datetime.datetime(2026, 5, 28, 22, 40, 12), datetime.datetime(2026, 5, 28, 22, 40, 12), 'salt', 7.98, 63.92, None, 15.03, 147.1, 6.41, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:40:33.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:40:33.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:40:33.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:12, diff=21.268251s, valid=True
2026-05-28T22:40:33.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:40:33.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:40:33.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:12, diff=21.271157s, valid=True
2026-05-28T22:40:33.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:40:33.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:40:33.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:11, diff=22.277666s, valid=True
2026-05-28T22:40:33.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:40:33.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:40:33.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:40:33.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:40:33.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:40:33.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:40:33.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:12, diff=21.280668s, valid=True
2026-05-28T22:40:33.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:40:33.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:40:33.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:40:33.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933475.281322s, valid=True
2026-05-28T22:40:33.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:40:33.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:40:33.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:40:33.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:40:33.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:40:33.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:40:33.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:40:33.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:40:33.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:40:33.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:40:33.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:40:33.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:40:33.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:40:33.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:40:33.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:40:34.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:40:34.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:40:34.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:40:34.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-28T22:40:34.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-28T22:40:34.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:40:34.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:41:04.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:41:04.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:41:04.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:41:04.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:41:04.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:41:04.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:41:04.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-28T22:41:04.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:41:04.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-28T22:41:04.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:41:04.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:41:04.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:41:04.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-28T22:41:07.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-28T22:41:07.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:41:07.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:41:07.347 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:41:07.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:41:07.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:41:07.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:41:07.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:41:07.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:41:07.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:41:07.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:41:07.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:41:07.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:41:07.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:41:07.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:41:07.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:41:07.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:41:07.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:41:07.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:41:07.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:41:07.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:41:07.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:41:07.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:41:07.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:41:07.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:40:43
2026-05-28T22:41:07.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70197, datetime.datetime(2026, 5, 28, 22, 40, 43), datetime.datetime(2026, 5, 28, 22, 40, 42), 'salt', 8.01, 63.88, None, 14.5, 147.57, 6.41, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:41:07.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:41:07.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:41:07.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:42, diff=25.690519s, valid=True
2026-05-28T22:41:07.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:41:07.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:41:07.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:12, diff=-4.306709s, valid=True
2026-05-28T22:41:07.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:41:07.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:41:07.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:40:42, diff=25.699846s, valid=True
2026-05-28T22:41:07.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:41:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:41:07.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:41:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:41:07.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:41:07.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:41:07.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:12, diff=-4.297192s, valid=True
2026-05-28T22:41:07.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:41:07.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:41:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:41:07.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933509.703454s, valid=True
2026-05-28T22:41:07.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:41:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:41:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:41:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:41:07.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:41:07.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:41:07.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:41:07.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:41:07.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:41:07.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:41:07.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:41:07.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:41:08.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:41:08.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:41:08.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:41:08.640 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:41:08.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:41:08.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:41:08.739 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:41:08.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-28T22:41:09.152 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:41:09.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:41:39.168 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:41:39.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:41:39.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:41:39.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:41:39.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:41:39.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:41:39.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:41:39.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:41:39.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-28T22:41:39.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:41:39.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:41:39.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:41:39.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-28T22:41:42.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:41:42.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:41:42.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:41:42.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:41:42.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:41:42.641 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:41:42.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:41:42.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:41:42.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:41:42.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:41:42.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:41:42.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:41:42.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:41:42.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:41:42.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:41:42.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:41:42.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:41:42.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:41:42.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:41:42.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:41:42.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:41:42.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:41:42.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:41:42.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:41:42.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:41:13
2026-05-28T22:41:42.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70198, datetime.datetime(2026, 5, 28, 22, 41, 13), datetime.datetime(2026, 5, 28, 22, 41, 12), 'salt', 7.91, 64.65, None, 15.32, 150.39, 6.24, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:41:42.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:41:42.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:41:42.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:12, diff=30.999121s, valid=True
2026-05-28T22:41:42.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:41:42.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:41:43.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:12, diff=31.002098s, valid=True
2026-05-28T22:41:43.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:41:43.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:05, diff=38.009011s, valid=True
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:41:43.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:41:43.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:41:12, diff=31.01214s, valid=True
2026-05-28T22:41:43.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:41:43.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:41:43.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:41:43.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933545.012896s, valid=True
2026-05-28T22:41:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:41:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:41:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:41:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:41:43.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:41:43.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:41:43.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:41:43.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:41:43.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:41:43.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:41:43.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:41:43.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:41:43.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:41:43.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:41:43.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:41:43.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:41:44.033 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:41:44.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:41:44.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-28T22:41:44.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-28T22:41:44.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:41:44.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:42:14.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:42:14.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:42:14.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:42:14.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:42:14.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:42:14.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:42:14.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:42:14.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:42:14.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-28T22:42:14.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:42:14.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:42:14.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:42:14.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-28T22:42:17.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:42:17.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:42:17.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:42:17.331 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:42:17.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:42:17.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:42:17.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:42:17.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:42:17.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:42:17.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:42:17.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:42:17.355 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:42:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:42:17.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:42:17.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:42:17.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:42:17.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:42:17.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:42:17.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:42:17.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:42:17.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:42:17.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:42:17.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:42:17.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:42:17.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:42:13
2026-05-28T22:42:17.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70200, datetime.datetime(2026, 5, 28, 22, 42, 13), datetime.datetime(2026, 5, 28, 22, 42, 13), 'salt', 7.94, 64.78, None, 15.39, 146.26, 6.21, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:42:17.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:42:17.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:42:17.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:13, diff=4.678866s, valid=True
2026-05-28T22:42:17.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:42:17.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:42:17.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:12, diff=5.682568s, valid=True
2026-05-28T22:42:17.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:42:17.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:42:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:06, diff=11.689709s, valid=True
2026-05-28T22:42:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:42:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:42:17.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:42:17.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:42:17.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:42:17.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:42:17.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:12, diff=5.692774s, valid=True
2026-05-28T22:42:17.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:42:17.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:42:17.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:42:17.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933579.693427s, valid=True
2026-05-28T22:42:17.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:42:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:42:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:42:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:42:17.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:42:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:42:17.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:42:17.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:42:17.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:42:17.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:42:17.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:42:17.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:42:18.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:42:18.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:42:18.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:42:18.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:42:18.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:42:18.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:42:18.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-28T22:42:18.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-28T22:42:18.998 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:42:18.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:42:49.027 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:42:49.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:42:49.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:42:49.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:42:49.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:42:49.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:42:49.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-28T22:42:49.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:42:49.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-28T22:42:49.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:42:49.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:42:49.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:42:49.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:42:52.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:42:52.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:42:52.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:42:52.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:42:52.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:42:52.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:42:52.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:42:52.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:42:52.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:42:52.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:42:52.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:42:52.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:42:52.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:42:52.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:42:52.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:42:52.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:42:52.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:42:52.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:42:52.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:42:52.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:42:52.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:42:52.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:42:52.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:42:52.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:42:52.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:42:43
2026-05-28T22:42:52.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70201, datetime.datetime(2026, 5, 28, 22, 42, 43), datetime.datetime(2026, 5, 28, 22, 42, 43), 'salt', 7.88, 64.58, None, 15.84, 147.34, 6.26, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:42:52.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:42:52.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:42:52.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:43, diff=9.359584s, valid=True
2026-05-28T22:42:52.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:42:52.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:42:52.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:12, diff=-19.63753s, valid=True
2026-05-28T22:42:52.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:42:52.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:42:37, diff=15.369276s, valid=True
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:42:52.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:42:52.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:12, diff=-19.627663s, valid=True
2026-05-28T22:42:52.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:42:52.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:42:52.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:42:52.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933614.373008s, valid=True
2026-05-28T22:42:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:42:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:42:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:42:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:42:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:42:52.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:42:52.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:42:52.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:42:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:42:52.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:42:52.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:42:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:42:52.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:42:52.697 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:42:52.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:42:53.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:42:53.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:42:53.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:42:53.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-28T22:42:53.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-28T22:42:53.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:42:53.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:43:23.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:43:23.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:43:23.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:43:23.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:43:23.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:43:23.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:43:23.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:43:23.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:43:23.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:43:24.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:43:24.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:43:24.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:43:24.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:43:27.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-28T22:43:27.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:43:27.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:43:27.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:43:27.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:43:27.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:43:27.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:43:27.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:43:27.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:43:27.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:43:27.568 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:43:27.568 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:43:27.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:43:27.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:43:27.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:43:27.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:43:27.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:43:27.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:43:27.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:43:27.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:43:27.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:43:27.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:43:27.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:43:27.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:43:27.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:43:14
2026-05-28T22:43:27.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70202, datetime.datetime(2026, 5, 28, 22, 43, 14), datetime.datetime(2026, 5, 28, 22, 43, 13), 'salt', 7.94, 64.08, None, 16.9, 153.23, 6.36, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:43:27.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:43:27.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:43:27.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:13, diff=14.964339s, valid=True
2026-05-28T22:43:27.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:43:27.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:43:27.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:12, diff=15.967213s, valid=True
2026-05-28T22:43:27.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:43:27.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:43:27.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:09, diff=18.973773s, valid=True
2026-05-28T22:43:27.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:43:27.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:43:27.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:43:27.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:43:27.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:43:27.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:43:27.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:12, diff=15.976811s, valid=True
2026-05-28T22:43:27.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:43:27.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:43:27.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:43:27.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933649.977458s, valid=True
2026-05-28T22:43:27.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:43:27.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:43:27.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:43:27.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:43:27.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:43:28.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:43:28.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:43:28.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:43:28.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:43:28.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:43:28.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:43:28.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:43:28.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:43:28.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:43:28.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:43:28.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:43:28.945 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:43:28.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:43:28.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-28T22:43:28.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-28T22:43:29.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:43:29.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:43:59.173 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:43:59.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:43:59.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:43:59.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:43:59.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:43:59.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:43:59.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-28T22:43:59.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:43:59.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-28T22:43:59.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:43:59.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:43:59.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:43:59.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-28T22:44:02.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-28T22:44:02.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:44:02.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:44:02.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:44:02.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:44:02.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:44:02.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:44:02.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:44:02.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:44:02.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:44:02.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:44:02.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:44:02.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:44:02.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:44:02.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:44:02.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:44:02.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:44:02.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:44:02.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:44:02.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:44:02.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:44:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:44:02.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:44:02.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:44:02.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:43:44
2026-05-28T22:44:02.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70203, datetime.datetime(2026, 5, 28, 22, 43, 44), datetime.datetime(2026, 5, 28, 22, 43, 44), 'salt', 8.01, 63.92, None, 16.13, 148.81, 6.4, 832.53, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:44:02.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:44:02.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:44:02.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:44, diff=18.678282s, valid=True
2026-05-28T22:44:02.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:44:02.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:44:02.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:12, diff=-9.318857s, valid=True
2026-05-28T22:44:02.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:44:02.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:44:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:43:40, diff=22.687781s, valid=True
2026-05-28T22:44:02.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:44:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:44:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:44:02.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:44:02.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:44:02.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:44:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:12, diff=-9.309151s, valid=True
2026-05-28T22:44:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:44:02.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:44:02.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:44:02.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933684.691512s, valid=True
2026-05-28T22:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:44:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:44:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:44:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:44:02.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:44:02.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:44:02.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:44:02.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:44:02.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:44:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:44:03.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:44:03.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:44:03.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:44:03.699 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:44:03.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:44:03.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-28T22:44:03.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-28T22:44:03.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:44:03.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:44:33.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:44:33.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:44:33.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:44:34.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:44:34.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:44:34.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:44:34.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-28T22:44:34.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:44:34.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-28T22:44:34.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:44:34.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:44:34.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:44:34.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-28T22:44:36.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-28T22:44:36.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:44:36.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:44:36.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:44:36.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:44:36.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:44:36.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:44:36.831 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:44:36.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:44:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:44:36.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:44:36.831 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:44:36.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:44:36.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:44:36.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:44:37.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:44:37.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:44:37.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:44:37.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:44:37.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:44:37.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:44:37.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:44:37.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:44:37.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:44:37.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:44:16
2026-05-28T22:44:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70204, datetime.datetime(2026, 5, 28, 22, 44, 16), datetime.datetime(2026, 5, 28, 22, 44, 14), 'salt', 7.88, 63.72, None, 16.09, 162.13, 6.44, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:44:37.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:44:37.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:44:37.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:14, diff=23.165842s, valid=True
2026-05-28T22:44:37.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:44:37.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:44:37.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:12, diff=25.168652s, valid=True
2026-05-28T22:44:37.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:44:37.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:12, diff=25.175143s, valid=True
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:44:37.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:44:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:12, diff=25.178156s, valid=True
2026-05-28T22:44:37.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:44:37.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:44:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:44:37.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933719.178808s, valid=True
2026-05-28T22:44:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:44:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:44:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:44:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:44:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:44:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:44:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:44:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:44:37.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:44:37.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:44:37.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:44:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:44:37.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:44:37.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:44:37.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:44:38.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:44:38.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:44:38.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:44:38.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-28T22:44:38.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-28T22:44:38.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:44:38.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:45:08.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:45:08.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:45:08.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:45:08.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:45:08.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:45:08.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:45:08.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-28T22:45:08.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:45:08.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-28T22:45:08.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:45:08.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:45:08.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:45:08.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-28T22:45:11.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-28T22:45:11.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:45:11.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:45:11.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:45:11.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:45:11.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:45:11.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:45:11.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:45:11.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:45:11.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:45:11.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:45:11.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:45:11.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:45:11.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:45:11.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:45:11.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:45:11.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:45:11.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:45:11.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:45:11.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:45:11.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:45:11.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:45:11.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:45:11.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:45:11.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:44:46
2026-05-28T22:45:11.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70205, datetime.datetime(2026, 5, 28, 22, 44, 46), datetime.datetime(2026, 5, 28, 22, 44, 45), 'salt', 7.85, 63.82, None, 16.97, 148.72, 6.42, 832.59, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:45:11.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:45:11.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:45:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:45, diff=26.917637s, valid=True
2026-05-28T22:45:11.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:45:11.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:45:11.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:12, diff=-0.079504s, valid=True
2026-05-28T22:45:11.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:45:11.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:44:43, diff=28.927068s, valid=True
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:45:11.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:45:11.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:12, diff=-0.069894s, valid=True
2026-05-28T22:45:11.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:45:11.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:45:11.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:45:11.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933753.930781s, valid=True
2026-05-28T22:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:45:11.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:45:12.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:45:12.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:45:12.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:45:12.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:45:12.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:45:12.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:45:12.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:45:12.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:45:12.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:45:12.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:45:12.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:45:12.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:45:12.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:45:12.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-28T22:45:12.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-28T22:45:13.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:45:13.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:45:43.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:45:43.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:45:43.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:45:43.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:45:43.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:45:43.533 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:45:43.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-28T22:45:43.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:45:43.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-28T22:45:43.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:45:43.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:45:43.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:45:43.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-28T22:45:46.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:45:46.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:45:46.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:45:46.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:45:46.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:45:46.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:45:46.026 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:45:46.027 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:45:46.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:45:46.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:45:46.027 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:45:46.027 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:45:46.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:45:46.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:45:46.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:45:46.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:45:46.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:45:46.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:45:46.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:45:46.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:45:46.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:45:46.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:45:46.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:45:46.278 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:45:46.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:45:16
2026-05-28T22:45:46.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70206, datetime.datetime(2026, 5, 28, 22, 45, 16), datetime.datetime(2026, 5, 28, 22, 45, 16), 'salt', 7.91, 64.15, None, 14.08, 158.49, 6.35, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:45:46.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:45:46.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:45:46.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:16, diff=30.343394s, valid=True
2026-05-28T22:45:46.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:45:46.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:45:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:12, diff=34.346271s, valid=True
2026-05-28T22:45:46.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:45:46.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:45:46.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:15, diff=31.352947s, valid=True
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:45:46.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:45:46.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:45:12, diff=34.356033s, valid=True
2026-05-28T22:45:46.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:45:46.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:45:46.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:45:46.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933788.356702s, valid=True
2026-05-28T22:45:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:45:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:45:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:45:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:45:46.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:45:46.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:45:46.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:45:46.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:45:46.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:45:46.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:45:46.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:45:46.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:45:46.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:45:46.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:45:46.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:45:47.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:45:47.312 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:45:47.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:45:47.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-28T22:45:47.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-28T22:45:47.497 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:45:47.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:46:17.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:46:17.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:46:17.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:46:18.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:46:18.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:46:18.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:46:18.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-28T22:46:18.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:46:18.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-28T22:46:18.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:46:18.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:46:18.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:46:18.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-28T22:46:20.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-28T22:46:20.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:46:20.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:46:20.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:46:20.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:46:20.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:46:20.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:46:20.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:46:20.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:46:20.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:46:20.891 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:46:20.891 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:46:20.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:46:20.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:46:20.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:46:21.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:46:21.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:46:21.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:46:21.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:46:21.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:46:21.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:46:21.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:46:21.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:46:21.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:46:21.214 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:46:16
2026-05-28T22:46:21.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70208, datetime.datetime(2026, 5, 28, 22, 46, 16), datetime.datetime(2026, 5, 28, 22, 46, 16), 'salt', 7.81, 64.58, None, 15.46, 153.16, 6.25, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:46:21.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:46:21.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:46:21.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:16, diff=5.220405s, valid=True
2026-05-28T22:46:21.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:46:21.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:46:21.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:12, diff=9.223282s, valid=True
2026-05-28T22:46:21.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:46:21.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:46:21.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:08, diff=13.229943s, valid=True
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:46:21.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:46:21.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:12, diff=9.232952s, valid=True
2026-05-28T22:46:21.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:46:21.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:46:21.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:46:21.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933823.233628s, valid=True
2026-05-28T22:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:46:21.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:46:21.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:46:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:46:21.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:46:21.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:46:21.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:46:21.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:46:21.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:46:21.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:46:21.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:46:21.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:46:22.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:46:22.264 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:46:22.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:46:22.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-28T22:46:22.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-28T22:46:22.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:46:22.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:46:52.375 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:46:52.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:46:52.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:46:52.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:46:52.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:46:52.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:46:52.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-28T22:46:52.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:46: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-28T22:46:52.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:46:52.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:46:52.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:46:52.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-28T22:46:55.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-28T22:46:55.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:46:55.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:46:55.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:46:55.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:46:55.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:46:55.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:46:55.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:46:55.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:46:55.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:46:55.161 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:46:55.161 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:46:55.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:46:55.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:46:55.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:46:55.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:46:55.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:46:55.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:46:55.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:46:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:46:55.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:46:55.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:46:55.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:46:55.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:46:55.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:46:47
2026-05-28T22:46:55.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70209, datetime.datetime(2026, 5, 28, 22, 46, 47), datetime.datetime(2026, 5, 28, 22, 46, 46), 'salt', 7.78, 64.82, None, 16.87, 148.37, 6.2, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:46:55.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:46:55.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:46:55.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:46, diff=9.471736s, valid=True
2026-05-28T22:46:55.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:46:55.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:46:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:12, diff=-16.525412s, valid=True
2026-05-28T22:46:55.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:46:55.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:46:39, diff=16.481143s, valid=True
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:46:55.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:46:55.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:12, diff=-16.515817s, valid=True
2026-05-28T22:46:55.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:46:55.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:46:55.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:46:55.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933857.484845s, valid=True
2026-05-28T22:46:55.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:46:55.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:46:55.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:46:55.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:46:55.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:46:55.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:46:55.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:46:55.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:46:55.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:46:55.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:46:55.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:46:55.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:46:55.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:46:55.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:46:56.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:46:56.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:46:56.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:46:56.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:46:56.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-28T22:46:56.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-28T22:46:56.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:46:56.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:47:26.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:47:26.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:47:26.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:47:27.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:47:27.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:47:27.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:47:27.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-28T22:47:27.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:47:27.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-28T22:47:27.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:47:27.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:47:27.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:47:27.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-28T22:47:30.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-28T22:47:30.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:47:30.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:47:30.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:47:30.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:47:30.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:47:30.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:47:30.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:47:30.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:47:30.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:47:30.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:47:30.061 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:47:30.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:47:30.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:47:30.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:47:30.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:47:30.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:47:30.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:47:30.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:47:30.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:47:30.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:47:30.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:47:30.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:47:30.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:47:30.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:47:17
2026-05-28T22:47:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70210, datetime.datetime(2026, 5, 28, 22, 47, 17), datetime.datetime(2026, 5, 28, 22, 47, 17), 'salt', 7.78, 65.18, None, 16.37, 152.22, 6.12, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:47:30.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:47:30.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:47:30.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:17, diff=13.39291s, valid=True
2026-05-28T22:47:30.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:47:30.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:47:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:12, diff=18.395821s, valid=True
2026-05-28T22:47:30.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:47:30.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:10, diff=20.402533s, valid=True
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:47:30.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:47:30.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:47:30.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:12, diff=18.405598s, valid=True
2026-05-28T22:47:30.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:47:30.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:47:30.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:47:30.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933892.406263s, valid=True
2026-05-28T22:47:30.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:47:30.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:47:30.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:47:30.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:47:30.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:47:30.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:47:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:47:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:47:30.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:47:30.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:47:30.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:47:30.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:47:30.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:47:30.817 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:47:31.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:47:31.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:47:31.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:47:31.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:47:31.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-28T22:47:31.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-28T22:47:31.723 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:47:31.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:48:01.754 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:48:01.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:48:01.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:48:02.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:48:02.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:48:02.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:48:02.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-28T22:48:02.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:48:02.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-28T22:48:02.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:48:02.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:48:02.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:48:02.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-28T22:48:04.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-28T22:48:04.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:48:04.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:48:04.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:48:04.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:48:04.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:48:04.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:48:04.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:48:04.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:48:04.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:48:04.891 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:48:04.892 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:48:04.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:48:04.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:48:04.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:48:05.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:48:05.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:48:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:48:05.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:48:05.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:48:05.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:48:05.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:48:05.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:48:05.141 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:48:05.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:47:47
2026-05-28T22:48:05.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70211, datetime.datetime(2026, 5, 28, 22, 47, 47), datetime.datetime(2026, 5, 28, 22, 47, 47), 'salt', 7.75, 66.11, None, 16.51, 148.16, 5.93, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:48:05.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:48:05.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:48:05.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:47, diff=18.20712s, valid=True
2026-05-28T22:48:05.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:48:05.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:48:05.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:12, diff=-6.789858s, valid=True
2026-05-28T22:48:05.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:48:05.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:48:05.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:47:42, diff=23.216914s, valid=True
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:48:05.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:48:05.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:12, diff=-6.779971s, valid=True
2026-05-28T22:48:05.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:48:05.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:48:05.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:48:05.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933927.220697s, valid=True
2026-05-28T22:48:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:48:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:48:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:48:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:48:05.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:48:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:48:05.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:48:05.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:48:05.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:48:05.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:48:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:48:05.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:48:05.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:48:05.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:48:05.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:48:06.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:48:06.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:48:06.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:48:06.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-28T22:48:06.364 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:48:06.443 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:48:06.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:48:36.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:48:36.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:48:36.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:48:36.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:48:36.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:48:36.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:48:36.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-28T22:48:36.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:48:36.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-28T22:48:36.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:48:36.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:48:37.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:48:37.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-28T22:48:40.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-28T22:48:40.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:48:40.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:48:40.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:48:40.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:48:40.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:48:40.070 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:48:40.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:48:40.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:48:40.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:48:40.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:48:40.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:48:40.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:48:40.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:48:40.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:48:40.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:48:40.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:48:40.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:48:40.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:48:40.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:48:40.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:48:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:48:40.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:48:40.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:48:40.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:48:17
2026-05-28T22:48:40.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70212, datetime.datetime(2026, 5, 28, 22, 48, 17), datetime.datetime(2026, 5, 28, 22, 48, 17), 'salt', 7.78, 66.31, None, 16.2, 149.54, 5.88, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:48:40.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:48:40.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:48:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:17, diff=23.384781s, valid=True
2026-05-28T22:48:40.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:48:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:48:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:12, diff=28.387597s, valid=True
2026-05-28T22:48:40.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:48:40.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:13, diff=27.394164s, valid=True
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:48:40.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:48:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:12, diff=28.397152s, valid=True
2026-05-28T22:48:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:48:40.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:48:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:48:40.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933962.397832s, valid=True
2026-05-28T22:48:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:48:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:48:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:48:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:48:40.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:48:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:48:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:48:40.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:48:40.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:48:40.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:48:40.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:48:40.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:48:40.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:48:40.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:48:40.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:48:41.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:48:41.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:48:41.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:48: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-28T22:48: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-28T22:48:42.114 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:48:42.114 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:49:12.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:49:12.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:49:12.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:49:12.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:49:12.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:49:12.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:49:12.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-28T22:49:12.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:49:12.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-28T22:49:12.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:49:12.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:49:12.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:49:12.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-28T22:49:15.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:49:15.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:49:15.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:49:15.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:49:15.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:49:15.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:49:15.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:49:15.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:49:15.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:49:15.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:49:15.126 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:49:15.126 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:49:15.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:49:15.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:49:15.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:49:15.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:49:15.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:49:15.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:49:15.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:49:15.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:49:15.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:49:15.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:49:15.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:49:15.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:49:15.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:48:48
2026-05-28T22:49:15.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70213, datetime.datetime(2026, 5, 28, 22, 48, 48), datetime.datetime(2026, 5, 28, 22, 48, 47), 'salt', 7.81, 66.61, None, 17.22, 147.12, 5.82, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:49:15.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:49:15.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:49:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:47, diff=28.441197s, valid=True
2026-05-28T22:49:15.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:49:15.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:49:15.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:49:12, diff=3.444013s, valid=True
2026-05-28T22:49:15.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:49:15.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:49:15.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:48:45, diff=30.450754s, valid=True
2026-05-28T22:49:15.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:49:15.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:49:15.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:49:15.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:49:15.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:49:15.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:49:15.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:49:12, diff=3.453781s, valid=True
2026-05-28T22:49:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:49:15.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:49:15.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:49:15.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=933997.454445s, valid=True
2026-05-28T22:49:15.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:49:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:49:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:49:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:49:15.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:49:15.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:49:15.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:49:15.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:49:15.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:49:15.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:49:15.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:49:15.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:49:15.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:49:15.775 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:49:15.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:49:16.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:49:16.430 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:49:16.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:49:16.430 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:49:16.430 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:49:16.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:49:16.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:49:46.547 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:49:46.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:49:46.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:49:46.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:49:46.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:49:46.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:49:46.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:49:46.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:49:46.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-28T22:49:46.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:49:46.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:49:46.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:49:46.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-28T22:49:49.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-28T22:49:49.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:49:49.352 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:49:49.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:49:49.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:49:49.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:49:49.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:49:49.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:49:49.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:49:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:49:49.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:49:49.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:49:49.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:49:49.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:49:49.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:49:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:49:49.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:49:49.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:49:49.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:49:49.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:49:49.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:49:49.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:49:49.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:49:49.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:49:49.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:49:48
2026-05-28T22:49:49.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70215, datetime.datetime(2026, 5, 28, 22, 49, 48), datetime.datetime(2026, 5, 28, 22, 49, 48), 'salt', 7.68, 67.2, None, 16.97, 146.77, 5.69, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:49:49.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:49:49.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:49:49.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:49:48, diff=1.766273s, valid=True
2026-05-28T22:49:49.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:49:49.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:49:49.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:12, diff=-22.230841s, valid=True
2026-05-28T22:49:49.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:49:49.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:49:49.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:49:47, diff=2.775767s, valid=True
2026-05-28T22:49:49.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:49:49.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:49:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:49:49.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:49:49.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:49:49.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:49:49.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:12, diff=-22.22115s, valid=True
2026-05-28T22:49:49.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:49:49.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:49:49.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:49:49.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934031.779506s, valid=True
2026-05-28T22:49:49.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:49:49.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:49:49.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:49:49.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:49:49.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:49:49.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:49:49.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:49:49.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:49:49.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:49:49.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:49:49.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:49:50.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:49:50.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:49:50.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:49:50.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:49:50.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:49:50.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:49:50.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:49:50.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-28T22:49:50.790 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:49:51.007 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:49:51.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:50:21.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:50:21.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:50:21.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:50:21.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:50:21.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:50:21.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:50:21.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:50:21.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:50:21.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-28T22:50:21.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:50:21.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:50:21.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:50:21.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-28T22:50:23.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:50:23.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:50:23.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:50:23.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:50:23.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:50:23.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:50:24.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:50:24.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:50:24.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:50:24.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:50:24.009 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:50:24.009 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:50:24.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:50:24.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:50:24.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:50:24.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:50:24.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:50:24.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:50:24.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:50:24.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:50:24.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:50:24.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:50:24.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:50:24.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:50:24.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:50:18
2026-05-28T22:50:24.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70216, datetime.datetime(2026, 5, 28, 22, 50, 18), datetime.datetime(2026, 5, 28, 22, 50, 18), 'salt', 7.68, 67.27, None, 16.16, 146.0, 5.67, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:50:24.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:50:24.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:50:24.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:18, diff=6.327542s, valid=True
2026-05-28T22:50:24.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:50:24.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:50:24.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:12, diff=12.33036s, valid=True
2026-05-28T22:50:24.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:50:24.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:50:24.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:10, diff=14.33696s, valid=True
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:50:24.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:50:24.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:12, diff=12.340047s, valid=True
2026-05-28T22:50:24.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:50:24.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:50:24.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:50:24.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934066.340726s, valid=True
2026-05-28T22:50:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:50:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:50:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:50:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:50:24.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:50:24.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:50:24.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:50:24.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:50:24.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:50:24.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:50:24.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:50:24.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:50:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:50:24.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:50:24.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:50:25.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:50:25.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:50:25.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:50:25.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-28T22:50:25.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-28T22:50:25.499 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:50:25.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:50:55.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:50:55.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:50:55.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:50:55.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:50:55.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:50:56.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:50:56.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-28T22:50:56.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:50:56.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-28T22:50:56.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:50:56.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:50:56.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:50:56.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-28T22:50:58.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-28T22:50:58.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:50:58.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:50:58.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:50:58.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:50:58.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:50:58.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:50:58.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:50:58.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:50:58.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:50:58.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:50:58.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:50:58.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:50:58.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:50:58.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:50:58.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:50:58.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:50:59.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:50:59.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:50:59.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:50:59.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:50:59.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:50:59.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:50:59.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:50:59.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:50:49
2026-05-28T22:50:59.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70217, datetime.datetime(2026, 5, 28, 22, 50, 49), datetime.datetime(2026, 5, 28, 22, 50, 48), 'salt', 7.71, 67.64, None, 15.24, 144.0, 5.6, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:50:59.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:50:59.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:50:59.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:48, diff=11.144171s, valid=True
2026-05-28T22:50:59.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:50:59.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:50:59.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:12, diff=-12.852976s, valid=True
2026-05-28T22:50:59.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:50:59.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:50:59.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:50:41, diff=18.153646s, valid=True
2026-05-28T22:50:59.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:50:59.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:50:59.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:50:59.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:50:59.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:50:59.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:50:59.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:12, diff=-12.843287s, valid=True
2026-05-28T22:50:59.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:50:59.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:50:59.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:50:59.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934101.157401s, valid=True
2026-05-28T22:50:59.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:50:59.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:50:59.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:50:59.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:50:59.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:50:59.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:50:59.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:50:59.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:50:59.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:50:59.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:50:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:50:59.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:50:59.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:50:59.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:50:59.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:51:00.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:51:00.166 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:51:00.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:51:00.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-28T22:51:00.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-28T22:51:00.350 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:51:00.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:51:30.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:51:30.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:51: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-28T22:51:30.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:51:30.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:51:31.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:51:31.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:51:31.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:51:31.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-28T22:51:31.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:51:31.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:51:31.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:51:31.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-28T22:51:33.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T22:51:33.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:51:33.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:51:33.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:51:33.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:51:33.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:51:33.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:51:33.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:51:33.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:51:33.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:51:33.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:51:33.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:51:33.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:51:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:51:33.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:51:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:51:33.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:51:33.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:51:33.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:51:33.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:51:33.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:51:33.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:51:33.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:51:33.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:51:33.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:51:19
2026-05-28T22:51:33.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70218, datetime.datetime(2026, 5, 28, 22, 51, 19), datetime.datetime(2026, 5, 28, 22, 51, 18), 'salt', 7.65, 67.44, None, 15.39, 148.65, 5.64, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:51:33.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:51:33.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:51:33.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:18, diff=15.830168s, valid=True
2026-05-28T22:51:33.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:51:33.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:51:33.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:12, diff=21.83301s, valid=True
2026-05-28T22:51:33.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:51:33.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:11, diff=22.839536s, valid=True
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:51:33.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:51:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:12, diff=21.842556s, valid=True
2026-05-28T22:51:33.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:51:33.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:51:33.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:51:33.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934135.843219s, valid=True
2026-05-28T22:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:51:33.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:51:33.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:51:33.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:51:33.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:51:33.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:51:33.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:51:33.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:51:34.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:51:34.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:51:34.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:51:34.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:51:34.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:51:34.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:51:34.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:51:34.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:51:34.874 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T22:51:34.874 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T22:51:35.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:51:35.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:52:05.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:52:05.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:52:05.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:52:05.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:52:05.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:52:05.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:52:05.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-28T22:52:05.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:52:05.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-28T22:52:05.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:52:05.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:52:05.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:52:05.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-28T22:52:08.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-28T22:52:08.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:52:08.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:52:08.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:52:08.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:52:08.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:52:08.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:52:08.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:52:08.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:52:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:52:08.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:52:08.064 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:52:08.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:52:08.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:52:08.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:52:08.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:52:08.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:52:08.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:52:08.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:52:08.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:52:08.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:52:08.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:52:08.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:52:08.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:52:08.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:51:49
2026-05-28T22:52:08.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70219, datetime.datetime(2026, 5, 28, 22, 51, 49), datetime.datetime(2026, 5, 28, 22, 51, 49), 'salt', 7.68, 67.44, None, 13.45, 139.85, 5.64, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:52:08.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:52:08.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:52:08.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:49, diff=19.389064s, valid=True
2026-05-28T22:52:08.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:52:08.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:52:08.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:12, diff=-3.608086s, valid=True
2026-05-28T22:52:08.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:52:08.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:52:08.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:51:43, diff=25.398634s, valid=True
2026-05-28T22:52:08.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:52:08.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:52:08.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:52:08.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:52:08.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:52:08.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:52:08.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:12, diff=-3.598316s, valid=True
2026-05-28T22:52:08.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:52:08.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:52:08.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:52:08.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934170.402339s, valid=True
2026-05-28T22:52:08.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:52:08.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:52:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:52:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:52:08.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:52:08.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:52:08.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:52:08.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:52:08.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:52:08.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:52:08.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:52:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:52:08.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:52:08.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:52:08.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:52:09.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:52:09.393 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:52:09.393 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:52:09.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-28T22:52:09.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-28T22:52:09.587 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:52:09.587 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:52:39.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:52:39.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:52:39.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:52:39.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:52:39.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:52:40.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:52:40.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-28T22:52:40.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:52:40.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-28T22:52:40.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:52:40.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:52:40.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:52:40.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-28T22:52:42.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-28T22:52:42.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:52:42.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:52:42.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:52:42.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:52:42.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:52:42.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:52:42.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:52:42.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:52:42.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:52:42.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:52:42.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:52:42.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:52:42.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:52:42.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:52:42.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:52:42.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:52:42.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:52:42.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:52:42.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:52:42.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:52:42.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:52:42.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:52:42.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:52:42.901 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:52:19
2026-05-28T22:52:42.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70220, datetime.datetime(2026, 5, 28, 22, 52, 19), datetime.datetime(2026, 5, 28, 22, 52, 19), 'salt', 7.58, 67.47, None, 15.81, 141.91, 5.63, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:52:42.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:52:42.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:52:42.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:19, diff=23.907293s, valid=True
2026-05-28T22:52:42.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:52:42.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:52:42.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:12, diff=30.910133s, valid=True
2026-05-28T22:52:42.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:52:42.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:52:42.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:15, diff=27.91687s, valid=True
2026-05-28T22:52:42.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:52:42.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:52:42.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:52:42.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:52:42.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:52:42.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:52:42.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:12, diff=30.919872s, valid=True
2026-05-28T22:52:42.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:52:42.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:52:42.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:52:42.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934204.920524s, valid=True
2026-05-28T22:52:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:52:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:52:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:52:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:52:42.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:52:42.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:52:42.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:52:42.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:52:43.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:52:43.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:52:43.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:52:43.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:52:43.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:52:43.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:52:43.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:52:43.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:52:44.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:52:44.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:52:44.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-28T22:52:44.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-28T22:52:44.191 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:52:44.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:53:14.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:53:14.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:53:14.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:53:14.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:53:14.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:53:14.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:53:14.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-28T22:53:14.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:53:14.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T22:53:14.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:53:14.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:53:14.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:53:14.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:53:17.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-28T22:53:17.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:53:17.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:53:17.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:53:17.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:53:17.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:53:17.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:53:17.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:53:17.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:53:17.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:53:17.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:53:17.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:53:17.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:53:17.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:53:17.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:53:17.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:53:17.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:53:17.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:53:17.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:53:17.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:53:17.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:53:17.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:53:17.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:53:17.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:53:17.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:52:49
2026-05-28T22:53:17.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70221, datetime.datetime(2026, 5, 28, 22, 52, 49), datetime.datetime(2026, 5, 28, 22, 52, 49), 'salt', 7.61, 67.87, None, 15.42, 146.35, 5.54, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:53:17.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:53:17.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:53:17.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:49, diff=28.654635s, valid=True
2026-05-28T22:53:17.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:53:17.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:53:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:53:12, diff=5.657436s, valid=True
2026-05-28T22:53:17.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:53:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:53:17.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:52:46, diff=31.663918s, valid=True
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:53:17.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:53:17.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:53:12, diff=5.666886s, valid=True
2026-05-28T22:53:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:53:17.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:53:17.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:53:17.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934239.66753s, valid=True
2026-05-28T22:53:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:53:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:53:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:53:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:53:17.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:53:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:53:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:53:17.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:53:17.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:53:17.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:53:17.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:53:17.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:53:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:53:18.014 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:53:18.238 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:53:18.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:53:18.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:53:18.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:53:18.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-28T22:53:18.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-28T22:53:18.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:53:18.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:53:48.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:53:48.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:53:48.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:53:49.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:53:49.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:53:49.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:53:49.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T22:53:49.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:53:49.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-28T22:53:49.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:53:49.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:53:49.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:53:49.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-28T22:53:52.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-28T22:53:52.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:53:52.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:53:52.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:53:52.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:53:52.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:53:52.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:53:52.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:53:52.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:53:52.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:53:52.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:53:52.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:53:52.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:53:52.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:53:52.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:53:52.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:53:52.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:53:52.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:53:52.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:53:52.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:53:52.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:53:52.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:53:52.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:53:52.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:53:52.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:53:50
2026-05-28T22:53:52.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70223, datetime.datetime(2026, 5, 28, 22, 53, 50), datetime.datetime(2026, 5, 28, 22, 53, 50), 'salt', 7.51, 68.4, None, 15.99, 144.31, 5.43, 832.54, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:53:52.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:53:52.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:53:52.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:53:50, diff=2.411055s, valid=True
2026-05-28T22:53:52.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:53:52.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:53:52.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:12, diff=-19.586074s, valid=True
2026-05-28T22:53:52.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:53:52.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:53:49, diff=3.420477s, valid=True
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:53:52.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:53:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:12, diff=-19.576497s, valid=True
2026-05-28T22:53:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:53:52.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:53:52.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:53:52.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934274.424162s, valid=True
2026-05-28T22:53:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:53:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:53:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:53:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:53:52.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:53:52.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:53:52.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:53:52.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:53:52.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:53:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:53:52.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:53:52.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:53:52.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:53:52.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:53:53.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:53:53.421 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:53:53.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:53:53.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:53:53.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-28T22:53:53.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-28T22:53:53.691 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:53:53.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:54:23.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:54:23.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:54:23.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:54:24.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:54:24.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:54:24.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:54:24.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-28T22:54:24.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:54:24.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-28T22:54:24.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:54:24.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:54:24.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:54:24.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:54:26.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-28T22:54:26.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:54:26.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:54:26.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:54:26.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:54:26.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:54:26.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:54:26.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:54:26.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:54:26.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:54:26.857 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:54:26.857 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:54:26.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:54:26.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:54:26.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:54:27.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:54:27.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:54:27.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:54:27.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:54:27.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:54:27.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:54:27.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:54:27.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:54:27.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:54:27.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:54:20
2026-05-28T22:54:27.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70224, datetime.datetime(2026, 5, 28, 22, 54, 20), datetime.datetime(2026, 5, 28, 22, 54, 20), 'salt', 7.55, 68.57, None, 14.96, 144.92, 5.4, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:54:27.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:54:27.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:54:27.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:20, diff=7.184709s, valid=True
2026-05-28T22:54:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:54:27.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:54:27.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:12, diff=15.187526s, valid=True
2026-05-28T22:54:27.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:54:27.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:20, diff=7.194164s, valid=True
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:54:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:54:27.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:12, diff=15.197175s, valid=True
2026-05-28T22:54:27.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:54:27.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:54:27.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:54:27.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934309.197827s, valid=True
2026-05-28T22:54:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:54:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:54:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:54:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:54:27.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:54:27.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:54:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:54:27.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:54:27.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:54:27.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:54:27.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:54:27.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:54:27.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:54:27.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:54:27.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:54:28.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:54:28.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:54:28.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:54: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-28T22:54: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-28T22:54:28.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:54:28.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:54:58.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:54:58.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:54:58.450 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:54:58.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:54:58.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:54:59.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:54:59.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-28T22:54:59.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:54:59.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-28T22:54:59.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:54:59.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:54:59.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:54:59.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-28T22:55:01.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-28T22:55:01.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:55:01.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:55:01.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:55:01.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:55:01.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:55:01.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:55:01.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:55:01.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:55:01.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:55:01.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:55:01.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:55:01.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:55:01.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:55:01.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:55:01.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:55:01.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:55:01.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:55:01.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:55:01.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:55:01.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:55:01.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:55:01.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:55:01.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:55:01.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:54:51
2026-05-28T22:55:01.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70225, datetime.datetime(2026, 5, 28, 22, 54, 51), datetime.datetime(2026, 5, 28, 22, 54, 50), 'salt', 7.38, 69.06, None, 15.84, 140.27, 5.29, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:55:01.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:55:01.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:55:01.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:50, diff=11.91589s, valid=True
2026-05-28T22:55:01.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:55:01.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:55:01.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:12, diff=-10.081256s, valid=True
2026-05-28T22:55:01.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:55:01.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:54:43, diff=18.925259s, valid=True
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:55:01.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:55:01.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:12, diff=-10.071715s, valid=True
2026-05-28T22:55:01.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:55:01.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:55:01.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:55:01.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934343.928937s, valid=True
2026-05-28T22:55:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:55:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:55:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:55:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:55:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:55:01.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:55:01.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:55:01.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:55:02.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:55:02.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:55:02.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:55:02.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:55:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:55:02.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:55:02.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:55:03.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:55:03.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:55:03.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:55:03.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-28T22:55:03.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-28T22:55:03.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:55:03.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:55:33.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:55:33.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:55:33.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:55:33.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:55:33.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:55:34.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:55:34.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-28T22:55:34.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:55:34.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-28T22:55:34.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:55:34.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:55:34.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:55:34.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-28T22:55:36.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-28T22:55:36.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:55:36.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:55:36.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:55:36.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:55:36.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:55:36.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:55:36.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:55:36.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:55:36.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:55:36.659 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:55:36.659 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:55:36.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:55:36.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:55:36.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:55:36.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:55:36.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:55:36.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:55:36.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:55:36.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:55:36.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:55:36.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:55:36.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:55:36.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:55:36.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:55:21
2026-05-28T22:55:36.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70226, datetime.datetime(2026, 5, 28, 22, 55, 21), datetime.datetime(2026, 5, 28, 22, 55, 20), 'salt', 7.48, 69.43, None, 13.83, 141.23, 5.22, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:55:36.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:55:36.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:55:36.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:20, diff=16.973894s, valid=True
2026-05-28T22:55:36.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:55:36.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:55:36.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:12, diff=24.976744s, valid=True
2026-05-28T22:55:36.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:55:36.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:13, diff=23.983468s, valid=True
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:55:36.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:55:36.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:12, diff=24.986523s, valid=True
2026-05-28T22:55:36.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:55:36.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:55:36.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:55:36.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934378.987196s, valid=True
2026-05-28T22:55:36.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:55:36.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:55:36.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:55:36.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:55:36.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:55:37.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:55:37.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:55:37.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:55:37.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:55:37.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:55:37.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:55:37.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:55:37.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:55:37.308 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:55:37.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:55:37.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:55:37.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:55:37.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:55:37.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-28T22:55:37.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-28T22:55:38.195 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:55:38.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:56:08.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:56:08.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:56:08.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:56:08.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:56:08.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:56:08.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:56:08.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-28T22:56:08.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:56:08.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-28T22:56:08.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:56:08.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:56:08.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:56:08.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:56:11.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-28T22:56:11.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:56:11.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:56:11.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:56:11.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:56:11.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:56:11.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:56:11.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:56:11.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:56:11.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:56:11.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:56:11.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:56:11.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:56:11.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:56:11.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:56:11.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:56:11.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:56:11.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:56:11.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:56:11.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:56:11.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:56:11.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:56:11.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:56:11.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:56:11.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:55:51
2026-05-28T22:56:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70227, datetime.datetime(2026, 5, 28, 22, 55, 51), datetime.datetime(2026, 5, 28, 22, 55, 51), 'salt', 7.35, 70.09, None, 14.33, 145.15, 5.09, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:56:11.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:56:11.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:56:11.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:51, diff=20.44413s, valid=True
2026-05-28T22:56:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:56:11.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:56:11.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:12, diff=-0.553014s, valid=True
2026-05-28T22:56:11.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:56:11.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:56:11.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:55:44, diff=27.453685s, valid=True
2026-05-28T22:56:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:56:11.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:56:11.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:56:11.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:56:11.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:56:11.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:56:11.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:12, diff=-0.543258s, valid=True
2026-05-28T22:56:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:56:11.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:56:11.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:56:11.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934413.457412s, valid=True
2026-05-28T22:56:11.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:56:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:56:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:56:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:56:11.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:56:11.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:56:11.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:56:11.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:56:11.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:56:11.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:56:11.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:56:11.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:56:11.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:56:11.849 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:56:12.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:56:12.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:56:12.515 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:56:12.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:56:12.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-28T22:56:12.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-28T22:56:12.599 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:56:12.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:56:42.629 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:56:42.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:56:42.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:56:42.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:56:42.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:56:43.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:56:43.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-28T22:56:43.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:56:43.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-28T22:56:43.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:56:43.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:56:43.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:56:43.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T22:56:45.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-28T22:56:45.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:56:45.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:56:45.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:56:45.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:56:45.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:56:45.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:56:45.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:56:45.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:56:45.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:56:45.609 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:56:45.609 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:56:45.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:56:45.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:56:45.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:56:45.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:56:45.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:56:45.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:56:45.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:56:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:56:45.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:56:45.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:56:45.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:56:45.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:56:45.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:56:21
2026-05-28T22:56:45.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70228, datetime.datetime(2026, 5, 28, 22, 56, 21), datetime.datetime(2026, 5, 28, 22, 56, 21), 'salt', 7.32, 70.46, None, 14.47, 146.02, 5.02, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:56:45.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:56:45.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:56:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:21, diff=24.959026s, valid=True
2026-05-28T22:56:45.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:56:45.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:56:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:12, diff=33.961818s, valid=True
2026-05-28T22:56:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:56:45.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:15, diff=30.968446s, valid=True
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:56:45.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:56:45.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:12, diff=33.971425s, valid=True
2026-05-28T22:56:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:56:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:56:45.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:56:45.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934447.972091s, valid=True
2026-05-28T22:56:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:56:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:56:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:56:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:56:45.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:56:46.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:56:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:56:46.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:56:46.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:56:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:56:46.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:56:46.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:56:46.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:56:46.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:56:46.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:56:46.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:56:46.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:56:46.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:56:46.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-28T22:56:46.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-28T22:56:47.052 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:56:47.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:57:17.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:57:17.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:57:17.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:57:17.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:57:17.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:57:17.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:57:17.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-28T22:57:17.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:57:17.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-28T22:57:17.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:57:17.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:57:17.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:57:17.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-28T22:57:20.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-28T22:57:20.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:57:20.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:57:20.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:57:20.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:57:20.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:57:20.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:57:20.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:57:20.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:57:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:57:20.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:57:20.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:57:20.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:57:20.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:57:20.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:57:20.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:57:20.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:57:20.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:57:20.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:57:20.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:57:20.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:57:20.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:57:20.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:57:20.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:57:20.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:56:51
2026-05-28T22:57:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70229, datetime.datetime(2026, 5, 28, 22, 56, 51), datetime.datetime(2026, 5, 28, 22, 56, 51), 'salt', 7.25, 70.72, None, 14.5, 141.4, 4.96, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:57:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:57:20.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:57:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:51, diff=29.426669s, valid=True
2026-05-28T22:57:20.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:57:20.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:57:20.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:57:12, diff=8.431244s, valid=True
2026-05-28T22:57:20.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:57:20.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:57:20.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:56:47, diff=33.438646s, valid=True
2026-05-28T22:57:20.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:57:20.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:57:20.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:57:20.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:57:20.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:57:20.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:57:20.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:57:12, diff=8.44175s, valid=True
2026-05-28T22:57:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:57:20.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:57:20.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:57:20.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934482.442423s, valid=True
2026-05-28T22:57:20.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:57:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:57:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:57:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:57:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:57:20.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:57:20.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:57:20.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:57:20.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:57:20.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:57:20.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:57:20.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:57:20.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:57:20.893 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:57:21.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:57:21.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:57:21.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:57:21.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:57:21.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-28T22:57:21.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-28T22:57:21.887 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:57:21.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:57:51.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:57:51.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:57:51.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:57:52.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:57:52.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:57:52.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:57:52.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-28T22:57:52.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:57:52.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-28T22:57:52.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:57:52.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:57:52.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:57:52.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-28T22:57:56.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-28T22:57:56.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:57:56.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:57:56.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:57:56.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:57:56.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:57:56.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:57:56.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:57:56.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:57:56.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:57:56.272 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:57:56.272 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:57:56.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:57:56.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T22:57:56.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:57:56.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T22:57:56.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:57:56.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:57:56.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:57:56.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T22:57:56.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:57:56.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:57:56.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:57:56.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:57:56.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:57:52
2026-05-28T22:57:56.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70231, datetime.datetime(2026, 5, 28, 22, 57, 52), datetime.datetime(2026, 5, 28, 22, 57, 51), 'salt', 7.15, 71.22, None, 13.94, 146.3, 4.85, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:57:56.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:57:56.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T22:57:56.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:57:51, diff=5.610261s, valid=True
2026-05-28T22:57:56.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:57:56.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:57:56.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:12, diff=-15.385984s, valid=True
2026-05-28T22:57:56.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:57:56.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:57:50, diff=6.623001s, valid=True
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:57:56.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T22:57:56.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:12, diff=-15.372738s, valid=True
2026-05-28T22:57:56.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:57:56.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:57:56.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:57:56.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934518.628212s, valid=True
2026-05-28T22:57:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:57:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:57:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:57:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:57:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:57:56.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:57:56.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:57:56.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:57:56.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:57:56.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:57:56.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:57:56.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:57:56.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:57:56.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:57:57.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:57:57.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:57:57.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:57:57.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:57:57.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-28T22:57:57.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-28T22:57:57.904 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:57:57.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:58:27.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:58:27.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:58:27.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:58:28.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:58:28.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:58:28.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:58:28.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-28T22:58:28.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:58:28.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-28T22:58:28.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:58:28.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:58:28.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:58:28.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-28T22:58: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-28T22:58:30.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:58:30.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:58:30.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:58:30.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:58:30.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:58:30.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:58:30.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:58:30.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:58:30.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:58:30.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:58:30.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:58:30.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:58:30.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:58:30.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:58:31.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:58:31.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:58:31.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:58:31.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:58:31.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:58:31.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:58:31.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:58:31.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:58:31.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:58:31.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:58:22
2026-05-28T22:58:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70232, datetime.datetime(2026, 5, 28, 22, 58, 22), datetime.datetime(2026, 5, 28, 22, 58, 22), 'salt', 7.12, 71.29, None, 12.6, 145.15, 4.84, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:58:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:58:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:58:31.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:22, diff=9.202955s, valid=True
2026-05-28T22:58:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:58:31.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:58:31.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:12, diff=19.205776s, valid=True
2026-05-28T22:58:31.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:58:31.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:21, diff=10.212249s, valid=True
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:58:31.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:58:31.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:12, diff=19.215216s, valid=True
2026-05-28T22:58:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:58:31.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:58:31.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:58:31.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934553.21587s, valid=True
2026-05-28T22:58:31.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:58:31.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:58:31.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:58:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:58:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:58:31.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:58:31.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:58:31.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:58:31.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:58:31.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:58:31.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:58:31.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:58:32.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:58:32.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:58:32.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:58:32.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-28T22:58:32.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-28T22:58:32.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:58:32.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:59:02.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:59:02.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:59:02.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:59:02.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:59:02.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:59:02.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:59:02.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-28T22:59:02.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:59:02.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-28T22:59:02.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:59:02.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:59:02.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:59: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-28T22:59:05.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-28T22:59:05.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:59:05.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:59:05.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:59:05.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:59:05.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:59:05.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:59:05.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:59:05.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:59:05.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:59:05.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:59:05.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:59:05.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:59:05.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:59:05.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:59:05.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:59:05.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:59:05.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:59:05.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:59:05.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:59:05.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:59:05.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:59:05.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:59:05.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:59:05.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:58:52
2026-05-28T22:59:05.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70233, datetime.datetime(2026, 5, 28, 22, 58, 52), datetime.datetime(2026, 5, 28, 22, 58, 52), 'salt', 7.08, 71.59, None, 14.75, 142.95, 4.78, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:59:05.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:59:05.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:59:05.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:52, diff=13.62268s, valid=True
2026-05-28T22:59:05.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:59:05.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:59:05.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:12, diff=-6.374488s, valid=True
2026-05-28T22:59:05.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:59:05.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:58:45, diff=20.632038s, valid=True
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:59:05.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:59:05.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:12, diff=-6.364938s, valid=True
2026-05-28T22:59:05.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:59:05.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:59:05.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:59:05.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934587.635726s, valid=True
2026-05-28T22:59:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:59:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:59:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:59:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:59:05.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:59:05.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:59:05.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:59:05.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:59:05.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:59:05.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:59:05.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:59:05.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:59:05.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:59:05.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:59:06.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:59:06.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:59:06.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:59:06.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:59:06.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-28T22:59:06.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-28T22:59:06.923 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:59:06.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T22:59:36.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T22:59:36.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T22:59:36.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T22:59:37.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T22:59:37.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T22:59:37.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T22:59:37.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-28T22:59:37.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T22:59:37.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-28T22:59:37.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T22:59:37.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T22:59:37.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T22:59:37.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-28T22:59:39.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-28T22:59:39.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T22:59:39.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T22:59:39.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T22:59:39.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T22:59:39.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T22:59:39.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T22:59:39.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T22:59:39.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T22:59:39.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T22:59:39.886 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T22:59:39.886 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T22:59:39.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T22:59:39.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T22:59:39.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T22:59:40.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T22:59:40.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:59:40.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:59:40.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T22:59:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T22:59:40.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T22:59:40.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T22:59:40.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T22:59:40.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T22:59:40.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:59:23
2026-05-28T22:59:40.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70234, datetime.datetime(2026, 5, 28, 22, 59, 23), datetime.datetime(2026, 5, 28, 22, 59, 22), 'salt', 7.08, 71.65, None, 13.59, 145.51, 4.76, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T22:59:40.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T22:59:40.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T22:59:40.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:22, diff=18.234829s, valid=True
2026-05-28T22:59:40.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T22:59:40.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:59:40.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:12, diff=28.237674s, valid=True
2026-05-28T22:59:40.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T22:59:40.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:15, diff=25.244274s, valid=True
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T22:59:40.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T22:59:40.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:12, diff=28.247291s, valid=True
2026-05-28T22:59:40.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T22:59:40.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T22:59:40.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T22:59:40.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934622.247956s, valid=True
2026-05-28T22:59:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T22:59:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T22:59:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T22:59:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T22:59:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T22:59:40.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T22:59:40.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T22:59:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T22:59:40.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T22:59:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T22:59:40.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T22:59:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T22:59:40.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T22:59:40.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T22:59:40.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:59:41.169 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T22:59:41.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T22:59:41.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T22:59:41.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-28T22:59:41.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-28T22:59:41.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T22:59:41.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:00:11.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:00:11.475 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:00:11.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:00:11.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:00:11.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:00:11.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:00:11.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-28T23:00:11.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:00:11.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-28T23:00:11.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:00:11.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:00:11.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:00:11.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:00:14.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:00:14.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:00:14.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:00:14.733 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:00:14.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:00:14.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:00:14.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:00:14.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:00:14.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:00:14.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:00:14.758 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:00:14.758 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:00:14.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:00:14.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:00:14.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:00:14.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:00:14.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:00:14.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:00:14.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:00:15.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:00:15.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:00:15.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:00:15.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:00:15.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:00:15.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 22:59:53
2026-05-28T23:00:15.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70235, datetime.datetime(2026, 5, 28, 22, 59, 53), datetime.datetime(2026, 5, 28, 22, 59, 52), 'salt', 7.05, 71.62, None, 15.07, 140.32, 4.77, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:00:15.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:00:15.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:00:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:52, diff=23.100543s, valid=True
2026-05-28T23:00:15.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:00:15.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:00:15.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:12, diff=3.103397s, valid=True
2026-05-28T23:00:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:00:15.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 22:59:45, diff=30.110116s, valid=True
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:00:15.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:12, diff=3.113114s, valid=True
2026-05-28T23:00:15.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:00:15.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:00:15.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934657.113773s, valid=True
2026-05-28T23:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:00:15.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:00:15.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:00:15.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:00:15.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:00:15.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:00:15.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:00:15.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:00:15.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:00:15.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:00:15.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:00:15.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:00:16.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:00:16.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:00:16.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:00:16.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-28T23:00:16.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-28T23:00:16.375 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:00:16.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:00:46.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:00:46.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:00:46.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:00:46.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:00:46.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:00:46.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:00:46.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-28T23:00:46.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:00:46.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-28T23:00:46.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:00:46.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:00:46.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:00:46.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-28T23:00:50.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:00:50.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:00:50.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:00:50.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:00:50.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:00:50.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:00:50.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:00:50.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:00:50.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:00:50.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:00:50.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:00:50.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:00:50.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:00:50.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:00:50.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:00:50.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:00:50.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:00:50.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:00:50.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:00:50.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:00:50.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:00:50.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:00:50.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:00:50.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:00:50.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:00:23
2026-05-28T23:00:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70236, datetime.datetime(2026, 5, 28, 23, 0, 23), datetime.datetime(2026, 5, 28, 23, 0, 23), 'salt', 7.12, 71.65, None, 15.0, 146.66, 4.77, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:00:50.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:00:50.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:00:50.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:23, diff=27.406541s, valid=True
2026-05-28T23:00:50.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:00:50.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:00:50.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:12, diff=38.409375s, valid=True
2026-05-28T23:00:50.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:00:50.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:00:50.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:17, diff=33.415774s, valid=True
2026-05-28T23:00:50.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:00:50.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:00:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:00:50.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:00:50.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:00:50.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:00:50.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:00:12, diff=38.418762s, valid=True
2026-05-28T23:00:50.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:00:50.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:00:50.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:00:50.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934692.419403s, valid=True
2026-05-28T23:00:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:00:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:00:50.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:00:50.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:00:50.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:00:50.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:00:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:00:50.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:00:50.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:00:50.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:00:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:00:50.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:00:50.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:00:50.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:00:50.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:00:51.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:00:51.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:00:51.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:00:51.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-28T23:00:51.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-28T23:00:51.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:00:51.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:01:21.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:01:21.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:01:21.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:01:21.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:01:21.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:01:22.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:01:22.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-28T23:01:22.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:01:22.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-28T23:01:22.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:01:22.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:01:22.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:01:22.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-28T23:01:24.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:01:24.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:01:24.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:01:24.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:01:24.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:01:24.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:01:24.665 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:01:24.665 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:01:24.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:01:24.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:01:24.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:01:24.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:01:24.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:01:24.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T23:01:24.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:01:24.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T23:01:24.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:01:24.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:01:24.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:01:24.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:01:24.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:01:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:01:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:01:24.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:01:24.988 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:01:24
2026-05-28T23:01:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70238, datetime.datetime(2026, 5, 28, 23, 1, 24), datetime.datetime(2026, 5, 28, 23, 1, 24), 'salt', 7.25, 71.55, None, 14.82, 140.43, 4.79, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:01:24.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:01:24.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T23:01:24.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:24, diff=0.994938s, valid=True
2026-05-28T23:01:24.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:01:24.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:01:24.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:12, diff=12.997785s, valid=True
2026-05-28T23:01:24.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:01:24.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:19, diff=6.004328s, valid=True
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:01:25.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:01:25.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:12, diff=13.007444s, valid=True
2026-05-28T23:01:25.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:01:25.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:01:25.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:01:25.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934727.008123s, valid=True
2026-05-28T23:01:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:01:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:01:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:01:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:01:25.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:01:25.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:01:25.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:01:25.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:01:25.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:01:25.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:01:25.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:01:25.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:01:25.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:01:25.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:01:25.635 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:01:25.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:01:26.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:01:26.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:01:26.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-28T23:01:26.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-28T23:01:26.176 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:01:26.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:01:56.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:01:56.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:01:56.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:01:56.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:01:56.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:01:56.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:01:56.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-28T23:01:56.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:01:56.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-28T23:01:56.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:01:56.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:01:56.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:01:56.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-28T23:01:58.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-28T23:01:58.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:01:58.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:01:58.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:01:58.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:01:59.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:01:59.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:01:59.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:01:59.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:01:59.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:01:59.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:01:59.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:01:59.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:01:59.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T23:01:59.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:01:59.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T23:01:59.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:01:59.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:01:59.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:01:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:01:59.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:01:59.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:01:59.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:01:59.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:01:59.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:01:54
2026-05-28T23:01:59.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70239, datetime.datetime(2026, 5, 28, 23, 1, 54), datetime.datetime(2026, 5, 28, 23, 1, 54), 'salt', 7.25, 71.35, None, 14.19, 137.45, 4.83, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:01:59.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:01:59.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T23:01:59.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:54, diff=5.329044s, valid=True
2026-05-28T23:01:59.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:01:59.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:01:59.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:12, diff=-12.668067s, valid=True
2026-05-28T23:01:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:01:59.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:01:51, diff=8.339076s, valid=True
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:01:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:01:59.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:12, diff=-12.657499s, valid=True
2026-05-28T23:01:59.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:01:59.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:01:59.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:01:59.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934761.34334s, valid=True
2026-05-28T23:01:59.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:01:59.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:01:59.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:01:59.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:01:59.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:01:59.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:01:59.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:01:59.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:01:59.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:01:59.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:01:59.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:01:59.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:01:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:01:59.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:01:59.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:02:00.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:02:00.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:02:00.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:02:00.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-28T23:02:00.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-28T23:02:00.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:02:00.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:02:30.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:02:30.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:02:30.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:02:30.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:02:30.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:02:31.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:02:31.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-28T23:02:31.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:02:31.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-28T23:02:31.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:02:31.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:02:31.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:02: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-28T23:02:34.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-28T23:02:34.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:02:34.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:02:34.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:02:34.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:02:34.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:02:34.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:02:34.304 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:02:34.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:02:34.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:02:34.305 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:02:34.305 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:02:34.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:02:34.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:02:34.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:02:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:02:34.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:02:34.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:02:34.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:02:34.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:02:34.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:02:34.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:02:34.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:02:34.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:02:34.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:02:25
2026-05-28T23:02:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70240, datetime.datetime(2026, 5, 28, 23, 2, 25), datetime.datetime(2026, 5, 28, 23, 2, 24), 'salt', 7.22, 71.35, None, 13.83, 140.11, 4.83, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:02:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:02:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:02:34.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:24, diff=10.637768s, valid=True
2026-05-28T23:02:34.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:02:34.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:02:34.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:12, diff=22.641172s, valid=True
2026-05-28T23:02:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:02:34.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:02:34.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:22, diff=12.647742s, valid=True
2026-05-28T23:02:34.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:02:34.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:02:34.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:02:34.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:02:34.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:02:34.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:02:34.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:12, diff=22.651279s, valid=True
2026-05-28T23:02:34.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:02:34.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:02:34.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:02:34.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934796.651957s, valid=True
2026-05-28T23:02:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:02:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:02:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:02:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:02:34.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:02:34.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:02:34.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:02:34.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:02:34.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:02:34.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:02:34.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:02:34.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:02:35.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:02:35.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:02:35.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:02:35.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:02:35.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:02:35.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:02:35.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-28T23:02:35.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-28T23:02:35.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:02:35.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:03:05.983 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:03:05.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:03:05.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:03:06.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:03:06.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:03:06.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:03:06.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-28T23:03:06.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:03:06.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:03:06.333 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:03:06.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:03:06.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:03:06.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-28T23:03:08.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-28T23:03:08.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:03:08.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:03:08.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:03:08.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:03:08.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:03:08.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:03:08.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:03:08.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:03:08.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:03:08.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:03:08.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:03:08.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:03:08.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:03:08.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:03:08.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:03:08.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:03:08.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:03:08.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:03:09.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:03:09.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:03:09.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:03:09.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:03:09.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:03:09.079 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:02:55
2026-05-28T23:03:09.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70241, datetime.datetime(2026, 5, 28, 23, 2, 55), datetime.datetime(2026, 5, 28, 23, 2, 55), 'salt', 7.22, 71.42, None, 13.97, 139.73, 4.82, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:03:09.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:03:09.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:03:09.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:55, diff=14.085616s, valid=True
2026-05-28T23:03:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:03:09.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:03:09.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:12, diff=-2.911487s, valid=True
2026-05-28T23:03:09.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:03:09.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:02:54, diff=15.095105s, valid=True
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:03:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:03:09.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:12, diff=-2.90188s, valid=True
2026-05-28T23:03:09.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:03:09.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:03:09.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:03:09.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934831.098788s, valid=True
2026-05-28T23:03:09.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:03:09.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:03:09.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:03:09.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:03:09.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:03:09.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:03:09.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:03:09.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:03:09.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:03:09.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:03:09.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:03:09.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:03:09.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:03:09.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:03:09.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:03:10.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:03:10.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:03:10.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:03:10.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-28T23:03:10.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-28T23:03:10.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:03:10.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:03:40.237 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:03:40.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:03:40.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:03:40.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:03:40.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:03:40.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:03:40.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-28T23:03:40.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:03:40.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-28T23:03:40.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:03:40.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:03:40.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:03:40.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-28T23:03:43.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-28T23:03:43.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:03:43.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:03:43.691 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:03:43.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:03:43.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:03:43.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:03:43.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:03:43.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:03:43.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:03:43.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:03:43.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:03:43.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:03:43.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:03:43.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:03:43.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:03:43.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:03:43.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:03:43.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:03:43.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:03:43.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:03:43.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:03:43.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:03:43.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:03:44.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:03:25
2026-05-28T23:03:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70242, datetime.datetime(2026, 5, 28, 23, 3, 25), datetime.datetime(2026, 5, 28, 23, 3, 25), 'salt', 7.15, 71.45, None, 15.07, 139.45, 4.81, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:03:44.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:03:44.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:03:44.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:25, diff=19.033552s, valid=True
2026-05-28T23:03:44.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:03:44.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:03:44.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:12, diff=32.036404s, valid=True
2026-05-28T23:03:44.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:03:44.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:17, diff=27.042985s, valid=True
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:03:44.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:03:44.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:12, diff=32.046083s, valid=True
2026-05-28T23:03:44.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:03:44.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:03:44.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:03:44.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934866.04676s, valid=True
2026-05-28T23:03:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:03:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:03:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:03:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:03:44.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:03:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:03:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:03:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:03:44.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:03:44.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:03:44.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:03:44.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:03:44.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:03:44.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:03:44.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:03:44.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:03:45.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:03:45.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:03:45.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-28T23:03:45.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-28T23:03:45.231 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:03:45.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:04:15.254 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:04:15.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:04:15.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:04:15.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:04:15.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:04:16.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:04:16.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-28T23:04:16.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:04:16.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-28T23:04:16.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:04:16.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:04:16.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:04:16.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-28T23:04:18.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:04:18.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:04:18.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:04:18.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:04:18.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:04:18.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:04:18.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:04:18.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:04:18.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:04:18.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:04:18.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:04:18.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:04:18.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:04:18.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:04:18.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:04:18.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:04:18.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:04:18.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:04:18.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:04:19.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:04:19.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:04:19.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:04:19.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:04:19.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:04:19.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:03:55
2026-05-28T23:04:19.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70243, datetime.datetime(2026, 5, 28, 23, 3, 55), datetime.datetime(2026, 5, 28, 23, 3, 55), 'salt', 7.15, 71.59, None, 14.5, 140.57, 4.78, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:04:19.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:04:19.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:04:19.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:55, diff=24.097172s, valid=True
2026-05-28T23:04:19.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:04:19.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:04:19.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:12, diff=7.101139s, valid=True
2026-05-28T23:04:19.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:04:19.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:03:48, diff=31.110398s, valid=True
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:04:19.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:04:19.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:04:19.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:12, diff=7.114733s, valid=True
2026-05-28T23:04:19.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:04:19.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:04:19.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:04:19.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934901.115709s, valid=True
2026-05-28T23:04:19.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:04:19.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:04:19.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:04:19.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:04:19.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:04:19.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:04:19.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:04:19.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:04:19.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:04:19.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:04:19.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:04:19.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:04:19.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:04:19.468 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:04:19.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:04:20.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:04:20.238 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:04:20.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:04:20.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-28T23:04:20.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-28T23:04:20.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:04:20.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:04:50.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:04:50.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:04:50.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:04:50.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:04:50.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:04:50.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:04:50.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:04:50.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:04:50.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-28T23:04:50.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:04:50.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:04:50.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:04:50.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-28T23:04:53.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-28T23:04:53.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:04:53.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:04:53.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:04:53.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:04:53.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:04:53.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:04:53.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:04:53.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:04:53.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:04:53.259 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:04:53.259 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:04:53.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:04:53.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:04:53.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:04:53.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:04:53.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:04:53.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:04:53.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:04:53.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:04:53.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:04:53.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:04:53.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:04:53.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:04:53.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:04:26
2026-05-28T23:04:53.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70244, datetime.datetime(2026, 5, 28, 23, 4, 26), datetime.datetime(2026, 5, 28, 23, 4, 25), 'salt', 7.15, 71.82, None, 14.33, 139.35, 4.74, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:04:53.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:04:53.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:04:53.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:25, diff=28.610795s, valid=True
2026-05-28T23:04:53.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:04:53.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:04:53.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:12, diff=41.613876s, valid=True
2026-05-28T23:04:53.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:04:53.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:04:53.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:18, diff=35.620917s, valid=True
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:04:53.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:04:53.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:04:12, diff=41.623978s, valid=True
2026-05-28T23:04:53.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:04:53.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:04:53.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:04:53.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934935.62464s, valid=True
2026-05-28T23:04:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:04:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:04:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:04:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:04:53.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:04:53.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:04:53.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:04:53.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:04:53.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:04:53.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:04:53.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:04:53.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:04:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:04:53.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:04:54.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:04:54.539 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:04:54.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:04:54.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:04:54.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-28T23:04:54.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-28T23:04:54.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:04:54.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:05:24.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:05:24.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:05:24.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:05:25.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:05:25.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:05:25.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:05:25.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-28T23:05:25.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:05: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-28T23:05:25.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:05:25.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:05:25.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:05: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-28T23:05:27.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:05:27.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:05:27.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:05:27.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:05:27.887 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:05:27.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:05:27.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:05:27.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:05:27.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:05:27.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:05:27.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:05:27.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:05:27.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:05:28.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T23:05:28.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:05:28.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T23:05:28.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:05:28.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:05:28.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:05:28.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:05:28.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:05:28.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:05:28.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:05:28.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:05:28.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:05:26
2026-05-28T23:05:28.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70246, datetime.datetime(2026, 5, 28, 23, 5, 26), datetime.datetime(2026, 5, 28, 23, 5, 26), 'salt', 6.92, 72.42, None, 13.52, 137.34, 4.61, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:05:28.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:05:28.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T23:05:28.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:26, diff=2.246292s, valid=True
2026-05-28T23:05:28.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:05:28.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:05:28.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:12, diff=16.249233s, valid=True
2026-05-28T23:05:28.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:05:28.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T23:05:28.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:21, diff=7.255921s, valid=True
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:05:28.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:05:28.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:12, diff=16.259031s, valid=True
2026-05-28T23:05:28.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:05:28.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:05:28.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:05:28.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=934970.259697s, valid=True
2026-05-28T23:05:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:05:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:05:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:05:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:05:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:05:28.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:05:28.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:05:28.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:05:28.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:05:28.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:05:28.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:05:28.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:05:28.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:05:28.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:05:28.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:05:29.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:05:29.439 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:05:29.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:05:29.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-28T23:05:29.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-28T23:05:29.689 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:05:29.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:05:59.719 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:05:59.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:05:59.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:05:59.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:05:59.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:06:00.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:06:00.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-28T23:06:00.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:06:00.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-28T23:06:00.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:06:00.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:06:00.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:06:00.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-28T23:06:03.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-28T23:06:03.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:06:03.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:06:03.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:06:03.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:06:03.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:06:03.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:06:03.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:06:03.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:06:03.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:06:03.261 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:06:03.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:06:03.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:06:03.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:06:03.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:06:03.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:06:03.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:06:03.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:06:03.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:06:03.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:06:03.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:06:03.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:06:03.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:06:03.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:06:03.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:05:56
2026-05-28T23:06:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70247, datetime.datetime(2026, 5, 28, 23, 5, 56), datetime.datetime(2026, 5, 28, 23, 5, 56), 'salt', 6.98, 72.65, None, 12.99, 138.11, 4.56, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:06:03.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:06:03.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:06:03.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:56, diff=7.597358s, valid=True
2026-05-28T23:06:03.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:06:03.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:06:03.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:12, diff=-8.399723s, valid=True
2026-05-28T23:06:03.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:06:03.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:06:03.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:05:52, diff=11.6069s, valid=True
2026-05-28T23:06:03.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:06:03.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:06:03.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:06:03.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:06:03.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:06:03.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:06:03.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:12, diff=-8.389995s, valid=True
2026-05-28T23:06:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:06:03.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:06:03.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:06:03.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935005.610672s, valid=True
2026-05-28T23:06:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:06:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:06:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:06:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:06:03.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:06:03.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:06:03.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:06:03.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:06:03.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:06:03.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:06:03.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:06:03.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:06:03.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:06:03.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:06:04.192 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:06:04.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:06:04.667 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:06:04.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:06:04.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-28T23:06:04.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-28T23:06:04.909 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:06:04.909 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:06:34.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:06:34.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:06:34.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:06:35.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:06:35.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:06:35.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:06:35.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-28T23:06:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:06:35.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:06:35.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:06:35.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:06:35.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:06:35.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-28T23:06: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-28T23:06:38.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:06:38.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:06:38.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:06:38.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:06:38.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:06:38.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:06:38.216 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:06:38.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:06:38.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:06:38.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:06:38.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:06:38.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:06:38.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:06:38.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:06:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:06:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:06:38.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:06:38.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:06:38.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:06:38.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:06:38.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:06:38.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:06:38.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:06:38.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:06:27
2026-05-28T23:06:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70248, datetime.datetime(2026, 5, 28, 23, 6, 27), datetime.datetime(2026, 5, 28, 23, 6, 26), 'salt', 6.78, 73.05, None, 13.8, 137.08, 4.48, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:06:38.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:06:38.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:06:38.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:26, diff=12.554981s, valid=True
2026-05-28T23:06:38.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:06:38.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:06:38.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:12, diff=26.557852s, valid=True
2026-05-28T23:06:38.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:06:38.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:23, diff=15.564433s, valid=True
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:06:38.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:06:38.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:12, diff=26.56757s, valid=True
2026-05-28T23:06:38.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:06:38.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:06:38.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:06:38.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935040.568237s, valid=True
2026-05-28T23:06:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:06:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:06:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:06:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:06:38.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:06:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:06:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:06:38.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:06:38.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:06:38.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:06:38.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:06:38.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:06:38.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:06:38.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:06:39.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:06:39.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:06:39.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:06:39.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:06:39.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-28T23:06:39.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-28T23:06:40.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:06:40.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:07:10.339 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:07:10.339 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:07:10.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:07:10.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:07:10.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:07:10.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:07:10.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-28T23:07:10.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:07:10.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-28T23:07:10.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:07:10.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:07:10.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:07:10.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-28T23:07:14.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:07:14.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:07:14.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:07:14.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:07:14.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:07:14.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:07:14.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:07:14.175 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:07:14.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:07:14.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:07:14.175 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:07:14.175 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:07:14.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:07:14.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:07:14.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:07:14.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:07:14.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:07:14.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:07:14.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:07:14.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:07:14.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:07:14.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:07:14.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:07:14.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:07:14.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:06:58
2026-05-28T23:07:14.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70249, datetime.datetime(2026, 5, 28, 23, 6, 58), datetime.datetime(2026, 5, 28, 23, 6, 57), 'salt', 6.78, 73.28, None, 13.3, 137.95, 4.44, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:07:14.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:07:14.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:07:14.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:57, diff=17.52894s, valid=True
2026-05-28T23:07:14.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:07:14.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:07:14.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:12, diff=2.532357s, valid=True
2026-05-28T23:07:14.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:07:14.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:06:55, diff=19.539274s, valid=True
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:07:14.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:07:14.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:12, diff=2.542332s, valid=True
2026-05-28T23:07:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:07:14.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:07:14.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:07:14.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935076.543004s, valid=True
2026-05-28T23:07:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:07:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:07:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:07:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:07:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:07:14.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:07:14.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:07:14.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:07:14.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:07:14.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:07:14.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:07:14.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:07:14.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:07:14.870 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:07:15.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:07:15.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:07:15.545 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:07:15.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:07:15.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-28T23:07:15.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-28T23:07:15.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:07:15.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:07:45.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:07:45.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:07:45.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:07:46.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:07:46.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:07:46.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:07:46.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-28T23:07:46.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:07:46.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-28T23:07:46.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:07:46.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:07:46.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:07:46.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-28T23:07:48.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-28T23:07:48.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:07:48.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:07:48.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:07:48.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:07:48.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:07:48.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:07:48.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:07:48.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:07:48.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:07:48.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:07:48.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:07:48.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:07:49.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:07:49.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:07:49.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:07:49.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:07:49.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:07:49.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:07:49.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:07:49.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:07:49.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:07:49.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:07:49.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:07:49.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:07:28
2026-05-28T23:07:49.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70250, datetime.datetime(2026, 5, 28, 23, 7, 28), datetime.datetime(2026, 5, 28, 23, 7, 28), 'salt', 6.65, 73.91, None, 13.41, 133.2, 4.31, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:07:49.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:07:49.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:07:49.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:28, diff=21.268795s, valid=True
2026-05-28T23:07:49.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:07:49.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:07:49.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:12, diff=37.271641s, valid=True
2026-05-28T23:07:49.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:07:49.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:26, diff=23.278192s, valid=True
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:07:49.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:07:49.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:12, diff=37.281231s, valid=True
2026-05-28T23:07:49.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:07:49.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:07:49.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:07:49.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935111.281902s, valid=True
2026-05-28T23:07:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:07:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:07:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:07:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:07:49.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:07:49.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:07:49.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:07:49.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:07:49.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:07:49.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:07:49.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:07:49.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:07:49.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:07:49.687 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:07:49.913 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:07:50.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:07:50.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:07:50.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:07:50.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-28T23:07:50.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-28T23:07:50.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:07:50.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:08:20.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:08:20.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:08:20.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:08:20.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:08:20.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:08:20.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:08:20.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-28T23:08:20.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:08:20.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-28T23:08:21.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:08:21.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:08:21.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:08:21.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-28T23:08:23.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-28T23:08:23.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:08:23.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:08:23.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:08:23.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:08:23.566 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:08:23.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:08:23.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:08:23.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:08:23.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:08:23.578 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:08:23.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:08:23.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:08:23.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:08:23.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:08:23.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:08:23.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:08:23.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:08:23.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:08:23.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:08:23.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:08:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:08:23.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:08:23.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:08:23.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:07:58
2026-05-28T23:08:23.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70251, datetime.datetime(2026, 5, 28, 23, 7, 58), datetime.datetime(2026, 5, 28, 23, 7, 58), 'salt', 6.55, 74.17, None, 13.62, 132.78, 4.26, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:08:23.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:08:23.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:08:23.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:58, diff=25.918654s, valid=True
2026-05-28T23:08:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:08:23.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:08:23.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:08:12, diff=11.921487s, valid=True
2026-05-28T23:08:23.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:08:23.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:07:58, diff=25.929207s, valid=True
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:08:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:08:23.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:08:12, diff=11.93448s, valid=True
2026-05-28T23:08:23.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:08:23.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:08:23.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:08:23.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935145.935267s, valid=True
2026-05-28T23:08:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:08:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:08:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:08:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:08:23.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:08:23.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:08:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:08:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:08:24.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:08:24.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:08:24.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:08:24.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:08:24.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:08:24.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:08:24.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:08:24.860 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:08:24.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:08:24.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:08:24.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-28T23:08:24.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-28T23:08:25.170 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:08:25.170 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:08:55.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:08:55.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:08:55.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:08:55.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:08:55.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:08:55.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:08:55.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-28T23:08:55.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:08:55.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-28T23:08:55.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:08:55.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:08:55.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:08:55.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:08:59.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-28T23:08:59.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:08:59.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:08:59.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:08:59.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:08:59.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:08:59.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:08:59.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:08:59.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:08:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:08:59.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:08:59.042 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:08:59.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:08:59.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from salt
2026-05-28T23:08:59.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:08:59.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1433 rows from monet
2026-05-28T23:08:59.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:08:59.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:08:59.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:08:59.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:08:59.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:08:59.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:08:59.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:08:59.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:08:59.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:08:59
2026-05-28T23:08:59.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70253, datetime.datetime(2026, 5, 28, 23, 8, 59), datetime.datetime(2026, 5, 28, 23, 8, 58), 'salt', 6.62, 74.87, None, 12.1, 132.97, 4.13, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:08:59.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:08:59.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 10 fields
2026-05-28T23:08:59.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:08:58, diff=1.386223s, valid=True
2026-05-28T23:08:59.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:08:59.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:08:59.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:12, diff=-12.610934s, valid=True
2026-05-28T23:08:59.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:08:59.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1433 rows. Structure expected: 11 fields
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:08:50, diff=9.39555s, valid=True
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:08:59.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:08:59.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:12, diff=-12.601451s, valid=True
2026-05-28T23:08:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:08:59.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:08:59.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:08:59.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935181.399205s, valid=True
2026-05-28T23:08:59.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:08:59.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:08:59.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:08:59.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:08:59.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:08:59.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:08:59.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:08:59.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:08:59.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:08:59.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:08:59.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:08:59.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:08:59.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:08:59.800 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:09:00.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:09:00.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:09:00.504 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:09:00.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:09:00.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-28T23:09:00.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-28T23:09:00.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:09:00.584 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:09:30.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:09:30.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:09:30.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:09:30.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:09:30.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:09:31.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:09:31.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-28T23:09:31.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:09:31.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-28T23:09:31.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:09:31.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:09:31.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:09:31.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-28T23:09:33.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:09:33.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:09:33.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:09:33.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:09:33.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:09:33.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:09:33.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:09:33.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:09:33.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:09:33.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:09:33.698 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:09:33.698 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:09:33.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:09:33.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:09:33.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:09:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:09:33.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:09:33.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:09:33.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:09:33.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:09:33.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:09:33.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:09:33.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:09:33.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:09:34.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:09:29
2026-05-28T23:09:34.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70254, datetime.datetime(2026, 5, 28, 23, 9, 29), datetime.datetime(2026, 5, 28, 23, 9, 29), 'salt', 6.58, 75.27, None, 13.34, 131.02, 4.05, 832.47, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:09:34.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:09:34.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:09:34.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:29, diff=5.067542s, valid=True
2026-05-28T23:09:34.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:09:34.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:09:34.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:12, diff=22.070417s, valid=True
2026-05-28T23:09:34.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:09:34.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:22, diff=12.077251s, valid=True
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:09:34.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:09:34.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:12, diff=22.080561s, valid=True
2026-05-28T23:09:34.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:09:34.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:09:34.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:09:34.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935216.081252s, valid=True
2026-05-28T23:09:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:09:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:09:34.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:09:34.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:09:34.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:09:34.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:09:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:09:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:09:34.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:09:34.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:09:34.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:09:34.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:09:34.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:09:34.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:09:34.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:09:34.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:09:35.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:09:35.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:09:35.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-28T23:09:35.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-28T23:09:35.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:09:35.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:10:05.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:10:05.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:10:05.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:10:05.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:10:05.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:10:06.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:10:06.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-28T23:10:06.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:10:06.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-28T23:10:06.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:10:06.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:10:06.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:10:06.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-28T23:10:08.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-28T23:10:08.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:10:08.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:10:08.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:10:08.415 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:10:08.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:10:08.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:10:08.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:10:08.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:10:08.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:10:08.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:10:08.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:10:08.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:10:08.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from salt
2026-05-28T23:10:08.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:10:08.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1432 rows from monet
2026-05-28T23:10:08.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:10:08.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:10:08.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:10:08.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:10:08.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:10:08.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:10:08.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:10:08.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:10:08.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:09:59
2026-05-28T23:10:08.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70255, datetime.datetime(2026, 5, 28, 23, 9, 59), datetime.datetime(2026, 5, 28, 23, 9, 59), 'salt', 6.55, 75.43, None, 13.27, 132.97, 4.02, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:10:08.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:10:08.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 10 fields
2026-05-28T23:10:08.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:59, diff=9.77652s, valid=True
2026-05-28T23:10:08.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:10:08.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:10:08.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:12, diff=-3.220623s, valid=True
2026-05-28T23:10:08.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:10:08.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1432 rows. Structure expected: 11 fields
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:09:54, diff=14.786031s, valid=True
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:10:08.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:10:08.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:12, diff=-3.211026s, valid=True
2026-05-28T23:10:08.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:10:08.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:10:08.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:10:08.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935250.789627s, valid=True
2026-05-28T23:10:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:10:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:10:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:10:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:10:08.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:10:08.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:10:08.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:10:08.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:10:08.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:10:08.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:10:08.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:10:09.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:10:09.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:10:09.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:10:09.318 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:10:09.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:10:09.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:10:09.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:10:09.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-28T23:10:09.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-28T23:10:09.845 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:10:09.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:10:39.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:10:39.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:10: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-28T23:10:40.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:10:40.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:10:40.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:10: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-28T23:10:40.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:10:40.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-28T23:10:40.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:10:40.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:10:40.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:10:40.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-28T23:10:43.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-28T23:10:43.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:10:43.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:10:43.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:10:43.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:10:43.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:10:43.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:10:43.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:10:43.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:10:43.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:10:43.752 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:10:43.752 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:10:43.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:10:43.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:10:43.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:10:43.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:10:43.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:10:43.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:10:43.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:10:44.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:10:44.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:10:44.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:10:44.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:10:44.027 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:10:44.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:10:29
2026-05-28T23:10:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70256, datetime.datetime(2026, 5, 28, 23, 10, 29), datetime.datetime(2026, 5, 28, 23, 10, 29), 'salt', 6.55, 75.63, None, 13.3, 132.94, 3.99, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:10:44.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:10:44.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:10:44.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:29, diff=15.092635s, valid=True
2026-05-28T23:10:44.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:10:44.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:10:44.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:12, diff=32.095483s, valid=True
2026-05-28T23:10:44.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:10:44.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:25, diff=19.102121s, valid=True
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:10:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:10:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:12, diff=32.105151s, valid=True
2026-05-28T23:10:44.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:10:44.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:10:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:10:44.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935286.105808s, valid=True
2026-05-28T23:10:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:10:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:10:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:10:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:10:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:10:44.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:10:44.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:10:44.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:10:44.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:10:44.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:10:44.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:10:44.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:10:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:10:44.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:10:44.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:10:45.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:10:45.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:10:45.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:10:45.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-28T23:10:45.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-28T23:10:45.743 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:10:45.743 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:11:15.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:11:15.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:11:15.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:11:16.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:11:16.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:11:16.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:11:16.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-28T23:11:16.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:11:16.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-28T23:11:16.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:11:16.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:11:16.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:11: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-28T23:11:18.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:11:18.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:11:18.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:11:18.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:11:18.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:11:18.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:11:18.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:11:18.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:11:18.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:11:18.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:11:18.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:11:18.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:11:18.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:11:18.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:11:18.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:11:18.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:11:18.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:11:18.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:11:18.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:11:18.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:11:18.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:11:18.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:11:18.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:11:18.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:11:19.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:11:00
2026-05-28T23:11:19.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70257, datetime.datetime(2026, 5, 28, 23, 11), datetime.datetime(2026, 5, 28, 23, 10, 59), 'salt', 6.55, 75.73, None, 13.02, 131.42, 3.97, 832.6, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:11:19.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:11:19.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:11:19.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:59, diff=20.034771s, valid=True
2026-05-28T23:11:19.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:11:19.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:11:19.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:12, diff=7.037607s, valid=True
2026-05-28T23:11:19.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:11:19.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:10:57, diff=22.04428s, valid=True
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:11:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:11:19.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:12, diff=7.047241s, valid=True
2026-05-28T23:11:19.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:11:19.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:11:19.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:11:19.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935321.047887s, valid=True
2026-05-28T23:11:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:11:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:11:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:11:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:11:19.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:11:19.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:11:19.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:11:19.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:11:19.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:11:19.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:11:19.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:11:19.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:11:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:11:19.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:11:19.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:11:19.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:11:20.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:11:20.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:11:20.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-28T23:11:20.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-28T23:11:20.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:11:20.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:11:50.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:11:50.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:11:50.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:11:50.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:11:50.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:11:50.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:11:50.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-28T23:11:50.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:11:50.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-28T23:11:51.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:11:51.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:11:51.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:11:51.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-28T23:11:53.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-28T23:11:53.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:11:53.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:11:53.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:11:53.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:11:53.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:11:53.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:11:53.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:11:53.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:11:53.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:11:53.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:11:53.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:11:53.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:11:53.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:11:53.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:11:53.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:11:53.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:11:53.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:11:53.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:11:53.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:11:53.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:11:53.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:11:53.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:11:53.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:11:54.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:11:30
2026-05-28T23:11:54.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70258, datetime.datetime(2026, 5, 28, 23, 11, 30), datetime.datetime(2026, 5, 28, 23, 11, 30), 'salt', 6.55, 76.03, None, 13.16, 131.39, 3.91, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:11:54.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:11:54.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:11:54.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:30, diff=24.045954s, valid=True
2026-05-28T23:11:54.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:11:54.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:11:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:12, diff=42.048819s, valid=True
2026-05-28T23:11:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:11:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:29, diff=25.055404s, valid=True
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:11:54.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:11:54.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:12, diff=42.058428s, valid=True
2026-05-28T23:11:54.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:11:54.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:11:54.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:11:54.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935356.059093s, valid=True
2026-05-28T23:11:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:11:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:11:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:11:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:11:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:11:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:11:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:11:54.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:11:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:11:54.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:11:54.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:11:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:11:54.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:11:54.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:11:54.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:11:55.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:11:55.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:11:55.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:11:55.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-28T23:11:55.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-28T23:11:55.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:11:55.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:12:25.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:12:25.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:12:25.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:12:25.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:12:25.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:12:25.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:12:25.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:12:25.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:12:25.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-28T23:12:25.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:12:25.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:12:25.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:12:25.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-28T23:12:28.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-28T23:12:28.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:12:28.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:12:28.194 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:12:28.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:12:28.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:12:28.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:12:28.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:12:28.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:12:28.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:12:28.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:12:28.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:12:28.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:12:28.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:12:28.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:12:28.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:12:28.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:12:28.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:12:28.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:12:28.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:12:28.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:12:28.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:12:28.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:12:28.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:12:28.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:12:00
2026-05-28T23:12:28.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70259, datetime.datetime(2026, 5, 28, 23, 12), datetime.datetime(2026, 5, 28, 23, 12), 'salt', 6.52, 76.13, None, 12.6, 131.18, 3.9, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:12:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:12:28.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:12:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:12:00, diff=28.537216s, valid=True
2026-05-28T23:12:28.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:12:28.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:12:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:12:12, diff=16.540314s, valid=True
2026-05-28T23:12:28.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:12:28.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:11:52, diff=36.547436s, valid=True
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:12:28.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:12:28.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:12:12, diff=16.550722s, valid=True
2026-05-28T23:12:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:12:28.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:12:28.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:12:28.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935390.551431s, valid=True
2026-05-28T23:12:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:12:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:12:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:12:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:12:28.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:12:28.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:12:28.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:12:28.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:12:28.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:12:28.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:12:28.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:12:28.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:12:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:12:28.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:12:29.099 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:12:29.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:12:29.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:12:29.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:12: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-28T23:12: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-28T23:12:29.740 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:12:29.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:12:59.740 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:12:59.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:12:59.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:13:00.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:13:00.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:13:00.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:13:00.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-28T23:13:00.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:13:00.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-28T23:13:00.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:13:00.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:13:00.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:13:00.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-28T23:13:02.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-28T23:13:02.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:13:02.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:13:02.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:13:02.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:13:02.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:13:02.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:13:02.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:13:02.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:13:02.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:13:02.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:13:02.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:13:02.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:13:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:13:02.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:13:02.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:13:02.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:13:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:13:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:13:03.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:13:03.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:13:03.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:13:03.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:13:03.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:13:03.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:13:01
2026-05-28T23:13:03.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70261, datetime.datetime(2026, 5, 28, 23, 13, 1), datetime.datetime(2026, 5, 28, 23, 13), 'salt', 6.62, 76.43, None, 12.42, 130.64, 3.84, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:13:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:13:03.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:13:03.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:00, diff=3.102677s, valid=True
2026-05-28T23:13:03.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:13:03.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:13:03.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:12, diff=-8.89441s, valid=True
2026-05-28T23:13:03.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:13:03.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:12:53, diff=10.112365s, valid=True
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:13:03.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:13:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:12, diff=-8.884508s, valid=True
2026-05-28T23:13:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:13:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:13:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:13:03.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935425.116199s, valid=True
2026-05-28T23:13:03.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:13:03.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:13:03.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:13:03.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:13:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:13:03.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:13:03.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:13:03.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:13:03.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:13:03.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:13:03.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:13:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:13:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:13:03.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:13:03.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:13:04.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:13:04.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:13:04.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:13:04.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-28T23:13:04.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-28T23:13:04.386 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:13:04.386 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:13:34.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:13:34.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:13:34.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:13:35.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:13:35.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:13:35.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:13:35.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-28T23:13:35.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:13:35.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-28T23:13:35.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:13:35.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:13:35.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:13:35.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-28T23:13:37.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:13:37.676 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:13:37.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:13:37.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:13:37.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:13:37.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:13:37.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:13:37.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:13:37.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:13:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:13:37.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:13:37.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:13:37.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:13:37.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:13:37.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:13:37.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:13:37.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:13:37.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:13:37.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:13:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:13:37.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:13:37.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:13:37.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:13:37.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:13:38.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:13:31
2026-05-28T23:13:38.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70262, datetime.datetime(2026, 5, 28, 23, 13, 31), datetime.datetime(2026, 5, 28, 23, 13, 30), 'salt', 6.55, 76.66, None, 12.14, 129.66, 3.8, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:13:38.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:13:38.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:13:38.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:30, diff=8.03122s, valid=True
2026-05-28T23:13:38.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:13:38.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:13:38.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:12, diff=26.035271s, valid=True
2026-05-28T23:13:38.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:13:38.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:24, diff=14.042143s, valid=True
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:13:38.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:13:38.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:12, diff=26.045339s, valid=True
2026-05-28T23:13:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:13:38.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:13:38.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:13:38.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935460.046038s, valid=True
2026-05-28T23:13:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:13:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:13:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:13:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:13:38.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:13:38.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:13:38.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:13:38.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:13:38.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:13:38.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:13:38.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:13:38.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:13:38.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:13:38.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:13:38.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:13:38.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:13:39.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:13:39.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:13:39.049 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:13:39.049 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:13:39.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:13:39.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:14:09.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:14:09.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:14:09.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:14:09.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:14:09.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:14:10.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:14:10.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-28T23:14:10.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:14:10.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-28T23:14:10.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:14:10.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:14:10.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:14:10.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-28T23:14:12.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-28T23:14:12.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:14:12.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:14:12.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:14:12.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:14:12.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:14:12.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:14:12.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:14:12.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:14:12.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:14:12.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:14:12.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:14:12.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:14:12.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:14:12.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:14:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:14:12.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:14:12.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:14:12.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:14:12.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:14:12.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:14:12.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:14:12.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:14:12.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:14:12.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:14:01
2026-05-28T23:14:12.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70263, datetime.datetime(2026, 5, 28, 23, 14, 1), datetime.datetime(2026, 5, 28, 23, 14, 1), 'salt', 6.52, 76.73, None, 12.6, 128.74, 3.79, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:14:12.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:14:12.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:14:12.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:01, diff=11.792743s, valid=True
2026-05-28T23:14:12.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:14:12.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:14:12.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:12, diff=0.795591s, valid=True
2026-05-28T23:14:12.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:14:12.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:13:55, diff=17.802215s, valid=True
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:14:12.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:14:12.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:12, diff=0.805238s, valid=True
2026-05-28T23:14:12.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:14:12.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:14:12.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:14:12.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935494.805911s, valid=True
2026-05-28T23:14:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:14:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:14:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:14:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:14:12.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:14:12.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:14:12.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:14:12.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:14:12.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:14:12.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:14:13.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:14:13.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:14:13.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:14:13.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:14:13.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:14:13.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:14:13.880 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:14:13.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:14:13.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-28T23:14:13.880 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:14:14.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:14:14.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:14:44.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:14:44.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:14:44.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:14:44.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:14:44.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:14:44.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:14:44.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-28T23:14:44.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:14:44.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-28T23:14:44.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:14:44.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:14:44.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:14:44.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:14:47.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-28T23:14:47.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:14:47.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:14:47.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:14:47.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:14:47.099 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:14:47.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:14:47.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:14:47.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:14:47.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:14:47.111 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:14:47.111 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:14:47.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:14:47.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:14:47.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:14:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:14:47.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:14:47.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:14:47.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:14:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:14:47.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:14:47.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:14:47.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:14:47.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:14:47.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:14:31
2026-05-28T23:14:47.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70264, datetime.datetime(2026, 5, 28, 23, 14, 31), datetime.datetime(2026, 5, 28, 23, 14, 31), 'salt', 6.52, 76.9, None, 12.25, 129.52, 3.75, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:14:47.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:14:47.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:14:47.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:31, diff=16.43685s, valid=True
2026-05-28T23:14:47.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:14:47.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:14:47.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:12, diff=35.439683s, valid=True
2026-05-28T23:14:47.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:14:47.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:27, diff=20.446307s, valid=True
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:14:47.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:14:47.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:12, diff=35.449355s, valid=True
2026-05-28T23:14:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:14:47.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:14:47.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:14:47.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935529.450015s, valid=True
2026-05-28T23:14:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:14:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:14:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:14:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:14:47.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:14:47.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:14:47.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:14:47.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:14:47.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:14:47.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:14:47.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:14:47.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:14:47.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:14:47.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:14:47.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:14:48.330 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:14:48.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:14:48.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:14:48.430 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:14:48.430 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:14:48.511 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:14:48.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:15:18.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:15:18.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:15:18.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:15:18.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:15:18.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:15:19.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:15:19.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-28T23:15:19.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:15:19.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-28T23:15:19.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:15:19.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:15:19.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:15:19.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-28T23:15:21.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-28T23:15:21.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:15:21.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:15:21.427 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:15:21.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:15:21.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:15:21.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:15:21.449 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:15:21.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:15:21.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:15:21.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:15:21.450 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:15:21.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:15:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:15:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:15:21.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:15:21.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:15:21.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:15:21.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:15:21.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 670 rows from lcogt
2026-05-28T23:15:21.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:15:21.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:15:21.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:15:21.703 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:15:21.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:15:01
2026-05-28T23:15:21.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70265, datetime.datetime(2026, 5, 28, 23, 15, 1), datetime.datetime(2026, 5, 28, 23, 15, 1), 'salt', 6.45, 76.9, None, 12.18, 130.46, 3.75, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:15:21.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:15:21.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:15:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:01, diff=20.768531s, valid=True
2026-05-28T23:15:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:15:21.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:15:21.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=9.771431s, valid=True
2026-05-28T23:15:21.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:15:21.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:14:59, diff=22.778077s, valid=True
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:15:21.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 670 rows. Structure expected: 10 fields
2026-05-28T23:15:21.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=9.781141s, valid=True
2026-05-28T23:15:21.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:15:21.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:15:21.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:15:21.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935563.781817s, valid=True
2026-05-28T23:15:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:15:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:15:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:15:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:15:21.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:15:21.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:15:21.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:15:21.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:15:21.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:15:21.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:15:22.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:15:22.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:15:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:15:22.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:15:22.376 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:15:22.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:15:22.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:15:22.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:15:22.823 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:15:22.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-28T23:15:22.905 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:15:22.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:15:52.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:15:52.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:15:52.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:15:53.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:15:53.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:15:53.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:15:53.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-28T23:15:53.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:15:53.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-28T23:15:53.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:15:53.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:15:53.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:15:53.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-28T23:15: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-28T23:15:55.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:15:55.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:15:55.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:15:55.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:15:55.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:15:55.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:15:55.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:15:55.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:15:55.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:15:55.851 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:15:55.851 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:15:55.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:15:55.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:15:55.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:15:56.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:15:56.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:15:56.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:15:56.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:15:56.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:15:56.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:15:56.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:15:56.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:15:56.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:15:56.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:15:32
2026-05-28T23:15:56.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70266, datetime.datetime(2026, 5, 28, 23, 15, 32), datetime.datetime(2026, 5, 28, 23, 15, 31), 'salt', 6.49, 77.26, None, 12.21, 129.84, 3.69, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:15:56.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:15:56.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:15:56.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:31, diff=25.169131s, valid=True
2026-05-28T23:15:56.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:15:56.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:15:56.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=44.17198s, valid=True
2026-05-28T23:15:56.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:15:56.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:30, diff=26.178546s, valid=True
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:15:56.178 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:15:56.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=44.181588s, valid=True
2026-05-28T23:15:56.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:15:56.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:15:56.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:15:56.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935598.182252s, valid=True
2026-05-28T23:15:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:15:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:15:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:15:56.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:15:56.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:15:56.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:15:56.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:15:56.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:15:56.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:15:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:15:56.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:15:56.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:15:56.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:15:56.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:15:56.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:15:57.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:15:57.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:15:57.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:15:57.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:15:57.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:15:57.350 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:15:57.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:16:27.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:16:27.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:16:27.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:16:27.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:16:27.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:16:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:16:28.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-28T23:16:28.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:16:28.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-28T23:16:28.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:16:28.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:16:28.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:16:28.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-28T23:16:30.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-28T23:16:30.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:16:30.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:16:30.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:16:30.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:16:30.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:16:30.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:16:30.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:16:30.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:16:30.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:16:30.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:16:30.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:16:30.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:16:30.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:16:30.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:16:31.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:16:31.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:16:31.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:16:31.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:16:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-28T23:16:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:16:31.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:16:31.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:16:31.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:16:31.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:16:02
2026-05-28T23:16:31.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70267, datetime.datetime(2026, 5, 28, 23, 16, 2), datetime.datetime(2026, 5, 28, 23, 16, 2), 'salt', 6.62, 77.39, None, 12.07, 130.85, 3.67, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:16:31.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:16:31.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:16:31.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:16:02, diff=29.186283s, valid=True
2026-05-28T23:16:31.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:16:31.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:16:31.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=79.18914s, valid=True
2026-05-28T23:16:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:16:31.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:16:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:16:01, diff=30.195632s, valid=True
2026-05-28T23:16:31.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:16:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:16:31.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:16:31.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:16:31.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:16:31.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-28T23:16:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=79.198642s, valid=True
2026-05-28T23:16:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:16:31.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:16:31.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:16:31.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935633.199275s, valid=True
2026-05-28T23:16:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:16:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:16:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:16:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:16:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:16:31.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:16:31.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:16:31.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:16:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:16:31.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:16:31.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:16:31.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:16:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:16:31.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:16:31.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:16:32.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:16:32.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:16:32.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:16: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-28T23:16: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-28T23:16:32.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:16:32.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:17:02.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:17:02.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:17:02.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:17:02.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:17:02.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:17:02.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:17:02.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:17:02.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:17:02.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-28T23:17:02.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:17:02.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:17:02.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:17:02.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-28T23:17:05.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-28T23:17:05.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:17:05.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:17:05.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:17:05.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:17:05.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:17:05.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:17:05.368 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:17:05.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:17:05.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:17:05.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:17:05.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:17:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:17:05.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:17:05.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:17:05.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:17:05.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:17:05.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:17:05.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:17:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:17:05.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:17:05.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:17:05.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:17:05.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:17:05.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:17:03
2026-05-28T23:17:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70269, datetime.datetime(2026, 5, 28, 23, 17, 3), datetime.datetime(2026, 5, 28, 23, 17, 1), 'salt', 6.58, 77.59, None, 11.58, 127.78, 3.62, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:17:05.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:17:05.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:17:05.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:17:01, diff=4.689107s, valid=True
2026-05-28T23:17:05.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:17:05.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:17:05.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=113.691942s, valid=True
2026-05-28T23:17:05.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:17:05.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:16:54, diff=11.698563s, valid=True
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:17:05.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:17:05.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:17:05.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=113.701645s, valid=True
2026-05-28T23:17:05.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:17:05.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:17:05.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:17:05.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935667.702306s, valid=True
2026-05-28T23:17:05.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:17:05.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:17:05.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:17:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:17:05.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:17:05.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:17:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:17:05.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:17:05.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:17:05.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:17:05.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:17:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:17:05.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:17:06.022 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:17:06.235 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:17:06.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:17:06.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:17:06.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:17:06.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-28T23:17:06.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-28T23:17:06.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:17:06.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:17:36.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:17:36.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:17:36.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:17:37.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:17:37.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:17:37.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:17:37.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-28T23:17:37.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:17:37.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-28T23:17:37.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:17:37.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:17:37.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:17:37.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:17:40.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:17:40.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:17:40.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:17:40.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:17:40.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:17:40.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:17:40.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:17:40.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:17:40.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:17:40.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:17:40.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:17:40.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:17:40.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:17:40.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:17:40.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:17:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:17:40.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:17:40.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:17:40.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:17:40.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:17:40.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:17:40.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:17:40.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:17:40.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:17:40.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:17:33
2026-05-28T23:17:40.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70270, datetime.datetime(2026, 5, 28, 23, 17, 33), datetime.datetime(2026, 5, 28, 23, 17, 32), 'salt', 6.55, 77.79, None, 11.86, 128.13, 3.59, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:17:40.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:17:40.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:17:40.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:17:32, diff=8.415505s, valid=True
2026-05-28T23:17:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:17:40.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:17:40.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=148.41832s, valid=True
2026-05-28T23:17:40.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:17:40.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:17:40.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:17:25, diff=15.424842s, valid=True
2026-05-28T23:17:40.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:17:40.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:17:40.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:17:40.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:17:40.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:17:40.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:17:40.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=148.427762s, valid=True
2026-05-28T23:17:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:17:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:17:40.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:17:40.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935702.428408s, valid=True
2026-05-28T23:17:40.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:17:40.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:17:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:17:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:17:40.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:17:40.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:17:40.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:17:40.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:17:40.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:17:40.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:17:40.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:17:40.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:17:40.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:17:40.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:17:40.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:17:41.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:17:41.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:17:41.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:17:41.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-28T23:17:41.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-28T23:17:41.592 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:17:41.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:18:11.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:18:11.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:18:11.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:18:12.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:18:12.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:18:12.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:18:12.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-28T23:18:12.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:18:12.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-28T23:18:12.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:18:12.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:18:12.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:18:12.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-28T23:18:14.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-28T23:18:14.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:18:14.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:18:14.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:18:14.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:18:14.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:18:14.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:18:14.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:18:14.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:18:14.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:18:14.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:18:14.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:18:14.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:18:14.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:18:14.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:18:14.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:18:14.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:18:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:18:15.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:18:15.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:18:15.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:18:15.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:18:15.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:18:15.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:18:15.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:18:03
2026-05-28T23:18:15.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70271, datetime.datetime(2026, 5, 28, 23, 18, 3), datetime.datetime(2026, 5, 28, 23, 18, 3), 'salt', 6.55, 77.76, None, 11.4, 129.61, 3.6, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:18:15.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:18:15.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:18:15.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:18:03, diff=12.130326s, valid=True
2026-05-28T23:18:15.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:18:15.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:18:15.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=183.133277s, valid=True
2026-05-28T23:18:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:18:15.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:17:57, diff=18.140569s, valid=True
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:18:15.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:18:15.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:18:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=183.143721s, valid=True
2026-05-28T23:18:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:18:15.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:18:15.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:18:15.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935737.14461s, valid=True
2026-05-28T23:18:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:18:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:18:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:18:15.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:18:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:18:15.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:18:15.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:18:15.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:18:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:18:15.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:18:15.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:18:15.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:18:15.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:18:15.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:18:15.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:18:16.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:18:16.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:18:16.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:18:16.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-28T23:18:16.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-28T23:18:16.491 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:18:16.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:18:46.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:18:46.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:18:46.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:18:46.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:18:46.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:18:46.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:18:46.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-28T23:18:46.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:18:46.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-28T23:18:46.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:18:46.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:18:46.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:18:46.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-28T23:18:49.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-28T23:18:49.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:18:49.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:18:49.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:18:49.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:18:49.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:18:49.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:18:49.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:18:49.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:18:49.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:18:49.321 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:18:49.321 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:18:49.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:18:49.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:18:49.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:18:49.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:18:49.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:18:49.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:18:49.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:18:49.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:18:49.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:18:49.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:18:49.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:18:49.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:18:49.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:18:33
2026-05-28T23:18:49.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70272, datetime.datetime(2026, 5, 28, 23, 18, 33), datetime.datetime(2026, 5, 28, 23, 18, 33), 'salt', 6.58, 77.92, None, 11.19, 127.47, 3.56, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:18:49.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:18:49.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:18:49.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:18:33, diff=16.679288s, valid=True
2026-05-28T23:18:49.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:18:49.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:18:49.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=217.682137s, valid=True
2026-05-28T23:18:49.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:18:49.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:18:49.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:18:28, diff=21.688814s, valid=True
2026-05-28T23:18:49.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:18:49.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:18:49.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:18:49.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:18:49.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:18:49.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:18:49.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=217.691818s, valid=True
2026-05-28T23:18:49.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:18:49.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:18:49.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:18:49.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935771.692478s, valid=True
2026-05-28T23:18:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:18:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:18:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:18:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:18:49.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:18:49.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:18:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:18:49.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:18:49.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:18:49.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:18:49.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:18:49.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:18:49.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:18:50.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:18:50.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:18:50.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:18:50.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:18:50.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:18:50.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-28T23:18:50.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-28T23:18:50.907 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:18:50.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:19:20.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:19:20.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:19:20.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:19:21.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:19:21.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:19:21.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:19:21.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-28T23:19:21.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:19:21.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-28T23:19:21.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:19:21.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:19:21.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:19:21.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:19:24.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-28T23:19:24.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:19:24.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:19:24.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:19:24.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:19:24.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:19:24.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:19:24.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:19:24.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:19:24.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:19:24.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:19:24.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:19:24.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:19:24.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:19:24.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:19:24.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:19:24.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:19:24.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:19:24.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:19:24.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:19:24.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:19:24.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:19:24.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:19:24.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:19:24.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:19:03
2026-05-28T23:19:24.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70273, datetime.datetime(2026, 5, 28, 23, 19, 3), datetime.datetime(2026, 5, 28, 23, 19, 3), 'salt', 6.52, 78.12, None, 10.98, 128.48, 3.53, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:19:24.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:19:24.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:19:24.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:19:03, diff=21.631336s, valid=True
2026-05-28T23:19:24.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:19:24.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:19:24.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=252.634308s, valid=True
2026-05-28T23:19:24.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:19:24.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:19:24.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:19:00, diff=24.640953s, valid=True
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:19:24.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:19:24.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=252.643977s, valid=True
2026-05-28T23:19:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:19:24.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:19:24.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:19:24.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935806.644641s, valid=True
2026-05-28T23:19:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:19:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:19:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:19:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:19:24.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:19:24.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:19:24.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:19:24.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:19:24.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:19:24.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:19:24.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:19:24.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:19:25.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:19:25.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:19:25.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:19:25.627 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:19:25.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:19:25.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:19: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-28T23:19: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-28T23:19:25.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:19:25.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:19:55.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:19:55.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:19:55.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:19:56.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:19:56.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:19:56.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:19:56.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-28T23:19:56.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:19:56.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-28T23:19:56.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:19:56.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:19:56.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:19:56.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:19: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-28T23:19:58.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:19:58.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:19:58.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:19:58.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:19:58.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:19:58.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:19:58.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:19:58.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:19:58.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:19:58.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:19:58.927 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:19:58.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:19:59.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:19:59.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:19:59.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:19:59.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:19:59.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:19:59.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:19:59.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:19:59.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:19:59.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:19:59.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:19:59.197 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:19:59.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:19:34
2026-05-28T23:19:59.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70274, datetime.datetime(2026, 5, 28, 23, 19, 34), datetime.datetime(2026, 5, 28, 23, 19, 33), 'salt', 6.65, 77.79, None, 11.5, 130.2, 3.59, 832.35, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:19:59.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:19:59.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:19:59.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:19:33, diff=26.263653s, valid=True
2026-05-28T23:19:59.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:19:59.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:19:59.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=287.266762s, valid=True
2026-05-28T23:19:59.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:19:59.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:19:59.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:19:31, diff=28.273901s, valid=True
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:19:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:19:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=287.277168s, valid=True
2026-05-28T23:19:59.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:19:59.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:19:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:19:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935841.277891s, valid=True
2026-05-28T23:19:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:19:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:19:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:19:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:19:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:19:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:19:59.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:19:59.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:19:59.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:19:59.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:19:59.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:19:59.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:19:59.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:19:59.661 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:19:59.889 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:20:00.259 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:20:00.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:20:00.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:20:00.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:20:00.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:20:00.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:20:00.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:20:30.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:20:30.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:20:30.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:20:30.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:20:30.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:20:30.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:20:30.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-28T23:20:30.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:20:30.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-28T23:20:30.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:20:30.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:20:30.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:20:30.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-28T23:20:33.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-28T23:20:33.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:20:33.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:20:33.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:20:33.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:20:33.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:20:33.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:20:33.348 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:20:33.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:20:33.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:20:33.349 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:20:33.349 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:20:33.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:20:33.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:20:33.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:20:33.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:20:33.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:20:33.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:20:33.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:20:33.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:20:33.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:20:33.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:20:33.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:20:33.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:20:33.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:20:04
2026-05-28T23:20:33.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70275, datetime.datetime(2026, 5, 28, 23, 20, 4), datetime.datetime(2026, 5, 28, 23, 20, 3), 'salt', 6.59, 77.76, None, 11.4, 132.29, 3.6, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:20:33.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:20:33.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:20:33.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:20:03, diff=30.681243s, valid=True
2026-05-28T23:20:33.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:20:33.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:20:33.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=321.6841s, valid=True
2026-05-28T23:20:33.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:20:33.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:20:33.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:20:02, diff=31.690685s, valid=True
2026-05-28T23:20:33.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:20:33.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:20:33.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:20:33.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:20:33.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:20:33.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:20:33.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:15:12, diff=321.693705s, valid=True
2026-05-28T23:20:33.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:20:33.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:20:33.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:20:33.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935875.694352s, valid=True
2026-05-28T23:20:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:20:33.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:20:33.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:20:33.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:20:33.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:20:33.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:20:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:20:33.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:20:33.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:20:33.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:20:33.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:20:33.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:20:34.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:20:34.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:20:34.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:20:34.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:20:34.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:20:34.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:20:34.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-28T23:20:34.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-28T23:20:34.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:20:35.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:21:05.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:21:05.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:21:05.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:21:05.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:21:05.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:21:05.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:21:05.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:21:05.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:21:05.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-28T23:21:05.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:21:05.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:21:05.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:21:05.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-28T23:21:07.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:21:07.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:21:07.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:21:07.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:21:07.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:21:07.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:21:07.969 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:21:07.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:21:07.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:21:07.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:21:07.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:21:07.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:21:07.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:21:08.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:21:08.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:21:08.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:21:08.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:21:08.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:21:08.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:21:08.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:21:08.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:21:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:21:08.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:21:08.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:21:08.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:21:04
2026-05-28T23:21:08.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70277, datetime.datetime(2026, 5, 28, 23, 21, 4), datetime.datetime(2026, 5, 28, 23, 21, 4), 'salt', 6.45, 77.76, None, 11.05, 131.68, 3.59, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:21:08.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:21:08.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:21:08.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:04, diff=4.334875s, valid=True
2026-05-28T23:21:08.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:21:08.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:21:08.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:12, diff=-3.662209s, valid=True
2026-05-28T23:21:08.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:21:08.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:20:56, diff=12.345988s, valid=True
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:21:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:21:08.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:12, diff=-3.650924s, valid=True
2026-05-28T23:21:08.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:21:08.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:21:08.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:21:08.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935910.349753s, valid=True
2026-05-28T23:21:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:21:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:21:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:21:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:21:08.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:21:08.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:21:08.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:21:08.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:21:08.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:21:08.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:21:08.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:21:08.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:21:08.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:21:08.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:21:08.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:21:09.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:21:09.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:21:09.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:21:09.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-28T23:21:09.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-28T23:21:09.655 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:21:09.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:21:39.659 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:21:39.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:21:39.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:21:40.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:21:40.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:21:40.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:21:40.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-28T23:21:40.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:21:40.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-28T23:21:40.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:21:40.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:21:40.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:21:40.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-28T23:21:42.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-28T23:21:42.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:21:42.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:21:42.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:21:42.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:21:42.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:21:42.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:21:42.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:21:42.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:21:42.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:21:42.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:21:42.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:21:42.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:21:42.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:21:42.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:21:42.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:21:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:21:42.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:21:42.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:21:43.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:21:43.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:21:43.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:21:43.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:21:43.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:21:43.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:21:35
2026-05-28T23:21:43.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70278, datetime.datetime(2026, 5, 28, 23, 21, 35), datetime.datetime(2026, 5, 28, 23, 21, 34), 'salt', 6.42, 77.99, None, 11.29, 126.11, 3.55, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:21:43.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:21:43.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:21:43.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:34, diff=9.080223s, valid=True
2026-05-28T23:21:43.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:21:43.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:21:43.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:12, diff=-28.916957s, valid=True
2026-05-28T23:21:43.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:21:43.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:21:43.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:26, diff=17.089659s, valid=True
2026-05-28T23:21:43.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:21:43.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:21:43.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:21:43.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:21:43.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:21:43.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:21:43.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:12, diff=-28.907309s, valid=True
2026-05-28T23:21:43.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:21:43.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:21:43.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:21:43.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935945.09334s, valid=True
2026-05-28T23:21:43.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:21:43.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:21:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:21:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:21:43.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:21:43.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:21:43.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:21:43.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:21:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:21:43.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:21:43.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:21:43.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:21:43.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:21:43.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:21:43.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:21:44.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:21:44.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:21:44.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:21:44.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-28T23:21:44.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-28T23:21:44.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:21:44.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:22:14.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:22:14.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:22:14.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:22:14.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:22:14.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:22:15.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:22:15.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-28T23:22:15.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:22:15.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-28T23:22:15.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:22:15.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:22:15.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:22:15.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-28T23:22:17.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-28T23:22:17.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:22:17.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:22:17.424 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:22:17.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:22:17.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:22:17.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:22:17.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:22:17.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:22:17.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:22:17.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:22:17.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:22:17.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:22:17.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:22:17.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:22:17.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:22:17.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:22:17.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:22:17.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:22:17.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:22:17.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:22:17.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:22:17.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:22:17.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:22:17.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:22:05
2026-05-28T23:22:17.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70279, datetime.datetime(2026, 5, 28, 23, 22, 5), datetime.datetime(2026, 5, 28, 23, 22, 4), 'salt', 6.42, 78.06, None, 10.73, 125.95, 3.54, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:22:17.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:22:17.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:22:17.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:04, diff=13.918042s, valid=True
2026-05-28T23:22:17.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:22:17.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:22:17.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:12, diff=5.920907s, valid=True
2026-05-28T23:22:17.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:22:17.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:21:58, diff=19.92755s, valid=True
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:22:17.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:22:17.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:12, diff=5.930564s, valid=True
2026-05-28T23:22:17.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:22:17.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:22:17.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:22:17.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=935979.931216s, valid=True
2026-05-28T23:22:17.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:22:17.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:22:17.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:22:17.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:22:17.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:22:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:22:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:22:18.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:22:18.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:22:18.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:22:18.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:22:18.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:22:18.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:22:18.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:22:18.489 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:22:18.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:22:18.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:22:18.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:22:18.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-28T23:22:18.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-28T23:22:19.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:22:19.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:22:49.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:22:49.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:22:49.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:22:49.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:22:49.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:22:49.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:22:49.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-28T23:22:49.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:22:49.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-28T23:22:49.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:22:49.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:22:49.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:22:49.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:22: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-28T23:22:52.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:22:52.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:22:52.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:22:52.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:22:52.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:22:52.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:22:52.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:22:52.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:22:52.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:22:52.200 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:22:52.200 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:22:52.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:22:52.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:22:52.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:22:52.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:22:52.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:22:52.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:22:52.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:22:52.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:22:52.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:22:52.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:22:52.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:22:52.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:22:52.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:22:35
2026-05-28T23:22:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70280, datetime.datetime(2026, 5, 28, 23, 22, 35), datetime.datetime(2026, 5, 28, 23, 22, 35), 'salt', 6.45, 78.22, None, 10.69, 127.9, 3.51, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:22:52.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:22:52.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:22:52.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:35, diff=17.529356s, valid=True
2026-05-28T23:22:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:22:52.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:22:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:12, diff=-19.467819s, valid=True
2026-05-28T23:22:52.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:22:52.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:22:52.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:22:29, diff=23.538672s, valid=True
2026-05-28T23:22:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:22:52.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:22:52.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:22:52.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:22:52.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:22:52.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:22:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:12, diff=-19.458389s, valid=True
2026-05-28T23:22:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:22:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:22:52.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:22:52.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936014.54226s, valid=True
2026-05-28T23:22:52.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:22:52.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:22:52.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:22:52.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:22:52.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:22:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:22:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:22:52.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:22:52.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:22:52.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:22:52.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:22:52.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:22:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:22:52.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:22:53.076 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:22:53.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:22:53.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:22:53.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:22:53.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:22:53.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-28T23:22:53.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:22:53.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:23:23.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:23:23.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:23:23.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:23:23.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:23:23.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:23:24.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:23:24.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-28T23:23:24.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:23:24.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-28T23:23:24.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:23:24.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:23:24.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:23:24.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-28T23:23:26.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-28T23:23:26.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:23:26.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:23:26.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:23:26.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:23:26.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:23:26.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:23:26.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:23:26.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:23:26.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:23:26.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:23:26.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:23:26.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:23:26.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:23:26.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:23:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:23:26.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:23:26.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:23:26.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:23:26.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:23:26.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:23:26.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:23:26.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:23:26.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:23:26.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:23:05
2026-05-28T23:23:26.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70281, datetime.datetime(2026, 5, 28, 23, 23, 5), datetime.datetime(2026, 5, 28, 23, 23, 5), 'salt', 6.52, 78.19, None, 10.76, 128.39, 3.52, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:23:26.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:23:26.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:23:26.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:05, diff=21.975007s, valid=True
2026-05-28T23:23:26.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:23:26.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:23:26.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:12, diff=14.978403s, valid=True
2026-05-28T23:23:26.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:23:26.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:01, diff=25.986041s, valid=True
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:23:26.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:23:26.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:12, diff=14.989263s, valid=True
2026-05-28T23:23:26.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:23:26.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:23:26.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:23:26.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936048.990077s, valid=True
2026-05-28T23:23:26.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:23:26.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:23:26.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:23:26.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:23:26.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:23:27.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:23:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:23:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:23:27.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:23:27.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:23:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:23:27.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:23:27.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:23:27.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:23:27.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:23:27.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:23:28.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:23:28.071 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:23:28.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-28T23:23:28.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-28T23:23:28.247 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:23:28.247 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:23:58.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:23:58.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:23:58.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:23:58.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:23:58.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:23:58.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:23:58.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-28T23:23:58.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:23:58.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-28T23:23:58.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:23:58.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:23:58.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:23:58.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-28T23:24:01.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-28T23:24:01.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:24:01.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:24:01.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:24:01.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:24:01.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:24:01.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:24:01.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:24:01.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:24:01.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:24:01.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:24:01.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:24:01.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:24:01.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:24:01.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:24:01.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:24:01.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:24:01.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:24:01.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:24:01.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:24:01.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:24:01.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:24:01.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:24:01.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:24:01.596 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:23:35
2026-05-28T23:24:01.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70282, datetime.datetime(2026, 5, 28, 23, 23, 35), datetime.datetime(2026, 5, 28, 23, 23, 35), 'salt', 6.65, 78.09, None, 11.5, 125.13, 3.54, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:24:01.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:24:01.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:24:01.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:35, diff=26.602692s, valid=True
2026-05-28T23:24:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:24:01.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:24:01.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:24:12, diff=-10.394503s, valid=True
2026-05-28T23:24:01.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:24:01.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:23:33, diff=28.61207s, valid=True
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:24:01.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:24:01.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:24:12, diff=-10.384936s, valid=True
2026-05-28T23:24:01.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:24:01.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:24:01.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:24:01.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936083.615738s, valid=True
2026-05-28T23:24:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:24:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:24:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:24:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:24:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:24:01.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:24:01.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:24:01.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:24:01.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:24:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:24:01.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:24:01.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:24:01.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:24:01.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:24:02.162 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:24:02.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:24:02.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:24:02.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:24:02.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-28T23:24:02.609 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:24:02.818 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:24:02.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:24:32.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:24:32.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:24:32.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:24:33.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:24:33.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:24:33.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:24:33.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-28T23:24:33.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:24:33.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-28T23:24:33.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:24:33.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:24:33.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:24:33.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-28T23:24:36.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-28T23:24:36.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:24:36.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:24:36.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:24:36.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:24:36.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:24:36.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:24:36.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:24:36.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:24:36.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:24:36.180 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:24:36.180 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:24:36.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:24:36.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:24:36.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:24:36.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:24:36.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:24:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:24:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:24:36.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:24:36.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:24:36.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:24:36.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:24:36.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:24:36.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:24:36
2026-05-28T23:24:36.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70284, datetime.datetime(2026, 5, 28, 23, 24, 36), datetime.datetime(2026, 5, 28, 23, 24, 35), 'salt', 6.65, 77.76, None, 11.26, 125.38, 3.6, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:24:36.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:24:36.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:24:36.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:24:35, diff=1.503998s, valid=True
2026-05-28T23:24:36.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:24:36.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:24:36.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:12, diff=-35.49318s, valid=True
2026-05-28T23:24:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:24:36.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:24:35, diff=1.513362s, valid=True
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:24:36.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:24:36.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:12, diff=-35.483642s, valid=True
2026-05-28T23:24:36.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:24:36.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:24:36.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:24:36.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936118.517026s, valid=True
2026-05-28T23:24:36.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:24:36.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:24:36.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:24:36.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:24:36.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:24:36.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:24:36.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:24:36.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:24:36.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:24:36.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:24:36.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:24:36.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:24:36.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:24:36.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:24:37.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:24:37.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:24:37.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:24:37.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:24:37.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-28T23:24:37.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-28T23:24:37.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:24:37.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:25:07.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:25:07.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:25:07.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:25:08.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:25:08.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:25:08.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:25:08.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-28T23:25:08.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:25:08.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-28T23:25:08.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:25:08.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:25:08.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:25:08.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-28T23:25:11.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-28T23:25:11.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:25:11.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:25:11.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:25:11.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:25:11.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:25:11.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:25:11.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:25:11.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:25:11.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:25:11.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:25:11.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:25:11.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:25:11.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:25:11.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:25:11.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:25:11.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:25:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:25:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:25:12.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:25:12.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:25:12.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:25:12.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:25:12.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:25:12.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:25:06
2026-05-28T23:25:12.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70285, datetime.datetime(2026, 5, 28, 23, 25, 6), datetime.datetime(2026, 5, 28, 23, 25, 6), 'salt', 6.58, 77.63, None, 10.87, 123.76, 3.62, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:25:12.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:25:12.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:25:12.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:06, diff=6.128512s, valid=True
2026-05-28T23:25:12.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:25:12.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:25:12.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:12, diff=0.131342s, valid=True
2026-05-28T23:25:12.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:25:12.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:25:12.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:24:59, diff=13.137812s, valid=True
2026-05-28T23:25:12.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:25:12.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:25:12.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:25:12.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:25:12.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:25:12.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:25:12.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:12, diff=0.140795s, valid=True
2026-05-28T23:25:12.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:25:12.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:25:12.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:25:12.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936154.14144s, valid=True
2026-05-28T23:25:12.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:25:12.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:25:12.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:25:12.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:25:12.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:25:12.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:25:12.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:25:12.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:25:12.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:25:12.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:25:12.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:25:12.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:25:12.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:25:12.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:25:12.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:25:13.053 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:25:13.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:25:13.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:25:13.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-28T23:25:13.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-28T23:25:13.331 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:25:13.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:25:43.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:25:43.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:25:43.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:25:43.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:25:43.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:25:43.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:25:43.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-28T23:25:43.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:25:43.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-28T23:25:43.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:25:43.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:25:43.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:25:43.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-28T23:25:47.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-28T23:25:47.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:25:47.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:25:47.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:25:47.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:25:47.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:25:47.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:25:47.085 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:25:47.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:25:47.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:25:47.085 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:25:47.085 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:25:47.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:25:47.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:25:47.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:25:47.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:25:47.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:25:47.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:25:47.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:25:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:25:47.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:25:47.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:25:47.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:25:47.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:25:47.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:25:36
2026-05-28T23:25:47.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70286, datetime.datetime(2026, 5, 28, 23, 25, 36), datetime.datetime(2026, 5, 28, 23, 25, 36), 'salt', 6.52, 77.46, None, 11.65, 123.98, 3.65, 832.41, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:25:47.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:25:47.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:25:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:36, diff=11.401989s, valid=True
2026-05-28T23:25:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:25:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:25:47.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:12, diff=-24.595132s, valid=True
2026-05-28T23:25:47.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:25:47.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:29, diff=18.411427s, valid=True
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:25:47.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:25:47.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:12, diff=-24.585587s, valid=True
2026-05-28T23:25:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:25:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:25:47.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:25:47.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936189.41507s, valid=True
2026-05-28T23:25:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:25:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:25:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:25:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:25:47.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:25:47.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:25:47.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:25:47.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:25:47.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:25:47.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:25:47.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:25:47.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:25:47.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:25:47.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:25:48.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:25:48.366 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:25:48.465 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:25:48.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:25:48.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-28T23:25:48.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-28T23:25:48.648 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:25:48.648 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:26:18.678 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:26:18.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:26:18.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:26:18.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:26:18.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:26:19.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:26:19.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-28T23:26:19.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:26:19.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-28T23:26:19.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:26:19.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:26:19.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:26:19.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-28T23:26:21.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-28T23:26:21.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:26:21.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:26:21.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:26:21.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:26:21.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:26:21.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:26:21.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:26:21.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:26:21.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:26:21.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:26:21.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:26:21.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:26:21.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:26:21.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:26:22.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:26:22.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:26:22.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:26:22.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:26:22.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:26:22.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:26:22.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:26:22.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:26:22.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:26:22.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:26:07
2026-05-28T23:26:22.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70287, datetime.datetime(2026, 5, 28, 23, 26, 7), datetime.datetime(2026, 5, 28, 23, 26, 6), 'salt', 6.59, 77.66, None, 10.73, 119.96, 3.62, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:26:22.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:26:22.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:26:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:06, diff=16.18807s, valid=True
2026-05-28T23:26:22.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:26:22.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:26:22.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:12, diff=10.191141s, valid=True
2026-05-28T23:26:22.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:26:22.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:26:22.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:25:59, diff=23.197838s, valid=True
2026-05-28T23:26:22.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:26:22.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:26:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:26:22.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:26:22.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:26:22.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:26:22.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:12, diff=10.200899s, valid=True
2026-05-28T23:26:22.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:26:22.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:26:22.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:26:22.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936224.201547s, valid=True
2026-05-28T23:26:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:26:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:26:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:26:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:26:22.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:26:22.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:26:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:26:22.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:26:22.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:26:22.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:26:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:26:22.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:26:22.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:26:22.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:26:22.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:26:23.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:26:23.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:26:23.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:26:23.174 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:26:23.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-28T23:26:23.255 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:26:23.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:26:53.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:26:53.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:26:53.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:26:53.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:26:53.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:26:53.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:26:53.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-28T23:26:53.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:26:53.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-28T23:26:53.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:26:53.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:26:53.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:26:53.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-28T23:26:56.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-28T23:26:56.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:26:56.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:26:56.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:26:56.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:26:56.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:26:56.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:26:56.833 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:26:56.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:26:56.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:26:56.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:26:56.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:26:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:26:56.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:26:56.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:26:57.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:26:57.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:26:57.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:26:57.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:26:57.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:26:57.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:26:57.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:26:57.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:26:57.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:26:57.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:26:37
2026-05-28T23:26:57.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70288, datetime.datetime(2026, 5, 28, 23, 26, 37), datetime.datetime(2026, 5, 28, 23, 26, 36), 'salt', 6.59, 77.39, None, 11.4, 125.93, 3.67, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:26:57.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:26:57.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:26:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:36, diff=21.163224s, valid=True
2026-05-28T23:26:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:26:57.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:26:57.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:12, diff=-14.833898s, valid=True
2026-05-28T23:26:57.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:26:57.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:26:57.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:26:31, diff=26.172766s, valid=True
2026-05-28T23:26:57.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:26:57.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:26:57.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:26:57.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:26:57.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:26:57.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:26:57.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:12, diff=-14.824186s, valid=True
2026-05-28T23:26:57.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:26:57.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:26:57.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:26:57.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936259.17647s, valid=True
2026-05-28T23:26:57.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:26:57.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:26:57.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:26:57.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:26:57.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:26:57.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:26:57.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:26:57.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:26:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:26:57.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:26:57.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:26:57.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:26:57.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:26:57.563 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:26:57.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:26:58.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:26:58.220 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:26:58.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:26:58.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-28T23:26:58.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-28T23:26:58.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:26:58.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:27:28.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:27:28.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:27:28.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:27:28.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:27:28.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:27:28.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:27: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-28T23:27:28.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:27:28.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-28T23:27:28.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:27:28.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:27:28.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:27:28.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-28T23:27:31.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-28T23:27:31.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:27:31.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:27:31.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:27:31.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:27:31.031 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:27:31.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:27:31.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:27:31.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:27:31.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:27:31.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:27:31.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:27:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:27:31.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:27:31.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:27:31.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:27:31.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:27:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:27:31.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:27:31.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:27:31.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:27:31.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:27:31.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:27:31.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:27:31.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:27:07
2026-05-28T23:27:31.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70289, datetime.datetime(2026, 5, 28, 23, 27, 7), datetime.datetime(2026, 5, 28, 23, 27, 7), 'salt', 6.68, 77.1, None, 10.34, 118.2, 3.72, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:27:31.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:27:31.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:27:31.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:07, diff=24.361516s, valid=True
2026-05-28T23:27:31.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:27:31.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:27:31.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:12, diff=19.364678s, valid=True
2026-05-28T23:27:31.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:27:31.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:03, diff=28.37247s, valid=True
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:27:31.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:27:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:12, diff=19.375745s, valid=True
2026-05-28T23:27:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:27:31.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:27:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:27:31.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936293.37642s, valid=True
2026-05-28T23:27:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:27:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:27:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:27:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:27:31.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:27:31.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:27:31.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:27:31.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:27:31.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:27:31.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:27:31.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:27:31.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:27:31.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:27:31.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:27:31.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:27:32.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:27:32.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:27:32.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:27:32.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-28T23:27:32.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-28T23:27:32.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:27:32.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:28:02.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:28:02.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:28:02.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:28:02.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:28:02.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:28:02.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:28:02.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:28:02.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:28:02.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-28T23:28:02.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:28:02.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:28:02.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:28:02.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:28:05.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:28:05.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:28:05.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:28:05.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:28:05.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:28:05.589 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:28:05.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:28:05.600 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:28:05.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:28:05.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:28:05.601 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:28:05.601 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:28:05.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:28:05.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:28:05.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:28:05.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:28:05.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:28:05.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:28:05.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:28:05.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:28:05.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:28:05.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:28:05.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:28:05.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:28:05.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:27:37
2026-05-28T23:28:05.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70290, datetime.datetime(2026, 5, 28, 23, 27, 37), datetime.datetime(2026, 5, 28, 23, 27, 37), 'salt', 6.59, 76.76, None, 10.38, 117.12, 3.78, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:28:05.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:28:05.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:28:05.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:37, diff=28.915943s, valid=True
2026-05-28T23:28:05.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:28:05.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:28:05.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:28:12, diff=-6.081285s, valid=True
2026-05-28T23:28:05.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:28:05.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:27:34, diff=31.925188s, valid=True
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:28:05.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:28:05.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:28:12, diff=-6.07179s, valid=True
2026-05-28T23:28:05.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:28:05.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:28:05.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:28:05.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936327.928871s, valid=True
2026-05-28T23:28:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:28:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:28:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:28:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:28:05.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:28:05.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:28:05.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:28:05.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:28:06.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:28:06.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:28:06.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:28:06.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:28:06.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:28:06.314 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:28:06.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:28:06.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:28:06.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:28:06.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:28:06.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-28T23:28:06.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-28T23:28:07.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:28:07.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:28:37.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:28:37.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:28:37.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:28:37.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:28:37.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:28:37.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:28:37.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-28T23:28:37.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:28:37.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:28:37.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:28:37.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:28:37.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:28:37.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-28T23:28:40.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-28T23:28:40.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:28:40.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:28:40.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:28:40.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:28:40.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:28:40.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:28:40.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:28:40.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:28:40.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:28:40.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:28:40.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:28:40.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:28:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:28:40.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:28:40.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:28:40.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:28:40.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:28:40.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:28:40.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:28:40.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:28:40.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:28:40.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:28:40.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:28:40.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:28:38
2026-05-28T23:28:40.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70292, datetime.datetime(2026, 5, 28, 23, 28, 38), datetime.datetime(2026, 5, 28, 23, 28, 37), 'salt', 6.72, 76.6, None, 12.14, 123.86, 3.82, 832.29, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:28:40.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:28:40.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:28:40.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:28:37, diff=3.613664s, valid=True
2026-05-28T23:28:40.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:28:40.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:28:40.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:12, diff=-31.38305s, valid=True
2026-05-28T23:28:40.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:28:40.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:28:40.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:28:37, diff=3.626671s, valid=True
2026-05-28T23:28:40.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:28:40.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:28:40.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:28:40.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:28:40.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:28:40.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:28:40.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:12, diff=-31.368944s, valid=True
2026-05-28T23:28:40.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:28:40.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:28:40.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:28:40.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936362.631776s, valid=True
2026-05-28T23:28:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:28:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:28:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:28:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:28:40.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:28:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:28:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:28:40.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:28:40.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:28:40.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:28:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:28:40.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:28:40.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:28:40.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:28:41.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:28:41.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:28:41.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:28:41.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:28: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-28T23:28: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-28T23:28:41.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:28:41.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:29:11.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:29:11.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:29:11.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:29:12.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:29:12.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:29:12.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:29:12.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-28T23:29:12.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:29:12.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-28T23:29:12.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:29:12.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:29:12.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:29:12.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-28T23:29:15.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-28T23:29:15.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:29:15.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:29:15.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:29:15.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:29:15.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:29:15.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:29:15.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:29:15.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:29:15.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:29:15.755 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:29:15.755 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:29:15.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:29:15.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:29:15.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:29:15.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:29:15.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:29:15.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:29:15.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:29:16.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:29:16.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:29:16.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:29:16.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:29:16.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:29:16.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:29:08
2026-05-28T23:29:16.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70293, datetime.datetime(2026, 5, 28, 23, 29, 8), datetime.datetime(2026, 5, 28, 23, 29, 7), 'salt', 6.72, 76.5, None, 11.43, 122.87, 3.83, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:29:16.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:29:16.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:29:16.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:07, diff=9.081441s, valid=True
2026-05-28T23:29:16.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:29:16.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:29:16.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:12, diff=4.084302s, valid=True
2026-05-28T23:29:16.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:29:16.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:29:16.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:00, diff=16.090924s, valid=True
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:29:16.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:29:16.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:12, diff=4.093923s, valid=True
2026-05-28T23:29:16.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:29:16.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:29:16.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:29:16.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936398.094574s, valid=True
2026-05-28T23:29:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:29:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:29:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:29:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:29:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:29:16.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:29:16.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:29:16.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:29:16.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:29:16.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:29:16.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:29:16.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:29:16.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:29:16.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:29:16.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:29:16.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:29:17.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:29:17.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:29:17.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-28T23:29:17.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-28T23:29:17.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:29:17.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:29:47.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:29:47.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:29: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-28T23:29:47.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:29:47.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:29:47.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:29:47.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-28T23:29:47.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:29:47.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-28T23:29:47.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:29:47.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:29:47.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:29:47.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-28T23:29:50.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:29:50.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:29:50.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:29:50.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:29:50.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:29:50.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:29:50.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:29:50.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:29:50.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:29:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:29:50.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:29:50.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:29:50.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:29:50.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:29:50.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:29:50.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:29:50.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:29:50.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:29:50.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:29:50.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:29:50.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:29:50.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:29:50.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:29:50.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:29:50.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:29:38
2026-05-28T23:29:50.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70294, datetime.datetime(2026, 5, 28, 23, 29, 38), datetime.datetime(2026, 5, 28, 23, 29, 38), 'salt', 6.65, 76.33, None, 11.65, 128.25, 3.86, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:29:50.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:29:50.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:29:50.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:38, diff=12.681278s, valid=True
2026-05-28T23:29:50.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:29:50.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:29:50.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:12, diff=-21.315907s, valid=True
2026-05-28T23:29:50.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:29:50.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:29:50.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:29:29, diff=21.690714s, valid=True
2026-05-28T23:29:50.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:29:50.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:29:50.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:29:50.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:29:50.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:29:50.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:29:50.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:12, diff=-21.3063s, valid=True
2026-05-28T23:29:50.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:29:50.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:29:50.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:29:50.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936432.694353s, valid=True
2026-05-28T23:29:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:29:50.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:29:50.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:29:50.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:29:50.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:29:50.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:29:50.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:29:50.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:29:50.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:29:50.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:29:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:29:50.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:29:50.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:29:51.010 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:29:51.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:29:51.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:29:51.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:29:51.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:29:51.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-28T23:29:51.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-28T23:29:51.937 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:29:51.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:30:21.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:30:21.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:30:21.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:30:22.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:30:22.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:30:22.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:30:22.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-28T23:30:22.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:30:22.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:30:22.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:30:22.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:30:22.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:30:22.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-28T23:30: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-28T23:30:24.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:30:24.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:30:24.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:30:24.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:30:24.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:30:24.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:30:24.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:30:24.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:30:24.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:30:24.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:30:24.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:30:24.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:30:24.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:30:24.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:30:24.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:30:24.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:30:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:30:25.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:30:25.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:30:25.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:30:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:30:25.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:30:25.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:30:25.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:30:08
2026-05-28T23:30:25.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70295, datetime.datetime(2026, 5, 28, 23, 30, 8), datetime.datetime(2026, 5, 28, 23, 30, 8), 'salt', 6.59, 76.3, None, 12.6, 129.71, 3.87, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:30:25.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:30:25.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:30:25.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:08, diff=17.113292s, valid=True
2026-05-28T23:30:25.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:30:25.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:30:25.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:12, diff=13.116043s, valid=True
2026-05-28T23:30:25.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:30:25.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:01, diff=24.122546s, valid=True
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:30:25.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:30:25.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:30:25.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:12, diff=13.125486s, valid=True
2026-05-28T23:30:25.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:30:25.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:30:25.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:30:25.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936467.126153s, valid=True
2026-05-28T23:30:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:30:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:30:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:30:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:30:25.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:30:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:30:25.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:30:25.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:30:25.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:30:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:30:25.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:30:25.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:30:25.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:30:25.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:30:25.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:30:26.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:30:26.151 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:30:26.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:30:26.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-28T23:30:26.152 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:30:26.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:30:26.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:30:56.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:30:56.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:30:56.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:30:57.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:30:57.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:30:57.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:30:57.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-28T23:30:57.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:30:57.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-28T23:30:57.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:30:57.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:30:57.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:30:57.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-28T23:30:59.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-28T23:30:59.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:30:59.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:30:59.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:30:59.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:30:59.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:30:59.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:30:59.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:30:59.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:30:59.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:30:59.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:30:59.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:30:59.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:30:59.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:30:59.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:30:59.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:30:59.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:31:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:31:00.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:31:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:31:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:31:00.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:31:00.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:31:00.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:31:00.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:30:39
2026-05-28T23:31:00.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70296, datetime.datetime(2026, 5, 28, 23, 30, 39), datetime.datetime(2026, 5, 28, 23, 30, 38), 'salt', 6.62, 76.33, None, 11.08, 130.69, 3.86, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:31:00.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:31:00.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:31:00.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:38, diff=22.129485s, valid=True
2026-05-28T23:31:00.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:31:00.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:31:00.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:12, diff=-11.867208s, valid=True
2026-05-28T23:31:00.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:31:00.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:30:33, diff=27.139554s, valid=True
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:31:00.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:31:00.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:31:00.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:12, diff=-11.857295s, valid=True
2026-05-28T23:31:00.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:31:00.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:31:00.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:31:00.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936502.143372s, valid=True
2026-05-28T23:31:00.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:31:00.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:31:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:31:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:31:00.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:31:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:31:00.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:31:00.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:31:00.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:31:00.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:31:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:31:00.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:31:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:31:00.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:31:00.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:31:01.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:31:01.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:31:01.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:31:01.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-28T23:31:01.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-28T23:31:01.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:31:01.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:31:31.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:31:31.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:31:31.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:31:31.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:31:31.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:31:31.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:31:31.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-28T23:31:31.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:31:31.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-28T23:31:31.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:31:31.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:31:31.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:31:31.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-28T23:31:34.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-28T23:31:34.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:31:34.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:31:34.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:31:34.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:31:34.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:31:34.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:31:34.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:31:34.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:31:34.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:31:34.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:31:34.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:31:34.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:31:34.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:31:34.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:31:34.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:31:34.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:31:34.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:31:34.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:31:34.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:31:34.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:31:34.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:31:34.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:31:34.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:31:34.613 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:31:09
2026-05-28T23:31:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70297, datetime.datetime(2026, 5, 28, 23, 31, 9), datetime.datetime(2026, 5, 28, 23, 31, 8), 'salt', 6.69, 76.43, None, 9.95, 126.16, 3.85, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:31:34.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:31:34.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:31:34.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:08, diff=26.619421s, valid=True
2026-05-28T23:31:34.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:31:34.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:31:34.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:12, diff=22.622216s, valid=True
2026-05-28T23:31:34.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:31:34.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:31:34.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:04, diff=30.628681s, valid=True
2026-05-28T23:31:34.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:31:34.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:31:34.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:31:34.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:31:34.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:31:34.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:31:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:12, diff=22.631681s, valid=True
2026-05-28T23:31:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:31:34.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:31:34.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:31:34.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936536.632334s, valid=True
2026-05-28T23:31:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:31:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:31:34.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:31:34.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:31:34.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:31:34.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:31:34.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:31:34.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:31:34.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:31:34.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:31:34.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:31:34.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:31:34.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:31:34.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:31:35.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:31:35.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:31:35.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:31:35.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:31:35.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-28T23:31:35.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-28T23:31:35.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:31:35.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:32:05.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:32:05.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:32:05.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:32:05.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:32:05.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:32:06.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:32:06.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-28T23:32:06.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:32:06.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-28T23:32:06.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:32:06.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:32:06.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:32:06.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-28T23:32:08.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-28T23:32:08.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:32:08.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:32:08.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:32:08.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:32:08.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:32:08.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:32:08.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:32:08.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:32:08.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:32:08.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:32:08.577 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:32:08.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:32:08.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:32:08.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:32:08.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:32:08.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:32:08.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:32:08.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:32:08.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:32:08.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:32:08.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:32:08.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:32:08.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:32:08.894 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:31:39
2026-05-28T23:32:08.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70298, datetime.datetime(2026, 5, 28, 23, 31, 39), datetime.datetime(2026, 5, 28, 23, 31, 39), 'salt', 6.65, 76.4, None, 9.49, 124.35, 3.85, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:32:08.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:32:08.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:32:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:39, diff=29.900483s, valid=True
2026-05-28T23:32:08.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:32:08.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:32:08.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:32:12, diff=-3.0967s, valid=True
2026-05-28T23:32:08.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:32:08.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:32:08.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:31:36, diff=32.90991s, valid=True
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:32:08.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:32:08.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:32:12, diff=-3.087043s, valid=True
2026-05-28T23:32:08.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:32:08.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:32:08.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:32:08.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936570.913607s, valid=True
2026-05-28T23:32:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:32:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:32:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:32:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:32:08.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:32:08.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:32:08.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:32:08.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:32:08.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:32:09.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:32:09.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:32:09.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:32:09.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:32:09.309 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:32:09.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:32:09.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:32:09.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:32:09.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:32:09.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-28T23:32:09.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-28T23:32:10.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:32:10.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:32:40.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:32:40.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:32:40.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:32:40.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:32:40.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:32:40.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:32:40.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:32:40.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:32:40.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:32:40.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:32:40.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:32:40.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:32:40.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:32:43.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-28T23:32:43.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:32:43.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:32:43.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:32:43.370 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:32:43.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:32:43.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:32:43.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:32:43.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:32:43.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:32:43.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:32:43.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:32:43.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:32:43.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:32:43.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:32:43.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:32:43.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:32:43.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:32:43.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:32:43.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:32:43.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:32:43.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:32:43.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:32:43.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:32:43.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:32:39
2026-05-28T23:32:43.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70300, datetime.datetime(2026, 5, 28, 23, 32, 39), datetime.datetime(2026, 5, 28, 23, 32, 39), 'salt', 6.82, 76.37, None, 11.22, 122.17, 3.86, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:32:43.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:32:43.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:32:43.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:32:39, diff=4.72939s, valid=True
2026-05-28T23:32:43.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:32:43.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:32:43.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:12, diff=-28.26785s, valid=True
2026-05-28T23:32:43.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:32:43.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:32:43.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:32:38, diff=5.738726s, valid=True
2026-05-28T23:32:43.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:32:43.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:32:43.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:32:43.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:32:43.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:32:43.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:32:43.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:12, diff=-28.258284s, valid=True
2026-05-28T23:32:43.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:32:43.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:32:43.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:32:43.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936605.742368s, valid=True
2026-05-28T23:32:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:32:43.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:32:43.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:32:43.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:32:43.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:32:43.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:32:43.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:32:43.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:32:43.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:32:43.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:32:43.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:32:43.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:32:44.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:32:44.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:32:44.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:32:44.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:32:44.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:32:44.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:32:44.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-28T23:32:44.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-28T23:32:44.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:32:44.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:33:14.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:33:14.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:33:14.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:33:15.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:33:15.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:33:15.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:33:15.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-28T23:33:15.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:33:15.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-28T23:33:15.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:33:15.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:33:15.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:33:15.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:33:17.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-28T23:33:17.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:33:17.762 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:33:17.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:33:17.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:33:17.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:33:17.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:33:17.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:33:17.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:33:17.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:33:17.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:33:17.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:33:17.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:33:17.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:33:17.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:33:17.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:33:17.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:33:18.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:33:18.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:33:18.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:33:18.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:33:18.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:33:18.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:33:18.046 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:33:18.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:33:10
2026-05-28T23:33:18.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70301, datetime.datetime(2026, 5, 28, 23, 33, 10), datetime.datetime(2026, 5, 28, 23, 33, 9), 'salt', 6.69, 76.17, None, 11.05, 121.58, 3.9, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:33:18.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:33:18.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:33:18.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:09, diff=9.110342s, valid=True
2026-05-28T23:33:18.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:33:18.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:33:18.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:12, diff=6.11322s, valid=True
2026-05-28T23:33:18.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:33:18.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:33:18.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:03, diff=15.119892s, valid=True
2026-05-28T23:33:18.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:33:18.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:33:18.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:33:18.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:33:18.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:33:18.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:33:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:12, diff=6.122924s, valid=True
2026-05-28T23:33:18.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:33:18.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:33:18.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:33:18.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936640.123627s, valid=True
2026-05-28T23:33:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:33:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:33:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:33:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:33:18.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:33:18.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:33:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:33:18.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:33:18.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:33:18.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:33:18.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:33:18.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:33:18.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:33:18.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:33:18.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:33:19.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:33:19.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:33:19.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:33:19.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-28T23:33:19.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-28T23:33:19.321 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:33:19.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:33:49.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:33:49.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:33:49.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:33:49.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:33:49.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:33:49.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:33:49.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-28T23:33:49.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:33:49.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-28T23:33:49.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:33:49.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:33:49.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:33:49.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-28T23:33:52.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-28T23:33:52.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:33:52.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:33:52.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:33:52.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:33:52.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:33:52.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:33:52.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:33:52.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:33:52.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:33:52.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:33:52.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:33:52.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:33:52.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:33:52.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:33:52.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:33:52.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:33:52.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:33:52.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:33:52.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:33:52.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:33:52.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:33:52.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:33:52.506 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:33:52.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:33:40
2026-05-28T23:33:52.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70302, datetime.datetime(2026, 5, 28, 23, 33, 40), datetime.datetime(2026, 5, 28, 23, 33, 40), 'salt', 6.75, 76.1, None, 11.29, 121.4, 3.91, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:33:52.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:33:52.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:33:52.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:40, diff=12.576908s, valid=True
2026-05-28T23:33:52.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:33:52.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:33:52.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:12, diff=-19.420184s, valid=True
2026-05-28T23:33:52.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:33:52.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:33:52.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:33:33, diff=19.586604s, valid=True
2026-05-28T23:33:52.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:33:52.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:33:52.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:33:52.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:33:52.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:33:52.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:33:52.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:12, diff=-19.410286s, valid=True
2026-05-28T23:33:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:33:52.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:33:52.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:33:52.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936674.590423s, valid=True
2026-05-28T23:33:52.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:33:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:33:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:33:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:33:52.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:33:52.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:33:52.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:33:52.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:33:52.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:33:52.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:33:52.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:33:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:33:52.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:33:52.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:33:53.125 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:33:53.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:33:53.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:33:53.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:33:53.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-28T23:33:53.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-28T23:33:53.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:33:53.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:34:23.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:34:23.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:34:23.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:34:24.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:34:24.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:34:24.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:34:24.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-28T23:34:24.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:34:24.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-28T23:34:24.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:34:24.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:34:24.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:34:24.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-28T23:34:26.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-28T23:34:26.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:34:26.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:34:26.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:34:26.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:34:26.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:34:26.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:34:26.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:34:26.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:34:26.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:34:26.875 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:34:26.875 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:34:26.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:34:26.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:34:26.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:34:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:34:27.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:34:27.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:34:27.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:34:27.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:34:27.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:34:27.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:34:27.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:34:27.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:34:27.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:34:10
2026-05-28T23:34:27.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70303, datetime.datetime(2026, 5, 28, 23, 34, 10), datetime.datetime(2026, 5, 28, 23, 34, 10), 'salt', 6.78, 75.83, None, 10.98, 120.69, 3.95, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:34:27.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:34:27.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:34:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:10, diff=17.191993s, valid=True
2026-05-28T23:34:27.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:34:27.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:34:27.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:12, diff=15.194863s, valid=True
2026-05-28T23:34:27.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:34:27.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:04, diff=23.201441s, valid=True
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:34:27.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:34:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:12, diff=15.204475s, valid=True
2026-05-28T23:34:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:34:27.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:34:27.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:34:27.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936709.205143s, valid=True
2026-05-28T23:34:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:34:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:34:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:34:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:34:27.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:34:27.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:34:27.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:34:27.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:34:27.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:34:27.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:34:27.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:34:27.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:34:27.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:34:27.591 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:34:27.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:34:28.155 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:34:28.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:34:28.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:34:28.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-28T23:34:28.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-28T23:34:28.336 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:34:28.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:34:58.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:34:58.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:34:58.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:34:58.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:34:58.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:34:58.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:34:58.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-28T23:34:58.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:34:58.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-28T23:34:58.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:34:58.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:34:58.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:34:58.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-28T23:35:01.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-28T23:35:01.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:35:01.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:35:01.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:35:01.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:35:01.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:35:01.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:35:01.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:35:01.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:35:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:35:01.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:35:01.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:35:01.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:35:01.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:35:01.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:35:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:35:01.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:35:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:35:01.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:35:01.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:35:01.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:35:01.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:35:01.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:35:01.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:35:01.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:34:40
2026-05-28T23:35:01.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70304, datetime.datetime(2026, 5, 28, 23, 34, 40), datetime.datetime(2026, 5, 28, 23, 34, 40), 'salt', 6.72, 75.77, None, 10.48, 121.02, 3.97, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:35:01.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:35:01.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:35:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:40, diff=21.399779s, valid=True
2026-05-28T23:35:01.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:35:01.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:35:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:12, diff=-10.597397s, valid=True
2026-05-28T23:35:01.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:35:01.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:34:34, diff=27.40928s, valid=True
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:35:01.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:35:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:12, diff=-10.587682s, valid=True
2026-05-28T23:35:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:35:01.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:35:01.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:35:01.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936743.412992s, valid=True
2026-05-28T23:35:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:35:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:35:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:35:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:35:01.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:35:01.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:35:01.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:35:01.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:35:01.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:35:01.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:35:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:35:01.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:35:01.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:35:01.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:35:01.996 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:35:02.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:35:02.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:35:02.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:35:02.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-28T23:35:02.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-28T23:35:02.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:35:02.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:35:32.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:35:32.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:35:32.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:35:33.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:35:33.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:35:33.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:35:33.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-28T23:35:33.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:35:33.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-28T23:35:33.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:35:33.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:35:33.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:35:33.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-28T23:35:36.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-28T23:35:36.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:35:36.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:35:36.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:35:36.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:35:36.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:35:36.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:35:36.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:35:36.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:35:36.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:35:36.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:35:36.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:35:36.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:35:36.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:35:36.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:35:36.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:35:36.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:35:36.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:35:36.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:35:36.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:35:36.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:35:36.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:35:36.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:35:36.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:35:36.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:35:11
2026-05-28T23:35:36.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70305, datetime.datetime(2026, 5, 28, 23, 35, 11), datetime.datetime(2026, 5, 28, 23, 35, 10), 'salt', 6.72, 75.44, None, 10.62, 123.44, 4.03, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:35:36.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:35:36.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:35:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:10, diff=26.463519s, valid=True
2026-05-28T23:35:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:35:36.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:35:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:12, diff=24.466364s, valid=True
2026-05-28T23:35:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:35:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:05, diff=31.473023s, valid=True
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:35:36.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:35:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:12, diff=24.476004s, valid=True
2026-05-28T23:35:36.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:35:36.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:35:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:35:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936778.476678s, valid=True
2026-05-28T23:35:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:35:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:35:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:35:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:35:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:35:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:35:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:35:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:35:36.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:35:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:35:36.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:35:36.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:35:36.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:35:36.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:35:37.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:35:37.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:35:37.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:35:37.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:35:37.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-28T23:35:37.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-28T23:35:37.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:35:37.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:36:07.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:36:07.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:36:07.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:36:07.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:36:07.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:36:07.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:36:07.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-28T23:36:07.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:36:07.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-28T23:36:08.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:36:08.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:36:08.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:36:08.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-28T23:36:10.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-28T23:36:10.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:36:10.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:36:10.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:36:10.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:36:10.363 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:36:10.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:36:10.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:36:10.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:36:10.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:36:10.376 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:36:10.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:36:10.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:36:10.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:36:10.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:36:10.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:36:10.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:36:10.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:36:10.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:36:10.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:36:10.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:36:10.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:36:10.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:36:10.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:36:10.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:35:41
2026-05-28T23:36:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70306, datetime.datetime(2026, 5, 28, 23, 35, 41), datetime.datetime(2026, 5, 28, 23, 35, 40), 'salt', 6.69, 75.34, None, 11.05, 121.28, 4.05, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:36:10.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:36:10.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:36:10.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:40, diff=30.712692s, valid=True
2026-05-28T23:36:10.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:36:10.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:36:10.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:36:12, diff=-1.284506s, valid=True
2026-05-28T23:36:10.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:36:10.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:35:37, diff=33.722183s, valid=True
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:36:10.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:36:10.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:36:12, diff=-1.274778s, valid=True
2026-05-28T23:36:10.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:36:10.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:36:10.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:36:10.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936812.725902s, valid=True
2026-05-28T23:36:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:36:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:36:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:36:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:36:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:36:10.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:36:10.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:36:10.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:36:10.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:36:10.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:36:10.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:36:10.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:36:11.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:36:11.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:36:11.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:36:11.663 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:36:11.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:36:11.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:36:11.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-28T23:36:11.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-28T23:36:11.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:36:11.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:36:41.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:36:41.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:36:41.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:36:42.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:36:42.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:36:42.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:36:42.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-28T23:36:42.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:36:42.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-28T23:36:42.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:36:42.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:36:42.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:36:42.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-28T23:36:45.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-28T23:36:45.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:36:45.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:36:45.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:36:45.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:36:45.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:36:45.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:36:45.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:36:45.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:36:45.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:36:45.081 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:36:45.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:36:45.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:36:45.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:36:45.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:36:45.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:36:45.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:36:45.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:36:45.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:36:45.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:36:45.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:36:45.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:36:45.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:36:45.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:36:45.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:36:41
2026-05-28T23:36:45.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70308, datetime.datetime(2026, 5, 28, 23, 36, 41), datetime.datetime(2026, 5, 28, 23, 36, 41), 'salt', 6.55, 75.5, None, 9.88, 121.58, 4.01, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:36:45.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:36:45.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:36:45.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:36:41, diff=4.401983s, valid=True
2026-05-28T23:36:45.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:36:45.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:36:45.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:12, diff=-26.59518s, valid=True
2026-05-28T23:36:45.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:36:45.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:36:39, diff=6.411338s, valid=True
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:36:45.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:36:45.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:12, diff=-26.585686s, valid=True
2026-05-28T23:36:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:36:45.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:36:45.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:36:45.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936847.414975s, valid=True
2026-05-28T23:36:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:36:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:36:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:36:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:36:45.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:36:45.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:36:45.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:36:45.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:36:45.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:36:45.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:36:45.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:36:45.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:36:45.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:36:45.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:36:45.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:36:46.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:36:46.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:36:46.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:36:46.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-28T23:36:46.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-28T23:36:46.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:36:46.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:37:16.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:37:16.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:37:16.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:37:16.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:37:16.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:37:16.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:37:16.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-28T23:37:16.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:37:16.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-28T23:37:16.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:37:16.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:37:16.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:37:16.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-28T23:37:19.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-28T23:37:19.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:37:19.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:37:19.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:37:19.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:37:19.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:37:19.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:37:19.387 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:37:19.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:37:19.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:37:19.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:37:19.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:37:19.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:37:19.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:37:19.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:37:19.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:37:19.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:37:19.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:37:19.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:37:19.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:37:19.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:37:19.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:37:19.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:37:19.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:37:19.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:37:11
2026-05-28T23:37:19.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70309, datetime.datetime(2026, 5, 28, 23, 37, 11), datetime.datetime(2026, 5, 28, 23, 37, 11), 'salt', 6.59, 75.64, None, 10.8, 121.12, 3.99, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:37:19.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:37:19.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:37:19.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:11, diff=8.71285s, valid=True
2026-05-28T23:37:19.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:37:19.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:37:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:12, diff=7.715739s, valid=True
2026-05-28T23:37:19.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:37:19.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:37:19.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:05, diff=14.722819s, valid=True
2026-05-28T23:37:19.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:37:19.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:37:19.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:37:19.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:37:19.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:37:19.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:37:19.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:12, diff=7.725898s, valid=True
2026-05-28T23:37:19.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:37:19.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:37:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:37:19.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936881.726547s, valid=True
2026-05-28T23:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:37:19.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:37:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:37:19.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:37:19.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:37:19.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:37:19.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:37:19.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:37:19.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:37:20.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:37:20.091 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:37:20.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:37:20.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:37:20.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:37:20.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:37:20.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:37:20.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:37:20.998 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:37:20.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:37:51.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:37:51.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:37:51.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:37:51.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:37:51.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:37:51.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:37:51.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:37:51.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:37:51.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-28T23:37:51.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:37:51.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:37:51.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:37:51.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-28T23:37:54.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-28T23:37:54.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:37:54.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:37:54.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:37:54.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:37:54.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:37:54.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:37:54.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:37:54.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:37:54.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:37:54.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:37:54.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:37:54.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:37:54.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:37:54.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:37:54.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:37:54.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:37:54.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:37:54.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:37:54.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:37:54.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:37:54.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:37:54.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:37:54.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:37:54.486 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:37:42
2026-05-28T23:37:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70310, datetime.datetime(2026, 5, 28, 23, 37, 42), datetime.datetime(2026, 5, 28, 23, 37, 41), 'salt', 6.55, 75.7, None, 10.76, 118.27, 3.97, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:37:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:37:54.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:37:54.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:41, diff=13.492755s, valid=True
2026-05-28T23:37:54.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:37:54.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:37:54.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:12, diff=-17.504419s, valid=True
2026-05-28T23:37:54.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:37:54.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:37:36, diff=18.502441s, valid=True
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:37:54.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:37:54.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:12, diff=-17.494552s, valid=True
2026-05-28T23:37:54.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:37:54.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:37:54.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:37:54.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936916.506113s, valid=True
2026-05-28T23:37:54.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:37:54.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:37:54.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:37:54.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:37:54.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:37:54.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:37:54.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:37:54.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:37:54.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:37:54.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:37:54.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:37:54.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:37:54.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:37:54.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:37:55.052 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:37:55.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:37:55.540 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:37:55.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:37:55.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-28T23:37:55.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-28T23:37:55.718 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:37:55.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:38:25.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:38:25.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:38:25.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:38:26.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:38:26.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:38:26.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:38:26.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-28T23:38:26.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:38:26.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-28T23:38:26.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:38:26.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:38:26.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:38: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-28T23:38:28.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:38:28.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:38:28.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:38:28.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:38:28.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:38:28.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:38:28.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:38:28.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:38:28.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:38:28.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:38:28.634 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:38:28.634 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:38:28.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:38:28.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:38:28.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:38:28.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:38:28.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:38:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:38:28.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:38:28.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:38:28.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:38:28.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:38:28.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:38:28.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:38:28.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:38:12
2026-05-28T23:38:28.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70311, datetime.datetime(2026, 5, 28, 23, 38, 12), datetime.datetime(2026, 5, 28, 23, 38, 12), 'salt', 6.55, 76.0, None, 11.05, 118.88, 3.92, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:38:28.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:38:28.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:38:28.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:12, diff=16.958509s, valid=True
2026-05-28T23:38:28.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:38:28.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:38:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:12, diff=16.961356s, valid=True
2026-05-28T23:38:28.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:38:28.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:06, diff=22.968056s, valid=True
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:38:28.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:38:28.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:12, diff=16.971064s, valid=True
2026-05-28T23:38:28.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:38:28.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:38:28.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:38:28.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936950.971732s, valid=True
2026-05-28T23:38:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:38:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:38:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:38:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:38:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:38:29.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:38:29.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:38:29.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:38:29.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:38:29.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:38:29.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:38:29.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:38:29.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:38:29.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:38:29.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:38:30.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:38:30.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:38:30.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:38:30.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-28T23:38:30.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-28T23:38:30.225 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:38:30.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:39:00.255 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:39:00.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:39:00.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:39:00.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:39:00.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:39:00.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:39:00.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-28T23:39:00.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:39:00.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-28T23:39:00.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:39:00.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:39:00.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:39:00.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-28T23:39:03.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-28T23:39:03.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:39:03.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:39:03.210 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:39:03.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:39:03.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:39:03.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:39:03.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:39:03.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:39:03.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:39:03.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:39:03.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:39:03.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:39:03.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:39:03.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:39:03.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:39:03.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:39:03.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:39:03.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:39:03.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:39:03.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:39:03.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:39:03.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:39:03.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:39:03.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:38:43
2026-05-28T23:39:03.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70312, datetime.datetime(2026, 5, 28, 23, 38, 43), datetime.datetime(2026, 5, 28, 23, 38, 42), 'salt', 6.62, 76.03, None, 10.98, 118.88, 3.92, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:39:03.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:39:03.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:39:03.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:42, diff=21.545823s, valid=True
2026-05-28T23:39:03.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:39:03.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:39:03.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:12, diff=-8.451271s, valid=True
2026-05-28T23:39:03.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:39:03.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:38:36, diff=27.555329s, valid=True
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:39:03.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:39:03.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:12, diff=-8.441638s, valid=True
2026-05-28T23:39:03.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:39:03.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:39:03.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:39:03.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=936985.559036s, valid=True
2026-05-28T23:39:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:39:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:39:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:39:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:39:03.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:39:03.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:39:03.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:39:03.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:39:03.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:39:03.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:39:03.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:39:03.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:39:03.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:39:03.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:39:04.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:39:04.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:39:04.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:39:04.535 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:39:04.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-28T23:39:04.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-28T23:39:04.616 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:39:04.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:39:34.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:39:34.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:39:34.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:39:34.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:39:34.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:39:35.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:39:35.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:39:35.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:39: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-28T23:39:35.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:39:35.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:39:35.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:39:35.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-28T23:39:37.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-28T23:39:37.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:39:37.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:39:37.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:39:37.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:39:37.545 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:39:37.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:39:37.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:39:37.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:39:37.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:39:37.557 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:39:37.557 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:39:37.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:39:37.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:39:37.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:39:37.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:39:37.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:39:37.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:39:37.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:39:37.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:39:37.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:39:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:39:37.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:39:37.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:39:37.886 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:39:13
2026-05-28T23:39:37.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70313, datetime.datetime(2026, 5, 28, 23, 39, 13), datetime.datetime(2026, 5, 28, 23, 39, 13), 'salt', 6.69, 75.9, None, 10.98, 116.56, 3.95, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:39:37.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:39:37.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:39:37.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:13, diff=24.892531s, valid=True
2026-05-28T23:39:37.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:39:37.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:39:37.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:12, diff=25.895354s, valid=True
2026-05-28T23:39:37.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:39:37.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:39:37.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:07, diff=30.901875s, valid=True
2026-05-28T23:39:37.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:39:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:39:37.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:39:37.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:39:37.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:12, diff=25.905001s, valid=True
2026-05-28T23:39:37.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:39:37.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:39:37.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:39:37.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937019.905794s, valid=True
2026-05-28T23:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:39:37.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:39:37.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:39:37.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:39:37.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:39:37.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:39:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:39:38.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:39:38.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:39:38.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:39:38.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:39:38.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:39:38.955 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:39:39.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:39:39.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:39:39.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-28T23:39:39.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-28T23:39:39.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:39:39.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:40:09.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:40:09.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:40:09.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:40:09.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:40:09.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:40:09.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:40:09.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-28T23:40:09.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:40:09.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-28T23:40:09.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:40:09.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:40:09.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:40:09.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-28T23:40:12.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-28T23:40:12.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:40:12.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:40:12.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:40:12.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:40:12.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:40:12.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:40:12.107 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:40:12.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:40:12.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:40:12.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:40:12.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:40:12.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:40:12.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:40:12.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:40:12.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:40:12.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:40:12.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:40:12.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:40:12.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:40:12.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:40:12.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:40:12.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:40:12.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:40:12.419 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:39:44
2026-05-28T23:40:12.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70314, datetime.datetime(2026, 5, 28, 23, 39, 44), datetime.datetime(2026, 5, 28, 23, 39, 43), 'salt', 6.59, 75.8, None, 10.41, 110.17, 3.96, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:40:12.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:40:12.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:40:12.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:43, diff=29.426145s, valid=True
2026-05-28T23:40:12.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:40:12.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:40:12.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:40:12, diff=0.429019s, valid=True
2026-05-28T23:40:12.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:40:12.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:40:12.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:39:39, diff=33.435776s, valid=True
2026-05-28T23:40:12.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:40:12.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:40:12.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:40:12.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:40:12.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:40:12.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:40:12.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:40:12, diff=0.438852s, valid=True
2026-05-28T23:40:12.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:40:12.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:40:12.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:40:12.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937054.439525s, valid=True
2026-05-28T23:40:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:40:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:40:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:40:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:40:12.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:40:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:40:12.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:40:12.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:40:12.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:40:12.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:40:12.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:40:12.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:40:12.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:40:12.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:40:12.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:40:13.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:40:13.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:40:13.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:40: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-28T23:40: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-28T23:40:13.561 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:40:13.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:40:43.570 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:40:43.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:40:43.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:40:44.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:40:44.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:40:44.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:40:44.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-28T23:40:44.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:40:44.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-28T23:40:44.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:40:44.355 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:40:44.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:40:44.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-28T23:40:46.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:40:46.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:40:46.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:40:46.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:40:46.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:40:46.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:40:46.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:40:46.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:40:46.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:40:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:40:46.792 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:40:46.792 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:40:46.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:40:46.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:40:46.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:40:46.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:40:46.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:40:47.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:40:47.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:40:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:40:47.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:40:47.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:40:47.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:40:47.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:40:47.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:40:44
2026-05-28T23:40:47.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70316, datetime.datetime(2026, 5, 28, 23, 40, 44), datetime.datetime(2026, 5, 28, 23, 40, 44), 'salt', 6.52, 75.9, None, 9.99, 111.61, 3.94, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:40:47.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:40:47.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:40:47.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:40:44, diff=3.105747s, valid=True
2026-05-28T23:40:47.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:40:47.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:40:47.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:12, diff=-24.891374s, valid=True
2026-05-28T23:40:47.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:40:47.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:40:42, diff=5.115269s, valid=True
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:40:47.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:40:47.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:12, diff=-24.881647s, valid=True
2026-05-28T23:40:47.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:40:47.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:40:47.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:40:47.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937089.119027s, valid=True
2026-05-28T23:40:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:40:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:40:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:40:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:40:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:40:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:40:47.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:40:47.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:40:47.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:40:47.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:40:47.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:40:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:40:47.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:40:47.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:40:47.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:40:48.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:40:48.172 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:40:48.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:40:48.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-28T23:40:48.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-28T23:40:48.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:40:48.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:41:18.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:41:18.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:41:18.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:41:18.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:41:18.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:41:18.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:41:18.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-28T23:41:18.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:41:18.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:41:18.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:41:18.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:41:18.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:41:18.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-28T23:41:21.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-28T23:41:21.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:41:21.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:41:21.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:41:21.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:41:21.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:41:21.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:41:21.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:41:21.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:41:21.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:41:21.623 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:41:21.623 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:41:21.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:41:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:41:21.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:41:21.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:41:21.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:41:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:41:21.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:41:21.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:41:21.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:41:21.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:41:21.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:41:21.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:41:21.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:41:15
2026-05-28T23:41:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70317, datetime.datetime(2026, 5, 28, 23, 41, 15), datetime.datetime(2026, 5, 28, 23, 41, 14), 'salt', 6.52, 76.2, None, 10.52, 118.09, 3.88, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:41:21.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:41:21.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:41:21.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:14, diff=7.943961s, valid=True
2026-05-28T23:41:21.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:41:21.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:41:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:12, diff=9.94681s, valid=True
2026-05-28T23:41:21.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:41:21.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:13, diff=8.953468s, valid=True
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:41:21.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:41:21.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:12, diff=9.956456s, valid=True
2026-05-28T23:41:21.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:41:21.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:41:21.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:41:21.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937123.957131s, valid=True
2026-05-28T23:41:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:41:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:41:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:41:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:41:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:41:22.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:41:22.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:41:22.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:41:22.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:41:22.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:41:22.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:41:22.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:41:22.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:41:22.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:41:22.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:41:22.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:41:22.918 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:41:22.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:41:22.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-28T23:41:22.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:41:23.073 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:41:23.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:41:53.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:41:53.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:41:53.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:41:53.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:41:53.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:41:53.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:41:53.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-28T23:41:53.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:41:53.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-28T23:41:53.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:41:53.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:41:53.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:41:53.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-28T23:41:55.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-28T23:41:55.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:41:55.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:41:55.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:41:55.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:41:55.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:41:55.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:41:55.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:41:55.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:41:55.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:41:55.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:41:55.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:41:55.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:41:55.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:41:55.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:41:55.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:41:55.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:41:55.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:41:55.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:41:56.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:41:56.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:41:56.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:41:56.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:41:56.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:41:56.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:41:45
2026-05-28T23:41:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70318, datetime.datetime(2026, 5, 28, 23, 41, 45), datetime.datetime(2026, 5, 28, 23, 41, 44), 'salt', 6.62, 76.27, None, 10.66, 119.12, 3.87, 832.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:41:56.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:41:56.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:41:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:44, diff=12.101428s, valid=True
2026-05-28T23:41:56.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:41:56.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:41:56.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:12, diff=-15.895784s, valid=True
2026-05-28T23:41:56.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:41:56.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:41:45, diff=11.110603s, valid=True
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:41:56.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:41:56.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:41:56.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:12, diff=-15.88642s, valid=True
2026-05-28T23:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:41:56.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:41:56.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:41:56.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937158.114224s, valid=True
2026-05-28T23:41:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:41:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:41:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:41:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:41:56.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:41:56.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:41:56.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:41:56.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:41:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:41:56.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:41:56.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:41:56.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:41:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:41:56.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:41:56.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:41:56.969 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:41:57.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:41:57.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:41:57.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-28T23:41:57.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-28T23:41:57.149 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:41:57.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:42:27.166 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:42:27.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:42:27.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:42:27.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:42:27.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:42:27.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:42:27.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-28T23:42:27.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:42:27.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-28T23:42:27.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:42:27.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:42:27.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:42:27.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-28T23:42:30.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:42:30.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:42:30.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:42:30.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:42:30.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:42:30.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:42:30.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:42:30.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:42:30.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:42:30.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:42:30.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:42:30.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:42:30.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:42:30.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:42:30.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:42:30.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:42:30.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:42:30.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:42:30.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:42:30.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:42:30.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:42:30.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:42:30.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:42:30.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:42:30.580 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:42:15
2026-05-28T23:42:30.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70319, datetime.datetime(2026, 5, 28, 23, 42, 15), datetime.datetime(2026, 5, 28, 23, 42, 15), 'salt', 6.69, 76.17, None, 10.27, 121.51, 3.9, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:42:30.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:42:30.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:42:30.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:15, diff=15.593154s, valid=True
2026-05-28T23:42:30.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:42:30.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:42:30.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:12, diff=18.598429s, valid=True
2026-05-28T23:42:30.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:42:30.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:42:30.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:08, diff=22.610697s, valid=True
2026-05-28T23:42:30.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:42:30.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:42:30.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:42:30.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:42:30.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:42:30.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:42:30.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:12, diff=18.613871s, valid=True
2026-05-28T23:42:30.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:42:30.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:42:30.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:42:30.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937192.614545s, valid=True
2026-05-28T23:42:30.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:42:30.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:42:30.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:42:30.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:42:30.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:42:30.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:42:30.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:42:30.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:42:30.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:42:30.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:42:30.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:42:30.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:42:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:42:30.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:42:31.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:42:31.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:42:31.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:42:31.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:42:31.657 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:42:31.657 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:42:31.736 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:42:31.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:43:01.760 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:43:01.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:43:01.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:43:01.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:43:01.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:43:02.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:43:02.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:43:02.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:43:02.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-28T23:43:02.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:43:02.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:43:02.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:43:02.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:43:04.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-28T23:43:04.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:43:04.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:43:04.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:43:04.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:43:04.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:43:04.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:43:04.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:43:04.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:43:04.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:43:04.406 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:43:04.406 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:43:04.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:43:04.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:43:04.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:43:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:43:04.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:43:04.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:43:04.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:43:04.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:43:04.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:43:04.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:43:04.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:43:04.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:43:04.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:42:46
2026-05-28T23:43:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70320, datetime.datetime(2026, 5, 28, 23, 42, 46), datetime.datetime(2026, 5, 28, 23, 42, 46), 'salt', 6.78, 75.74, None, 9.74, 122.69, 3.97, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:43:04.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:43:04.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:43:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:46, diff=18.721139s, valid=True
2026-05-28T23:43:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:43:04.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:43:04.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:12, diff=-7.276057s, valid=True
2026-05-28T23:43:04.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:43:04.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:42:38, diff=26.730442s, valid=True
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:43:04.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:43:04.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:12, diff=-7.266604s, valid=True
2026-05-28T23:43:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:43:04.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:43:04.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:43:04.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937226.734055s, valid=True
2026-05-28T23:43:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:43:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:43:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:43:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:43:04.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:43:04.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:43:04.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:43:04.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:43:04.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:43:04.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:43:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:43:04.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:43:05.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:43:05.057 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:43:05.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:43:05.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:43:05.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:43:05.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:43:05.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-28T23:43:05.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-28T23:43:05.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:43:05.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:43:35.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:43:35.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:43:35.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:43:36.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:43:36.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:43:36.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:43:36.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:43:36.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:43:36.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-28T23:43:36.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:43:36.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:43:36.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:43:36.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-28T23:43:38.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-28T23:43:38.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:43:38.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:43:38.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:43:38.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:43:38.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:43:38.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:43:38.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:43:38.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:43:38.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:43:38.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:43:38.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:43:38.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:43:39.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:43:39.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:43:39.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:43:39.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:43:39.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:43:39.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:43:39.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:43:39.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:43:39.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:43:39.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:43:39.216 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:43:39.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:43:16
2026-05-28T23:43:39.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70321, datetime.datetime(2026, 5, 28, 23, 43, 16), datetime.datetime(2026, 5, 28, 23, 43, 16), 'salt', 6.72, 75.6, None, 9.71, 122.95, 4.0, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:43:39.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:43:39.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:43:39.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:16, diff=23.279346s, valid=True
2026-05-28T23:43:39.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:43:39.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:43:39.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:12, diff=27.282137s, valid=True
2026-05-28T23:43:39.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:43:39.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:43:39.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:08, diff=31.288785s, valid=True
2026-05-28T23:43:39.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:43:39.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:43:39.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:43:39.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:43:39.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:43:39.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:43:39.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:12, diff=27.291731s, valid=True
2026-05-28T23:43:39.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:43:39.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:43:39.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:43:39.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937261.292386s, valid=True
2026-05-28T23:43:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:43:39.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:43:39.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:43:39.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:43:39.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:43:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:43:39.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:43:39.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:43:39.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:43:39.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:43:39.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:43:39.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:43:39.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:43:39.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:43:39.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:43:40.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:43:40.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:43:40.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:43:40.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-28T23:43:40.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-28T23:43:40.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:43:40.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:44:10.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:44:10.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:44:10.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:44:10.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:44:10.962 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:44:11.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:44:11.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-28T23:44:11.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:44:11.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-28T23:44:11.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:44:11.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:44:11.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:44: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-28T23:44:13.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-28T23:44:13.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:44:13.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:44:13.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:44:13.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:44:13.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:44:13.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:44:13.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:44:13.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:44:13.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:44:13.586 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:44:13.586 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:44:13.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:44:13.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:44:13.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:44:13.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:44:13.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:44:13.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:44:13.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:44:13.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:44:13.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:44:13.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:44:13.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:44:13.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:44:13.897 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:43:46
2026-05-28T23:44:13.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70322, datetime.datetime(2026, 5, 28, 23, 43, 46), datetime.datetime(2026, 5, 28, 23, 43, 46), 'salt', 6.59, 75.6, None, 10.06, 126.59, 4.0, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:44:13.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:44:13.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:44:13.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:46, diff=27.903441s, valid=True
2026-05-28T23:44:13.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:44:13.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:44:13.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:44:12, diff=1.906233s, valid=True
2026-05-28T23:44:13.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:44:13.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:44:13.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:43:40, diff=33.912789s, valid=True
2026-05-28T23:44:13.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:44:13.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:44:13.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:44:13.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:44:13.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:44:13.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:44:13.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:44:12, diff=1.915806s, valid=True
2026-05-28T23:44:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:44:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:44:13.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:44:13.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937295.916464s, valid=True
2026-05-28T23:44:13.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:44:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:44:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:44:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:44:13.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:44:13.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:44:13.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:44:13.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:44:13.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:44:14.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:44:14.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:44:14.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:44:14.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:44:14.237 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:44:14.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:44:14.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:44:14.887 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:44:14.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:44:14.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-28T23:44:14.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-28T23:44:15.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:44:15.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:44:45.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:44:45.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:44:45.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:44:45.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:44:45.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:44:46.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:44:46.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-28T23:44:46.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:44:46.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:44:46.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:44:46.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:44:46.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:44:46.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-28T23:44:48.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:44:48.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:44:48.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:44:48.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:44:48.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:44:48.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:44:48.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:44:48.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:44:48.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:44:48.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:44:48.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:44:48.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:44:48.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:44:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:44:48.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:44:48.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:44:48.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:44:48.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:44:48.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:44:48.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:44:48.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:44:48.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:44:48.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:44:48.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:44:48.774 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:44:47
2026-05-28T23:44:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70324, datetime.datetime(2026, 5, 28, 23, 44, 47), datetime.datetime(2026, 5, 28, 23, 44, 46), 'salt', 6.72, 75.74, None, 9.53, 129.43, 3.98, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:44:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:44:48.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:44:48.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:44:46, diff=2.780699s, valid=True
2026-05-28T23:44:48.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:44:48.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:44:48.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:12, diff=-23.216487s, valid=True
2026-05-28T23:44:48.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:44:48.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:44:43, diff=5.79007s, valid=True
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:44:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:44:48.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:12, diff=-23.206874s, valid=True
2026-05-28T23:44:48.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:44:48.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:44:48.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:44:48.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937330.79379s, valid=True
2026-05-28T23:44:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:44:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:44:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:44:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:44:48.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:44:48.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:44:48.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:44:48.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:44:48.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:44:48.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:44:48.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:44:49.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:44:49.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:44:49.113 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:44:49.397 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:44:49.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:44:49.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:44:49.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:44:49.835 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:44:49.835 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:44:50.030 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:44:50.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:45:20.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:45:20.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:45:20.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:45:20.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:45:20.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:45:20.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:45:20.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-28T23:45:20.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:45:20.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:45:20.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:45:20.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:45:20.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:45:20.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-28T23:45:22.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:45:22.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:45:22.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:45:22.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:45:22.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:45:22.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:45:22.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:45:22.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:45:22.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:45:22.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:45:22.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:45:22.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:45:22.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:45:22.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:45:22.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:45:22.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:45:22.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:45:23.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:45:23.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:45:23.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:45:23.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:45:23.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:45:23.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:45:23.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:45:23.110 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:45:17
2026-05-28T23:45:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70325, datetime.datetime(2026, 5, 28, 23, 45, 17), datetime.datetime(2026, 5, 28, 23, 45, 17), 'salt', 6.75, 75.74, None, 9.42, 130.98, 3.97, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:45:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:45:23.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:45:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:17, diff=6.116188s, valid=True
2026-05-28T23:45:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:45:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:45:23.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:12, diff=11.11898s, valid=True
2026-05-28T23:45:23.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:45:23.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:45:23.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:15, diff=8.125683s, valid=True
2026-05-28T23:45:23.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:45:23.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:45:23.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:45:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:45:23.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:45:23.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:45:23.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:12, diff=11.128687s, valid=True
2026-05-28T23:45:23.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:45:23.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:45:23.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:45:23.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937365.129355s, valid=True
2026-05-28T23:45:23.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:45:23.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:45:23.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:45:23.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:45:23.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:45:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:45:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:45:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:45:23.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:45:23.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:45:23.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:45:23.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:45:23.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:45:23.451 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:45:23.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:45:23.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:45:24.096 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:45:24.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:45:24.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-28T23:45:24.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-28T23:45:24.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:45:24.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:45:54.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:45:54.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:45:54.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:45:54.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:45:54.814 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:45:55.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:45:55.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-28T23:45:55.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:45:55.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-28T23:45:55.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:45:55.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:45:55.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:45:55.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-28T23:45:57.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-28T23:45:57.422 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:45:57.425 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:45:57.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:45:57.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:45:57.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:45:57.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:45:57.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:45:57.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:45:57.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:45:57.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:45:57.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:45:57.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:45:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:45:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:45:57.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:45:57.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:45:57.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:45:57.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:45:57.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:45:57.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:45:57.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:45:57.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:45:57.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:45:57.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:45:48
2026-05-28T23:45:57.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70326, datetime.datetime(2026, 5, 28, 23, 45, 48), datetime.datetime(2026, 5, 28, 23, 45, 47), 'salt', 6.75, 75.4, None, 9.92, 128.39, 4.04, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:45:57.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:45:57.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:45:57.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:47, diff=10.784485s, valid=True
2026-05-28T23:45:57.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:45:57.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:45:57.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:12, diff=-14.21272s, valid=True
2026-05-28T23:45:57.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:45:57.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:45:57.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:45:46, diff=11.79391s, valid=True
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:45:57.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:45:57.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:12, diff=-14.203107s, valid=True
2026-05-28T23:45:57.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:45:57.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:45:57.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:45:57.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937399.797549s, valid=True
2026-05-28T23:45:57.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:45:57.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:45:57.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:45:57.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:45:57.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:45:57.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:45:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:45:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:45:57.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:45:57.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:45:58.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:45:58.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:45:58.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:45:58.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:45:58.427 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:45:58.771 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:45:58.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:45:58.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:45: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-28T23:45: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-28T23:45:59.075 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:45:59.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:46:29.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:46:29.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:46:29.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:46:29.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:46:29.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:46:29.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:46:29.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-28T23:46:29.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:46:29.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-28T23:46:29.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:46:29.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:46:29.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:46:29.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-28T23:46:32.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-28T23:46:32.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:46:32.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:46:32.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:46:32.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:46:32.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:46:32.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:46:32.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:46:32.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:46:32.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:46:32.713 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:46:32.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:46:32.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:46:32.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:46:32.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:46:32.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:46:32.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:46:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:46:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:46:32.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:46:32.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:46:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:46:32.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:46:32.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:46:33.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:46:18
2026-05-28T23:46:33.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70327, datetime.datetime(2026, 5, 28, 23, 46, 18), datetime.datetime(2026, 5, 28, 23, 46, 17), 'salt', 6.82, 75.3, None, 9.49, 127.74, 4.06, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:46:33.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:46:33.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:46:33.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:17, diff=16.038595s, valid=True
2026-05-28T23:46:33.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:46:33.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:46:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:12, diff=21.041462s, valid=True
2026-05-28T23:46:33.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:46:33.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:17, diff=16.048027s, valid=True
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:46:33.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:46:33.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:12, diff=21.051057s, valid=True
2026-05-28T23:46:33.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:46:33.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:46:33.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:46:33.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937435.05174s, valid=True
2026-05-28T23:46:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:46:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:46:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:46:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:46:33.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:46:33.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:46:33.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:46:33.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:46:33.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:46:33.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:46:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:46:33.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:46:33.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:46:33.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:46:33.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:46:33.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:46:34.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:46:34.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:46:34.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-28T23:46:34.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-28T23:46:34.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:46:34.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:47:04.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:47:04.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:47:04.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:47:04.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:47:04.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:47:04.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:47:04.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-28T23:47:04.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:47:04.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-28T23:47:04.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:47:04.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:47:04.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:47:04.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-28T23:47:06.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-28T23:47:06.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:47:06.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:47:06.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:47:06.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:47:06.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:47:06.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:47:06.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:47:06.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:47:06.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:47:06.897 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:47:06.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:47:06.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:47:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:47:06.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:47:07.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:47:07.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:47:07.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:47:07.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:47:07.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:47:07.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:47:07.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:47:07.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:47:07.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:47:07.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:46:48
2026-05-28T23:47:07.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70328, datetime.datetime(2026, 5, 28, 23, 46, 48), datetime.datetime(2026, 5, 28, 23, 46, 48), 'salt', 6.75, 75.1, None, 10.27, 128.96, 4.09, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:47:07.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:47:07.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:47:07.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:48, diff=19.246677s, valid=True
2026-05-28T23:47:07.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:47:07.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:47:07.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:12, diff=-4.750541s, valid=True
2026-05-28T23:47:07.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:47:07.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:46:41, diff=26.256021s, valid=True
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:47:07.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:47:07.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:12, diff=-4.740983s, valid=True
2026-05-28T23:47:07.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:47:07.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:47:07.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:47:07.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937469.259677s, valid=True
2026-05-28T23:47:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:47:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:47:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:47:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:47:07.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:47:07.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:47:07.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:47:07.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:47:07.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:47:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:47:07.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:47:07.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:47:07.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:47:07.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:47:07.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:47:08.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:47:08.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:47:08.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:47:08.327 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:47:08.327 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:47:08.504 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:47:08.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:47:38.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:47:38.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:47:38.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:47:38.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:47:38.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:47:38.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:47:38.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-28T23:47:38.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:47:38.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-28T23:47:38.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:47:38.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:47:38.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:47:38.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-28T23:47:41.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-28T23:47:41.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:47:41.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:47:41.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:47:41.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:47:41.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:47:41.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:47:41.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:47:41.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:47:41.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:47:41.288 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:47:41.288 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:47:41.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:47:41.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:47:41.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:47:41.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:47:41.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:47:41.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:47:41.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:47:41.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:47:41.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:47:41.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:47:41.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:47:41.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:47:41.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:47:18
2026-05-28T23:47:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70329, datetime.datetime(2026, 5, 28, 23, 47, 18), datetime.datetime(2026, 5, 28, 23, 47, 18), 'salt', 6.75, 75.2, None, 9.85, 131.75, 4.07, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:47:41.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:47:41.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:47:41.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:18, diff=23.620098s, valid=True
2026-05-28T23:47:41.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:47:41.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:47:41.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:12, diff=29.622944s, valid=True
2026-05-28T23:47:41.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:47:41.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:11, diff=30.629492s, valid=True
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:47:41.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:47:41.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:12, diff=29.632529s, valid=True
2026-05-28T23:47:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:47:41.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:47:41.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:47:41.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937503.633192s, valid=True
2026-05-28T23:47:41.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:47:41.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:47:41.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:47:41.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:47:41.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:47:41.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:47:41.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:47:41.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:47:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:47:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:47:41.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:47:41.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:47:41.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:47:41.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:47:42.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:47:42.493 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:47:42.590 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:47:42.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:47:42.590 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:47:42.590 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:47:42.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:47:42.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:48:12.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:48:12.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:48:12.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:48:12.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:48:13.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:48:13.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:48:13.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:48:13.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:48:13.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:48:13.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:48:13.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:48:13.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:48:13.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-28T23:48:15.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-28T23:48:15.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:48:15.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:48:15.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:48:15.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:48:15.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:48:15.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:48:15.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:48:15.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:48:15.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:48:15.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:48:15.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:48:15.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:48:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:48:15.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:48:15.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:48:15.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:48:15.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:48:15.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:48:16.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:48:16.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:48:16.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:48:16.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:48:16.026 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:48:16.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:47:48
2026-05-28T23:48:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70330, datetime.datetime(2026, 5, 28, 23, 47, 48), datetime.datetime(2026, 5, 28, 23, 47, 48), 'salt', 6.72, 75.6, None, 10.94, 127.29, 4.0, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:48:16.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:48:16.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:48:16.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:48, diff=28.093311s, valid=True
2026-05-28T23:48:16.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:48:16.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:48:16.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:48:12, diff=4.096128s, valid=True
2026-05-28T23:48:16.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:48:16.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:47:42, diff=34.102522s, valid=True
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:48:16.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:48:16.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:48:12, diff=4.105487s, valid=True
2026-05-28T23:48:16.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:48:16.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:48:16.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:48:16.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937538.106146s, valid=True
2026-05-28T23:48:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:48:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:48:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:48:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:48:16.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:48:16.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:48:16.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:48:16.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:48:16.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:48:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:48:16.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:48:16.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:48:16.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:48:16.428 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:48:16.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:48:16.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:48:17.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:48:17.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:48:17.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-28T23:48:17.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-28T23:48:17.273 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:48:17.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:48:47.296 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:48:47.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:48:47.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:48:47.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:48:47.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:48:47.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:48:47.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-28T23:48:47.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:48:47.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-28T23:48:47.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:48:47.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:48:47.984 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:48:47.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-28T23:48:50.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-28T23:48:50.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:48:50.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:48:50.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:48:50.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:48:50.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:48:50.252 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:48:50.252 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:48:50.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:48:50.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:48:50.252 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:48:50.252 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:48:50.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:48:50.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:48:50.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:48:50.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:48:50.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:48:50.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:48:50.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:48:50.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:48:50.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:48:50.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:48:50.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:48:50.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:48:50.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:48:49
2026-05-28T23:48:50.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70332, datetime.datetime(2026, 5, 28, 23, 48, 49), datetime.datetime(2026, 5, 28, 23, 48, 49), 'salt', 6.85, 76.5, None, 11.36, 124.45, 3.84, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:48:50.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:48:50.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:48:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:48:49, diff=1.580985s, valid=True
2026-05-28T23:48:50.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:48:50.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:48:50.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:12, diff=-21.416164s, valid=True
2026-05-28T23:48:50.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:48:50.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:48:45, diff=5.590341s, valid=True
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:48:50.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:48:50.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:12, diff=-21.406654s, valid=True
2026-05-28T23:48:50.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:48:50.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:48:50.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:48:50.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937572.594015s, valid=True
2026-05-28T23:48:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:48:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:48:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:48:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:48:50.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:48:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:48:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:48:50.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:48:50.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:48:50.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:48:50.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:48:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:48:50.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:48:50.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:48:51.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:48:51.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:48:51.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:48:51.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:48:51.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-28T23:48:51.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-28T23:48:51.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:48:51.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:49:21.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:49:21.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:49:21.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:49:22.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:49:22.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:49:22.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:49:22.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-28T23:49:22.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:49:22.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:49:22.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:49:22.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:49:22.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:49:22.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-28T23:49:24.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-28T23:49:24.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:49:24.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:49:24.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:49:24.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:49:24.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:49:24.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:49:24.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:49:24.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:49:24.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:49:24.947 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:49:24.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:49:24.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:49:25.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:49:25.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:49:25.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:49:25.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:49:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:49:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:49:25.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:49:25.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:49:25.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:49:25.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:49:25.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:49:25.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:49:19
2026-05-28T23:49:25.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70333, datetime.datetime(2026, 5, 28, 23, 49, 19), datetime.datetime(2026, 5, 28, 23, 49, 19), 'salt', 6.88, 76.6, None, 11.15, 124.45, 3.81, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:49:25.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:49:25.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:49:25.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:19, diff=6.276739s, valid=True
2026-05-28T23:49:25.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:49:25.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:49:25.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:12, diff=13.279569s, valid=True
2026-05-28T23:49:25.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:49:25.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:16, diff=9.286261s, valid=True
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:49:25.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:49:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:12, diff=13.289245s, valid=True
2026-05-28T23:49:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:49:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:49:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:49:25.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937607.289902s, valid=True
2026-05-28T23:49:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:49:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:49:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:49:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:49:25.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:49:25.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:49:25.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:49:25.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:49:25.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:49:25.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:49:25.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:49:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:49:25.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:49:25.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:49:25.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:49:26.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:49:26.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:49:26.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:49:26.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-28T23:49:26.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-28T23:49:26.333 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:49:26.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:49:56.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:49:56.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:49:56.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:49:56.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:49:56.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:49:56.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:49:56.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-28T23:49:56.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:49:56.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-28T23:49:56.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:49:56.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:49:56.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:49:56.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-28T23:49:59.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-28T23:49:59.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:49:59.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:49:59.447 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:49:59.447 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:49:59.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:49:59.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:49:59.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:49:59.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:49:59.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:49:59.468 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:49:59.468 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:49:59.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:49:59.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:49:59.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:49:59.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:49:59.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:49:59.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:49:59.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:49:59.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:49:59.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:49:59.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:49:59.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:49:59.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:49:59.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:49:49
2026-05-28T23:49:59.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70334, datetime.datetime(2026, 5, 28, 23, 49, 49), datetime.datetime(2026, 5, 28, 23, 49, 49), 'salt', 6.88, 76.76, None, 11.19, 128.54, 3.78, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:49:59.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:49:59.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:49:59.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:49, diff=10.787226s, valid=True
2026-05-28T23:49:59.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:49:59.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:49:59.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:12, diff=-12.209886s, valid=True
2026-05-28T23:49:59.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:49:59.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:49:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:49:47, diff=12.796692s, valid=True
2026-05-28T23:49:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:49:59.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:49:59.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:49:59.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:49:59.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:49:59.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:49:59.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:12, diff=-12.200106s, valid=True
2026-05-28T23:49:59.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:49:59.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:49:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:49:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937641.800602s, valid=True
2026-05-28T23:49:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:49:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:49:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:49:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:49:59.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:49:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:49:59.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:49:59.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:49:59.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:49:59.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:50:00.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:50:00.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:50:00.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:50:00.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:50:00.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:50:00.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:50:00.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:50:00.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:50:00.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-28T23:50:00.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-28T23:50:01.136 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:50:01.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:50:31.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:50:31.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:50:31.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:50:31.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:50:31.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:50:31.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:50:31.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-28T23:50:31.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:50:31.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:50:31.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:50:31.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:50:31.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:50:31.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-28T23:50:34.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-28T23:50:34.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:50:34.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:50:34.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:50:34.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:50:34.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:50:34.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:50:34.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:50:34.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:50:34.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:50:34.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:50:34.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:50:34.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:50:34.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:50:34.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:50:34.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:50:34.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:50:34.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:50:34.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:50:34.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:50:34.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:50:34.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:50:34.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:50:34.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:50:34.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:50:20
2026-05-28T23:50:34.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70335, datetime.datetime(2026, 5, 28, 23, 50, 20), datetime.datetime(2026, 5, 28, 23, 50, 19), 'salt', 6.92, 77.03, None, 11.22, 129.43, 3.74, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:50:34.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:50:34.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:50:34.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:19, diff=15.945564s, valid=True
2026-05-28T23:50:34.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:50:34.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:50:34.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:12, diff=22.948434s, valid=True
2026-05-28T23:50:34.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:50:34.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:50:34.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:19, diff=15.954972s, valid=True
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:50:34.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:50:34.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:12, diff=22.957994s, valid=True
2026-05-28T23:50:34.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:50:34.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:50:34.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:50:34.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937676.958671s, valid=True
2026-05-28T23:50:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:50:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:50:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:50:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:50:34.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:50:35.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:50:35.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:50:35.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:50:35.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:50:35.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:50:35.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:50:35.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:50:35.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:50:35.283 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:50:35.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:50:35.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:50:35.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:50:35.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:50:35.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-28T23:50:35.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-28T23:50:36.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:50:36.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:51:06.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:51:06.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:51:06.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:51:06.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:51:06.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:51:06.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:51:06.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-28T23:51:06.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:51:06.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-28T23:51:06.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:51:06.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:51:06.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:51:06.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-28T23:51:09.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:51:09.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:51:09.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:51:09.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:51:09.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:51:09.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:51:09.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:51:09.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:51:09.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:51:09.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:51:09.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:51:09.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:51:09.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:51:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:51:09.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:51:09.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:51:09.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:51:09.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:51:09.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:51:09.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:51:09.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:51:09.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:51:09.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:51:09.535 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:51:09.592 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:50:50
2026-05-28T23:51:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70336, datetime.datetime(2026, 5, 28, 23, 50, 50), datetime.datetime(2026, 5, 28, 23, 50, 49), 'salt', 6.88, 77.16, None, 11.08, 127.24, 3.71, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:51:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:51:09.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:51:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:49, diff=20.598673s, valid=True
2026-05-28T23:51:09.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:51:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:51:09.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:12, diff=-2.398523s, valid=True
2026-05-28T23:51:09.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:51:09.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:50:43, diff=26.608111s, valid=True
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:51:09.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:51:09.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:12, diff=-2.388868s, valid=True
2026-05-28T23:51:09.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:51:09.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:51:09.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:51:09.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937711.611817s, valid=True
2026-05-28T23:51:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:51:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:51:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:51:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:51:09.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:51:09.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:51:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:51:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:51:09.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:51:09.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:51:09.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:51:09.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:51:09.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:51:10.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:51:10.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:51:10.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:51:10.717 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:51:10.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:51:10.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-28T23:51:10.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-28T23:51:10.873 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:51:10.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:51:40.904 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:51:40.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:51:40.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:51:41.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:51:41.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:51:41.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:51:41.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-28T23:51:41.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:51:41.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-28T23:51:41.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:51:41.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:51:41.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:51:41.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:51:44.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-28T23:51:44.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:51:44.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:51:44.045 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:51:44.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:51:44.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:51:44.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:51:44.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:51:44.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:51:44.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:51:44.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:51:44.066 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:51:44.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:51:44.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:51:44.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:51:44.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:51:44.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:51:44.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:51:44.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:51:44.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:51:44.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:51:44.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:51:44.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:51:44.327 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:51:44.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:51:20
2026-05-28T23:51:44.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70337, datetime.datetime(2026, 5, 28, 23, 51, 20), datetime.datetime(2026, 5, 28, 23, 51, 20), 'salt', 6.88, 77.06, None, 11.47, 126.7, 3.73, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:51:44.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:51:44.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:51:44.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:20, diff=24.390047s, valid=True
2026-05-28T23:51:44.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:51:44.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:51:44.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:12, diff=32.392921s, valid=True
2026-05-28T23:51:44.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:51:44.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:13, diff=31.399576s, valid=True
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:51:44.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:51:44.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:51:44.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:12, diff=32.40258s, valid=True
2026-05-28T23:51:44.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:51:44.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:51:44.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:51:44.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937746.403245s, valid=True
2026-05-28T23:51:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:51:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:51:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:51:44.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:51:44.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:51:44.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:51:44.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:51:44.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:51:44.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:51:44.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:51:44.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:51:44.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:51:44.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:51:44.732 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:51:44.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:51:45.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:51:45.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:51:45.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:51:45.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-28T23:51:45.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-28T23:51:45.498 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:51:45.498 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:52:15.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:52:15.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:52:15.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:52:15.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:52:15.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:52:16.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:52:16.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-28T23:52:16.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:52:16.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:52:16.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:52:16.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:52:16.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:52:16.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:52:18.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-28T23:52:18.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:52:18.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:52:18.567 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:52:18.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:52:18.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:52:18.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23: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-28T23:52:18.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:52:18.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:52:18.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:52:18.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:52:18.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:52:18.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:52:18.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:52:18.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:52:18.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:52:18.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:52:18.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:52:18.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:52:18.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:52:18.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:52:18.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:52:18.843 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:52:18.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:51:50
2026-05-28T23:52:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70338, datetime.datetime(2026, 5, 28, 23, 51, 50), datetime.datetime(2026, 5, 28, 23, 51, 50), 'salt', 6.85, 76.96, None, 11.08, 127.69, 3.75, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:52:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:52:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:52:18.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:50, diff=28.907126s, valid=True
2026-05-28T23:52:18.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:52:18.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:52:18.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:52:12, diff=6.910492s, valid=True
2026-05-28T23:52:18.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:52:18.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:51:43, diff=35.91707s, valid=True
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:52:18.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:52:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:52:12, diff=6.920066s, valid=True
2026-05-28T23:52:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:52:18.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:52:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:52:18.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937780.920722s, valid=True
2026-05-28T23:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:52:18.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:52:18.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:52:18.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:52:18.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:52:19.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:52:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:52:19.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:52:19.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:52:19.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:52:19.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:52:19.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:52:19.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:52:20.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:52:20.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:52:20.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-28T23:52:20.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-28T23:52:20.229 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:52:20.229 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:52:50.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:52:50.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:52:50.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:52:50.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:52:50.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:52:51.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:52:51.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-28T23:52:51.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:52:51.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-28T23:52:51.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:52:51.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:52:51.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:52:51.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-28T23:52:53.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-28T23:52:53.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:52:53.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:52:53.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:52:53.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:52:53.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:52:53.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:52:53.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:52:53.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:52:53.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:52:53.663 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:52:53.663 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:52:53.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:52:53.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:52:53.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:52:53.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:52:53.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:52:53.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:52:53.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:52:53.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:52:53.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:52:53.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:52:53.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:52:53.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:52:53.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:52:51
2026-05-28T23:52:53.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70340, datetime.datetime(2026, 5, 28, 23, 52, 51), datetime.datetime(2026, 5, 28, 23, 52, 50), 'salt', 6.82, 77.1, None, 11.26, 126.75, 3.73, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:52:53.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:52:53.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:52:53.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:52:50, diff=3.981372s, valid=True
2026-05-28T23:52:53.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:52:53.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:52:53.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:12, diff=-18.015768s, valid=True
2026-05-28T23:52:53.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:52:53.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:52:53.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:52:46, diff=7.990913s, valid=True
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:52:53.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:52:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:12, diff=-18.005992s, valid=True
2026-05-28T23:52:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:52:53.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:52:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:52:53.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937815.994677s, valid=True
2026-05-28T23:52:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:52:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:52:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:52:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:52:53.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:52:54.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:52:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:52:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:52:54.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:52:54.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:52:54.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:52:54.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:52:54.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:52:54.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:52:54.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:52:54.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:52:54.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:52:54.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:52:54.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-28T23:52:54.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-28T23:52:55.137 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:52:55.137 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:53:25.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:53:25.151 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:53:25.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:53:25.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:53:25.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:53:25.649 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:53:25.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-28T23:53:25.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:53:25.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-28T23:53:25.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:53:25.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:53:25.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:53:25.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-28T23:53: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-28T23:53:28.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:53:28.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:53:28.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:53:28.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:53:28.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:53:28.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:53:28.041 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:53:28.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:53:28.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:53:28.041 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:53:28.041 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:53:28.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:53:28.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:53:28.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:53:28.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:53:28.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:53:28.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:53:28.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:53:28.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-28T23:53:28.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:53:28.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:53:28.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:53:28.302 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:53:28.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:53:21
2026-05-28T23:53:28.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70341, datetime.datetime(2026, 5, 28, 23, 53, 21), datetime.datetime(2026, 5, 28, 23, 53, 21), 'salt', 6.82, 77.13, None, 11.29, 123.51, 3.72, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:53:28.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:53:28.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:53:28.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:21, diff=7.366067s, valid=True
2026-05-28T23:53:28.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:53:28.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:53:28.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:12, diff=16.368866s, valid=True
2026-05-28T23:53:28.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:53:28.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:17, diff=11.375483s, valid=True
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:53:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-28T23:53:28.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:12, diff=16.378468s, valid=True
2026-05-28T23:53:28.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:53:28.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:53:28.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:53:28.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937850.379133s, valid=True
2026-05-28T23:53:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:53:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:53:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:53:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:53:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:53:28.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:53:28.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:53:28.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:53:28.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:53:28.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:53:28.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:53:28.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:53:28.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:53:28.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:53:28.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:53:29.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:53:29.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:53:29.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:53:29.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-28T23:53:29.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-28T23:53:29.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:53:29.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:53:59.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:53:59.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:53:59.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:54:00.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:54:00.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:54:00.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:54:00.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-28T23:54:00.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:54:00.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-28T23:54:00.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:54:00.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:54:00.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:54: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-28T23:54:02.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-28T23:54:02.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:54:02.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:54:02.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:54:02.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:54:02.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:54:02.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:54:02.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:54:02.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:54:02.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:54:02.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:54:02.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:54:02.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:54:02.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:54:02.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:54:03.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:54:03.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:54:03.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:54:03.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:54:03.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:54:03.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:54:03.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:54:03.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:54:03.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:54:03.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:53:51
2026-05-28T23:54:03.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70342, datetime.datetime(2026, 5, 28, 23, 53, 51), datetime.datetime(2026, 5, 28, 23, 53, 51), 'salt', 6.78, 77.3, None, 11.15, 131.42, 3.68, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:54:03.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:54:03.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:54:03.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:51, diff=12.201448s, valid=True
2026-05-28T23:54:03.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:54:03.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:54:03.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:12, diff=-8.795363s, valid=True
2026-05-28T23:54:03.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:54:03.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:53:49, diff=14.212055s, valid=True
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:54:03.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:54:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:12, diff=-8.784636s, valid=True
2026-05-28T23:54:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:54:03.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:54:03.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:54:03.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937885.216104s, valid=True
2026-05-28T23:54:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:54:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:54:03.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:54:03.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:54:03.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:54:03.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:54:03.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:54:03.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:54:03.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:54:03.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:54:03.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:54:03.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:54:03.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:54:03.560 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:54:03.785 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:54:04.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:54:04.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:54:04.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:54:04.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-28T23:54:04.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-28T23:54:04.458 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:54:04.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:54:34.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:54:34.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:54:34.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:54:35.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:54:35.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:54:35.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:54:35.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-28T23:54:35.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:54:35.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-28T23:54:35.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:54:35.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:54:35.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:54:35.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-28T23:54:37.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-28T23:54:37.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:54:37.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:54:37.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:54:37.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:54:37.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:54:37.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:54:37.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:54:37.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:54:37.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:54:37.743 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:54:37.743 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:54:37.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:54:37.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:54:37.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:54:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:54:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:54:37.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:54:37.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:54:37.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-28T23:54:37.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:54:37.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:54:37.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:54:37.994 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:54:38.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:54:22
2026-05-28T23:54:38.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70343, datetime.datetime(2026, 5, 28, 23, 54, 22), datetime.datetime(2026, 5, 28, 23, 54, 21), 'salt', 6.72, 77.26, None, 11.65, 134.85, 3.69, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:54:38.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:54:38.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:54:38.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:21, diff=17.056581s, valid=True
2026-05-28T23:54:38.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:54:38.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:54:38.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:12, diff=26.059399s, valid=True
2026-05-28T23:54:38.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:54:38.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:20, diff=18.065985s, valid=True
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:54:38.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-28T23:54:38.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:12, diff=26.068974s, valid=True
2026-05-28T23:54:38.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:54:38.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:54:38.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:54:38.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937920.069627s, valid=True
2026-05-28T23:54:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:54:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:54:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:54:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:54:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:54:38.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:54:38.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:54:38.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:54:38.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:54:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:54:38.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:54:38.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:54:38.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:54:38.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:54:38.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:54:38.987 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:54:39.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:54:39.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:54:39.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-28T23:54:39.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-28T23:54:39.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:54:39.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:55:09.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:55:09.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:55:09.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:55:09.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:55:09.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:55:09.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:55:09.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-28T23:55:09.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:55:09.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-28T23:55:09.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:55:09.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:55:09.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:55:09.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-28T23:55:12.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-28T23:55:12.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:55:12.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:55:12.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:55:12.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:55:12.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:55:12.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:55:12.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:55:12.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:55:12.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:55:12.289 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:55:12.289 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:55:12.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:55:12.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-28T23:55:12.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:55:12.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-28T23:55:12.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:55:12.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:55:12.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:55:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:55:12.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:55:12.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:55:12.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:55:12.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:55:12.612 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:54:52
2026-05-28T23:55:12.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70344, datetime.datetime(2026, 5, 28, 23, 54, 52), datetime.datetime(2026, 5, 28, 23, 54, 51), 'salt', 6.78, 77.63, None, 11.4, 132.62, 3.62, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:55:12.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:55:12.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-28T23:55:12.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:51, diff=21.61874s, valid=True
2026-05-28T23:55:12.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:55:12.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:55:12.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:12, diff=0.621606s, valid=True
2026-05-28T23:55:12.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:55:12.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:54:52, diff=20.628181s, valid=True
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:55:12.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:55:12.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:12, diff=0.631159s, valid=True
2026-05-28T23:55:12.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:55:12.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:55:12.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:55:12.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937954.63183s, valid=True
2026-05-28T23:55:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:55:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:55:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:55:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:55:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:55:12.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:55:12.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:55:12.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:55:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:55:12.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:55:12.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:55:12.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:55:12.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:55:12.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:55:13.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:55:13.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:55:13.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:55:13.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:55:13.707 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:55:13.707 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:55:13.857 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:55:13.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:55:43.887 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:55:43.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:55:43.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:55:44.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:55:44.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:55:44.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:55:44.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-28T23:55:44.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:55:44.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-28T23:55:44.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:55:44.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:55:44.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:55:44.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-28T23:55:47.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-28T23:55:47.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:55:47.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:55:47.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:55:47.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:55:47.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:55:47.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:55:47.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:55:47.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:55:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:55:47.736 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:55:47.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:55:47.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:55:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:55:47.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:55:47.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:55:47.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:55:47.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:55:47.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:55:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-28T23:55:47.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:55:47.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:55:47.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:55:47.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:55:48.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:55:22
2026-05-28T23:55:48.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70345, datetime.datetime(2026, 5, 28, 23, 55, 22), datetime.datetime(2026, 5, 28, 23, 55, 22), 'salt', 6.72, 77.66, None, 11.61, 133.04, 3.62, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:55:48.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:55:48.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:55:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:22, diff=26.071068s, valid=True
2026-05-28T23:55:48.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:55:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:55:48.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:12, diff=36.073933s, valid=True
2026-05-28T23:55:48.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:55:48.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:55:48.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:15, diff=33.080587s, valid=True
2026-05-28T23:55:48.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:55:48.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:55:48.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:55:48.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:55:48.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:55:48.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-28T23:55:48.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:12, diff=36.083733s, valid=True
2026-05-28T23:55:48.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:55:48.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:55:48.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:55:48.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=937990.0844s, valid=True
2026-05-28T23:55:48.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:55:48.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:55:48.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:55:48.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:55:48.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:55:48.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:55:48.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:55:48.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:55:48.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:55:48.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:55:48.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:55:48.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:55:48.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:55:48.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:55:48.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:55:48.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:55:49.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:55:49.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:55:49.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-28T23:55:49.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-28T23:55:49.182 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:55:49.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:56:19.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:56:19.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:56:19.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:56:19.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:56:19.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:56:19.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:56:19.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-28T23:56:19.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:56:19.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-28T23:56:19.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:56:19.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:56:19.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:56:19.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-28T23:56:22.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-28T23:56:22.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:56:22.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:56:22.209 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:56:22.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:56:22.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:56:22.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:56:22.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:56:22.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:56:22.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:56:22.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:56:22.230 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:56:22.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:56:22.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:56:22.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:56:22.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:56:22.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:56:22.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:56:22.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:56:22.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:56:22.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:56:22.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:56:22.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:56:22.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:56:22.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:55:52
2026-05-28T23:56:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70346, datetime.datetime(2026, 5, 28, 23, 55, 52), datetime.datetime(2026, 5, 28, 23, 55, 52), 'salt', 6.69, 77.96, None, 11.12, 133.0, 3.57, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:56:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:56:22.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:56:22.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:52, diff=30.544412s, valid=True
2026-05-28T23:56:22.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:56:22.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:56:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:56:12, diff=10.547268s, valid=True
2026-05-28T23:56:22.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:56:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:56:22.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:55:46, diff=36.553845s, valid=True
2026-05-28T23:56:22.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:56:22.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:56:22.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:56:22.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:56:22.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:56:22.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:56:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:56:12, diff=10.55688s, valid=True
2026-05-28T23:56:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:56:22.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:56:22.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:56:22.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938024.557542s, valid=True
2026-05-28T23:56:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:56:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:56:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:56:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:56:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:56:22.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:56:22.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:56:22.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:56:22.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:56:22.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:56:22.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:56:22.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:56:22.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:56:22.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:56:23.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:56:23.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:56:23.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:56:23.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:56:23.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-28T23:56:23.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-28T23:56:23.812 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:56:23.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:56:53.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:56:53.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:56:53.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:56:54.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:56:54.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:56:54.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:56:54.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-28T23:56:54.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:56:54.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-28T23:56:54.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:56:54.525 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:56:54.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:56:54.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-28T23:56:56.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-28T23:56:56.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:56:56.931 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:56:56.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:56:56.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:56:56.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:56:56.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:56:56.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:56:56.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:56:56.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:56:56.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:56:56.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:56:56.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:56:57.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:56:57.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:56:57.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:56:57.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:56:57.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:56:57.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:56:57.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:56:57.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:56:57.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:56:57.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:56:57.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:56:57.258 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:56:53
2026-05-28T23:56:57.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70348, datetime.datetime(2026, 5, 28, 23, 56, 53), datetime.datetime(2026, 5, 28, 23, 56, 52), 'salt', 6.72, 77.86, None, 11.61, 134.38, 3.59, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:56:57.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:56:57.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:56:57.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:56:52, diff=5.264562s, valid=True
2026-05-28T23:56:57.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:56:57.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:56:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:12, diff=-14.73263s, valid=True
2026-05-28T23:56:57.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:56:57.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:56:57.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:56:47, diff=10.273919s, valid=True
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:56:57.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:56:57.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:12, diff=-14.723053s, valid=True
2026-05-28T23:56:57.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:56:57.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:56:57.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:56:57.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938059.2776s, valid=True
2026-05-28T23:56:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:56:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:56:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:56:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:56:57.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:56:57.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:56:57.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:56:57.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:56:57.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:56:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:56:57.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:56:57.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:56:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:56:57.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:56:57.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:56:58.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:56:58.268 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:56:58.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:56:58.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-28T23:56:58.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-28T23:56:58.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:56:58.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:57:28.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:57:28.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:57:28.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:57:28.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:57:28.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:57:29.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:57: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-28T23:57:29.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:57:29.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-28T23:57:29.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:57:29.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:57:29.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:57:29.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-28T23:57:31.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:57:31.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:57:31.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:57:31.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:57:31.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:57:31.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:57:31.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:57:31.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:57:31.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:57:31.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:57:31.502 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:57:31.502 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:57:31.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:57:31.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:57:31.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:57:31.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:57:31.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:57:31.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:57:31.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:57:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:57:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:57:31.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:57:31.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:57:31.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:57:31.825 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:57:23
2026-05-28T23:57:31.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70349, datetime.datetime(2026, 5, 28, 23, 57, 23), datetime.datetime(2026, 5, 28, 23, 57, 22), 'salt', 6.69, 77.83, None, 11.19, 134.05, 3.59, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:57:31.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:57:31.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:57:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:22, diff=9.831323s, valid=True
2026-05-28T23:57:31.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:57:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:57:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:12, diff=19.834199s, valid=True
2026-05-28T23:57:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:57:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:57:31.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:19, diff=12.840762s, valid=True
2026-05-28T23:57:31.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:57:31.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:57:31.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:57:31.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:57:31.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:57:31.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:57:31.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:12, diff=19.843812s, valid=True
2026-05-28T23:57:31.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:57:31.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:57:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:57:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938093.844469s, valid=True
2026-05-28T23:57:31.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:57:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:57:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:57:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:57:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:57:31.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:57:31.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:57:31.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:57:31.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:57:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:57:32.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:57:32.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:57:32.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:57:32.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:57:32.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:57:32.808 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:57:32.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:57:32.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:57:32.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:57:32.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-28T23:57:33.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:57:33.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:58:03.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:58:03.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:58:03.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:58:03.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:58:03.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:58:03.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:58:03.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-28T23:58:03.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:58:03.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-28T23:58:03.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:58:03.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:58:03.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:58:03.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-28T23:58:05.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-28T23:58:05.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:58:05.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:58:05.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:58:05.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:58:05.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:58:06.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:58:06.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:58:06.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:58:06.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:58:06.011 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:58:06.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:58:06.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:58:06.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:58:06.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:58:06.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:58:06.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:58:06.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:58:06.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:58:06.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:58:06.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:58:06.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:58:06.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:58:06.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:58:06.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:57:54
2026-05-28T23:58:06.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70350, datetime.datetime(2026, 5, 28, 23, 57, 54), datetime.datetime(2026, 5, 28, 23, 57, 53), 'salt', 6.69, 77.46, None, 11.33, 125.79, 3.66, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:58:06.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:58:06.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:58:06.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:53, diff=13.331198s, valid=True
2026-05-28T23:58:06.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:58:06.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:58:06.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:12, diff=-5.665919s, valid=True
2026-05-28T23:58:06.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:58:06.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:58:06.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:57:50, diff=16.340764s, valid=True
2026-05-28T23:58:06.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:58:06.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:58:06.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:58:06.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:58:06.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:58:06.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:58:06.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:12, diff=-5.65619s, valid=True
2026-05-28T23:58:06.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:58:06.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:58:06.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:58:06.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938128.344463s, valid=True
2026-05-28T23:58:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:58:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:58:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:58:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:58:06.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:58:06.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:58:06.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:58:06.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:58:06.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:58:06.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:58:06.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:58:06.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:58:06.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:58:06.665 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:58:06.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:58:07.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:58:07.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:58:07.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:58:07.320 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-28T23:58:07.320 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-28T23:58:07.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:58:07.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:58:37.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:58:37.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:58:37.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:58:37.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:58:37.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:58:37.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:58:37.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:58:38.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:58:38.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-28T23:58:38.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:58:38.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:58:38.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:58:38.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-28T23:58:40.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-28T23:58:40.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:58:40.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:58:40.380 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:58:40.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:58:40.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:58:40.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:58:40.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:58:40.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:58:40.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:58:40.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:58:40.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:58:40.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:58:40.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:58:40.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:58:40.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:58:40.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:58:40.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:58:40.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:58:40.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:58:40.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:58:40.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:58:40.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:58:40.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:58:40.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:58:24
2026-05-28T23:58:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70351, datetime.datetime(2026, 5, 28, 23, 58, 24), datetime.datetime(2026, 5, 28, 23, 58, 24), 'salt', 6.69, 77.43, None, 10.41, 125.3, 3.67, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:58:40.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:58:40.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:58:40.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:24, diff=16.733188s, valid=True
2026-05-28T23:58:40.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:58:40.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:58:40.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:12, diff=28.736093s, valid=True
2026-05-28T23:58:40.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:58:40.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:58:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:22, diff=18.742755s, valid=True
2026-05-28T23:58:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:58:40.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:58:40.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:58:40.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:58:40.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:58:40.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:58:40.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:12, diff=28.745857s, valid=True
2026-05-28T23:58:40.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:58:40.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:58:40.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:58:40.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938162.74651s, valid=True
2026-05-28T23:58:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:58:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:58:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:58:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:58:40.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:58:40.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:58:40.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:58:40.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:58:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:58:40.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:58:41.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:58:41.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:58:41.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:58:41.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:58:41.371 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:58:41.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:58:41.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:58:41.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:58:41.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-28T23:58:41.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-28T23:58:41.919 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:58:41.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:59:11.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:59:11.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:59:11.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:59:12.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:59:12.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:59:12.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:59:12.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-28T23:59:12.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:59:12.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-28T23:59:12.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:59:12.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:59:12.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:59:12.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-28T23:59:14.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-28T23:59:14.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:59:14.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:59:14.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:59:14.802 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:59:14.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:59:14.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:59:14.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:59:14.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:59:14.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:59:14.824 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:59:14.824 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:59:14.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:59:14.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:59:14.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:59:15.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:59:15.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:59:15.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:59:15.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:59:15.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:59:15.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:59:15.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:59:15.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:59:15.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:59:15.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:58:55
2026-05-28T23:59:15.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70352, datetime.datetime(2026, 5, 28, 23, 58, 55), datetime.datetime(2026, 5, 28, 23, 58, 54), 'salt', 6.72, 77.43, None, 10.94, 127.06, 3.66, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:59:15.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:59:15.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:59:15.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:54, diff=21.152752s, valid=True
2026-05-28T23:59:15.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:59:15.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:59:15.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:12, diff=3.155782s, valid=True
2026-05-28T23:59:15.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:59:15.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:58:54, diff=21.162559s, valid=True
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:59:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:59:15.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:59:15.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:12, diff=3.165615s, valid=True
2026-05-28T23:59:15.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:59:15.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:59:15.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:59:15.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938197.166289s, valid=True
2026-05-28T23:59:15.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:59:15.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:59:15.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:59:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:59:15.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:59:15.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:59:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:59:15.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:59:15.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:59:15.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:59:15.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:59:15.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:59:15.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:59:15.491 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:59:15.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:59:16.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:59:16.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:59:16.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:59:16.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-28T23:59:16.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-28T23:59:16.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:59:16.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-28T23:59:46.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-28T23:59:46.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-28T23:59:46.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-28T23:59:46.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-28T23:59:46.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-28T23:59:46.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-28T23:59:46.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-28T23:59:46.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-28T23:59:46.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-28T23:59:46.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-28T23:59:46.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-28T23:59:46.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-28T23:59:46.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-28T23:59:49.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-28T23:59:49.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-28T23:59:49.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-28T23:59:49.159 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-28T23:59:49.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-28T23:59:49.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-28T23:59:49.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-28T23:59:49.178 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-28T23:59:49.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-28T23:59:49.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-28T23:59:49.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-28T23:59:49.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-28T23:59:49.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-28T23:59:49.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-28T23:59:49.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-28T23:59:49.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-28T23:59:49.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:59:49.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:59:49.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-28T23:59:49.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-28T23:59:49.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-28T23:59:49.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-28T23:59:49.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-28T23:59:49.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-28T23:59:49.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:59:25
2026-05-28T23:59:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70353, datetime.datetime(2026, 5, 28, 23, 59, 25), datetime.datetime(2026, 5, 28, 23, 59, 24), 'salt', 6.59, 77.49, None, 9.99, 126.47, 3.65, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-28T23:59:49.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-28T23:59:49.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-28T23:59:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:24, diff=25.508455s, valid=True
2026-05-28T23:59:49.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-28T23:59:49.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:59:49.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:12, diff=37.511307s, valid=True
2026-05-28T23:59:49.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-28T23:59:49.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:17, diff=32.51801s, valid=True
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-28T23:59:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-28T23:59:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:12, diff=37.521048s, valid=True
2026-05-28T23:59:49.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-28T23:59:49.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-28T23:59:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-28T23:59:49.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938231.521841s, valid=True
2026-05-28T23:59:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-28T23:59:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-28T23:59:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-28T23:59:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-28T23:59:49.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-28T23:59:49.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-28T23:59:49.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-28T23:59:49.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-28T23:59:49.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-28T23:59:49.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-28T23:59:49.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-28T23:59:49.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-28T23:59:49.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-28T23:59:49.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-28T23:59:50.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:59:50.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-28T23:59:50.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-28T23:59:50.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-28T23:59:50.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-28T23:59:50.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-28T23:59:50.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-28T23:59:50.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:00:20.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:00:20.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:00:20.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:00:21.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:00:21.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:00:21.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:00:21.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-29T00:00:21.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:00:21.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-29T00:00:21.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:00:21.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:00:21.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:00:21.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:00:25.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-29T00:00:25.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:00:25.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:00:25.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:00:25.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:00:25.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:00:25.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:00:25.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:00:25.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:00:25.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:00:25.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:00:25.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:00:25.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:00:25.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:00:25.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:00:25.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:00:25.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:00:25.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:00:25.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:00:25.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:00:25.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:00:25.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:00:25.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:00:25.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:00:25.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-28 23:59:55
2026-05-29T00:00:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70354, datetime.datetime(2026, 5, 28, 23, 59, 55), datetime.datetime(2026, 5, 28, 23, 59, 55), 'salt', 6.78, 77.3, None, 10.16, 136.0, 3.68, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:00:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:00:25.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:00:25.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:55, diff=30.497185s, valid=True
2026-05-29T00:00:25.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:00:25.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:00:25.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:00:12, diff=13.500106s, valid=True
2026-05-29T00:00:25.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:00:25.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:00:25.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-28 23:59:47, diff=38.506688s, valid=True
2026-05-29T00:00:25.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:00:25.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:00:25.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:00:25.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:00:25.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:00:25.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:00:25.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:00:12, diff=13.509714s, valid=True
2026-05-29T00:00:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:00:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:00:25.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:00:25.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938267.510362s, valid=True
2026-05-29T00:00:25.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:00:25.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:00:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:00:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:00:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:00:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:00:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:00:25.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:00:25.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:00:25.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:00:25.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:00:25.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:00:25.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:00:25.839 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:00:26.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:00:26.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:00:26.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:00:26.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:00:26.532 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:00:26.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:00:26.797 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:00:26.797 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:00:56.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:00:56.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:00:56.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:00:57.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:00:57.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:00:57.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:00:57.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-29T00:00:57.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:00:57.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-29T00:00:57.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:00:57.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:00:57.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:00:57.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-29T00:01:00.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-29T00:01:00.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:01:00.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:01:00.498 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:01:00.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:01:00.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:01:00.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:01:00.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:01:00.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:01:00.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:01:00.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:01:00.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:01:00.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:01:00.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:01:00.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:01:00.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:01:00.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:01:00.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:01:00.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:01:00.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:01:00.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:01:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:01:00.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:01:00.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:01:00.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:00:56
2026-05-29T00:01:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70356, datetime.datetime(2026, 5, 29, 0, 0, 56), datetime.datetime(2026, 5, 29, 0, 0, 55), 'salt', 6.85, 77.3, None, 11.29, 127.81, 3.69, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:01:00.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:01:00.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:01:00.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:00:55, diff=5.846931s, valid=True
2026-05-29T00:01:00.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:01:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:01:00.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:12, diff=-11.150253s, valid=True
2026-05-29T00:01:00.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:01:00.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:00:49, diff=11.856204s, valid=True
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:01:00.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:01:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:12, diff=-11.140805s, valid=True
2026-05-29T00:01:00.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:01:00.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:01:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:01:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938302.859841s, valid=True
2026-05-29T00:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:01:00.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:01:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:01:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:01:00.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:01:00.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:01:01.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:01:01.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:01:01.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:01:01.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:01:01.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:01:01.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:01:01.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:01:01.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:01:01.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-29T00:01:01.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-29T00:01:02.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:01:02.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:01:32.101 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:01:32.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:01:32.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:01:32.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:01:32.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:01:33.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:01:33.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-29T00:01:33.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:01:33.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-29T00:01:33.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:01:33.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:01:33.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:01:33.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-29T00:01:35.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-29T00:01:35.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:01:35.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:01:35.382 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:01:35.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:01:35.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:01:35.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:01:35.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:01:35.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:01:35.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:01:35.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:01:35.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:01:35.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:01:35.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:01:35.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:01:35.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:01:35.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:01:35.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:01:35.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:01:35.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:01:35.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:01:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:01:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:01:35.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:01:35.724 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:01:26
2026-05-29T00:01:35.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70357, datetime.datetime(2026, 5, 29, 0, 1, 26), datetime.datetime(2026, 5, 29, 0, 1, 25), 'salt', 6.72, 77.36, None, 11.33, 124.52, 3.68, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:01:35.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:01:35.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:01:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:25, diff=10.732207s, valid=True
2026-05-29T00:01:35.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:01:35.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:01:35.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:12, diff=23.735286s, valid=True
2026-05-29T00:01:35.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:01:35.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:20, diff=15.742392s, valid=True
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:01:35.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:01:35.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:12, diff=23.74566s, valid=True
2026-05-29T00:01:35.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:01:35.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:01:35.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:01:35.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938337.746579s, valid=True
2026-05-29T00:01:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:01:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:01:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:01:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:01:35.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:01:35.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:01:35.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:01:35.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:01:35.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:01:35.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:01:35.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:01:35.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:01:36.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:01:36.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:01:36.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:01:36.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:01:36.820 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:01:36.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:01:36.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-29T00:01:36.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-29T00:01:36.970 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:01:36.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:02:07.000 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:02:07.000 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:02:07.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:02:07.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:02:07.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:02:07.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:02:07.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-29T00:02:07.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:02:07.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-29T00:02:07.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:02:07.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:02:07.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:02:07.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-29T00:02:10.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-29T00:02:10.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:02:10.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:02:10.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:02:10.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:02:10.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:02:10.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:02:10.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:02:10.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:02:10.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:02:10.698 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:02:10.698 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:02:10.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:02:10.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:02:10.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:02:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:02:10.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:02:10.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:02:10.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:02:10.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:02:10.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:02:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:02:10.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:02:10.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:02:11.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:01:56
2026-05-29T00:02:11.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70358, datetime.datetime(2026, 5, 29, 0, 1, 56), datetime.datetime(2026, 5, 29, 0, 1, 56), 'salt', 6.78, 77.66, None, 10.91, 138.16, 3.62, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:02:11.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:02:11.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:02:11.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:56, diff=15.030581s, valid=True
2026-05-29T00:02:11.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:02:11.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:02:11.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:12, diff=-0.966559s, valid=True
2026-05-29T00:02:11.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:02:11.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:01:52, diff=19.040119s, valid=True
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:02:11.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:02:11.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:12, diff=-0.956853s, valid=True
2026-05-29T00:02:11.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:02:11.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:02:11.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:02:11.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938373.043835s, valid=True
2026-05-29T00:02:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:02:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:02:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:02:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:02:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:02:11.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:02:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:02:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:02:11.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:02:11.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:02:11.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:02:11.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:02:11.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:02:11.369 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:02:11.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:02:11.943 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:02:12.047 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:02:12.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:02:12.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-29T00:02:12.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-29T00:02:12.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:02:12.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:02:42.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:02:42.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:02:42.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:02:42.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:02:42.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:02:42.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:02:42.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-29T00:02:42.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:02:42.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-29T00:02:42.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:02:42.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:02:42.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:02:42.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-29T00:02:45.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:02:45.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:02:45.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:02:45.949 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:02:45.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:02:45.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:02:45.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:02:45.968 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:02:45.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:02:45.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:02:45.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:02:45.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:02:45.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:02:46.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:02:46.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:02:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:02:46.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:02:46.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:02:46.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:02:46.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:02:46.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:02:46.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:02:46.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:02:46.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:02:46.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:02:29
2026-05-29T00:02:46.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70359, datetime.datetime(2026, 5, 29, 0, 2, 29), datetime.datetime(2026, 5, 29, 0, 2, 26), 'salt', 6.62, 77.76, None, 10.69, 147.95, 3.6, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:02:46.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:02:46.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:02:46.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:26, diff=20.293268s, valid=True
2026-05-29T00:02:46.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:02:46.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:02:46.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:12, diff=34.296136s, valid=True
2026-05-29T00:02:46.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:02:46.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:02:46.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:23, diff=23.3027s, valid=True
2026-05-29T00:02:46.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:02:46.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:02:46.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:02:46.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:02:46.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:02:46.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:02:46.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:12, diff=34.305764s, valid=True
2026-05-29T00:02:46.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:02:46.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:02:46.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:02:46.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938408.306422s, valid=True
2026-05-29T00:02:46.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:02:46.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:02:46.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:02:46.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:02:46.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:02:46.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:02:46.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:02:46.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:02:46.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:02:46.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:02:46.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:02:46.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:02:46.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:02:46.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:02:46.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:02:47.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:02:47.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:02:47.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:02:47.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-29T00:02:47.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-29T00:02:47.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:02:47.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:03:17.460 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:03:17.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:03:17.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:03:17.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:03:17.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:03:18.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:03:18.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:03:18.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:03:18.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-29T00:03:18.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:03:18.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:03:18.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:03:18.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-29T00:03:20.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-29T00:03:20.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:03:20.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:03:20.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:03:20.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:03:20.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:03:20.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:03:20.641 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:03:20.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:03:20.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:03:20.641 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:03:20.641 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:03:20.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:03:20.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:03:20.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:03:20.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:03:20.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:03:20.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:03:20.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:03:20.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:03:20.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:03:20.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:03:20.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:03:20.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:03:20.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:02:59
2026-05-29T00:03:20.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70360, datetime.datetime(2026, 5, 29, 0, 2, 59), datetime.datetime(2026, 5, 29, 0, 2, 59), 'salt', 6.82, 78.32, None, 11.79, 140.44, 3.5, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:03:20.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:03:20.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:03:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:59, diff=21.954211s, valid=True
2026-05-29T00:03:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:03:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:03:20.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:12, diff=8.957089s, valid=True
2026-05-29T00:03:20.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:03:20.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:03:20.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:02:54, diff=26.963704s, valid=True
2026-05-29T00:03:20.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:03:20.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:03:20.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:03:20.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:03:20.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:03:20.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:03:20.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:12, diff=8.966759s, valid=True
2026-05-29T00:03:20.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:03:20.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:03:20.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:03:20.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938442.96741s, valid=True
2026-05-29T00:03:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:03:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:03:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:03:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:03:20.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:03:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:03:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:03:21.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:03:21.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:03:21.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:03:21.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:03:21.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:03:21.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:03:21.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:03:21.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:03:21.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:03:21.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:03:21.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:03:21.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-29T00:03:21.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-29T00:03:22.023 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:03:22.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:03:52.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:03:52.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:03:52.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:03:52.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:03:52.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:03:52.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:03:52.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-29T00:03:52.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:03:52.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-29T00:03:52.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:03:52.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:03:52.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:03:52.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-29T00:03:54.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-29T00:03:54.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:03:54.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:03:54.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:03:54.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:03:54.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:03:54.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:03:54.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:03:54.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:03:54.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:03:54.820 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:03:54.820 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:03:54.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:03:54.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:03:54.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:03:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:03:54.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:03:55.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:03:55.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:03:55.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:03:55.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:03:55.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:03:55.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:03:55.069 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:03:55.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:03:29
2026-05-29T00:03:55.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70361, datetime.datetime(2026, 5, 29, 0, 3, 29), datetime.datetime(2026, 5, 29, 0, 3, 29), 'salt', 6.92, 78.92, None, 11.54, 138.94, 3.4, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:03:55.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:03:55.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:03:55.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:29, diff=26.133938s, valid=True
2026-05-29T00:03:55.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:03:55.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:03:55.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:12, diff=43.136855s, valid=True
2026-05-29T00:03:55.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:03:55.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:26, diff=29.143504s, valid=True
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:03:55.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:03:55.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:03:12, diff=43.146491s, valid=True
2026-05-29T00:03:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:03:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:03:55.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:03:55.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938477.14715s, valid=True
2026-05-29T00:03:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:03:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:03:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:03:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:03:55.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:03:55.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:03:55.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:03:55.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:03:55.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:03:55.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:03:55.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:03:55.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:03:55.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:03:55.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:03:55.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:03:56.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:03:56.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:03:56.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:03: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-29T00:03: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-29T00:03:56.365 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:03:56.365 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:04:26.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:04:26.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:04:26.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:04:26.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:04:26.686 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:04:26.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:04:26.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-29T00:04:26.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:04:26.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-29T00:04:26.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:04:26.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:04:26.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:04:26.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-29T00:04:29.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-29T00:04:29.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:04:29.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:04:29.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:04:29.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:04:29.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:04:29.928 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:04:29.928 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:04:29.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:04:29.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:04:29.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:04:29.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:04:29.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:04:30.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:04:30.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:04:30.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:04:30.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:04:30.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:04:30.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:04:30.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:04:30.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:04:30.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:04:30.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:04:30.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:04:30.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:04:30
2026-05-29T00:04:30.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70363, datetime.datetime(2026, 5, 29, 0, 4, 30), datetime.datetime(2026, 5, 29, 0, 4, 29), 'salt', 7.02, 78.39, None, 10.98, 134.81, 3.5, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:04:30.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:04:30.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:04:30.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:29, diff=1.253869s, valid=True
2026-05-29T00:04:30.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:04:30.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:04:30.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:12, diff=18.256834s, valid=True
2026-05-29T00:04:30.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:04:30.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:29, diff=1.263467s, valid=True
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:04:30.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:04:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:12, diff=18.266599s, valid=True
2026-05-29T00:04:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:04:30.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:04:30.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:04:30.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938512.26728s, valid=True
2026-05-29T00:04:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:04:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:04:30.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:04:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:04:30.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:04:30.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:04:30.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:04:30.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:04:30.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:04:30.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:04:30.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:04:30.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:04:30.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:04:30.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:04:30.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:04:31.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:04:31.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:04:31.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:04:31.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-29T00:04:31.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-29T00:04:31.607 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:04:31.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:05:01.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:05:01.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:05:01.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:05:01.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:05:01.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:05:02.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:05:02.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-29T00:05:02.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:05:02.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-29T00:05:02.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:05:02.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:05:02.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:05:02.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-29T00:05:04.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-29T00:05:04.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:05:04.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:05:04.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:05:04.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:05:04.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:05:04.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:05:04.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:05:04.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:05:04.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:05:04.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:05:04.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:05:04.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:05:04.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:05:04.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:05:04.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:05:04.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:05:04.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:05:04.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:05:04.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:05:04.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:05:04.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:05:04.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:05:04.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:05:04.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:05:00
2026-05-29T00:05:04.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70364, datetime.datetime(2026, 5, 29, 0, 5), datetime.datetime(2026, 5, 29, 0, 4, 59), 'salt', 6.98, 78.19, None, 9.71, 123.86, 3.53, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:05:04.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:05:04.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:05:04.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:59, diff=5.806118s, valid=True
2026-05-29T00:05:04.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:05:04.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:05:04.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:12, diff=-7.191048s, valid=True
2026-05-29T00:05:04.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:05:04.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:04:50, diff=14.815585s, valid=True
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:05:04.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:05:04.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:05:04.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:12, diff=-7.181412s, valid=True
2026-05-29T00:05:04.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:05:04.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:05:04.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:05:04.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938546.819248s, valid=True
2026-05-29T00:05:04.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:05:04.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:05:04.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:05:04.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:05:04.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:05:04.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:05:04.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:05:04.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:05:04.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:05:04.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:05:05.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:05:05.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:05:05.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:05:05.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:05:05.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:05:05.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:05:05.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:05:05.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:05:05.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-29T00:05:05.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-29T00:05:06.065 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:05:06.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:05:36.095 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:05:36.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:05:36.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:05:36.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:05:36.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:05:36.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:05:36.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-29T00:05:36.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:05:36.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-29T00:05:36.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:05:36.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:05:36.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:05:36.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:05:39.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-29T00:05:39.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:05:39.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:05:39.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:05:39.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:05:39.188 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:05:39.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:05:39.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:05:39.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:05:39.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:05:39.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:05:39.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:05:39.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:05:39.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:05:39.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:05:39.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:05:39.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:05:39.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:05:39.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:05:39.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:05:39.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:05:39.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:05:39.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:05:39.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:05:39.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:05:30
2026-05-29T00:05:39.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70365, datetime.datetime(2026, 5, 29, 0, 5, 30), datetime.datetime(2026, 5, 29, 0, 5, 30), 'salt', 6.98, 77.89, None, 12.6, 136.19, 3.58, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:05:39.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:05:39.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:05:39.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:30, diff=9.531849s, valid=True
2026-05-29T00:05:39.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:05:39.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:05:39.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:12, diff=27.534753s, valid=True
2026-05-29T00:05:39.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:05:39.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:22, diff=17.541365s, valid=True
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:05:39.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:05:39.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:12, diff=27.54439s, valid=True
2026-05-29T00:05:39.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:05:39.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:05:39.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:05:39.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938581.545074s, valid=True
2026-05-29T00:05:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:05:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:05:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:05:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:05:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:05:39.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:05:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:05:39.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:05:39.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:05:39.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:05:39.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:05:39.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:05:39.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:05:39.901 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:05:40.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:05:40.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:05:40.656 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:05:40.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:05:40.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-29T00:05:40.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-29T00:05:40.906 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:05:40.906 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:06:10.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:06:10.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:06:10.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:06:11.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:06:11.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:06:11.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:06:11.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-29T00:06:11.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:06:11.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-29T00:06:11.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:06:11.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:06:11.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:06:11.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-29T00:06:15.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-29T00:06:15.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:06:15.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:06:15.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:06:15.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:06:15.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:06:15.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:06:15.099 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:06:15.099 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:06:15.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:06:15.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:06:15.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:06:15.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:06:15.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:06:15.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:06:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:06:15.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:06:15.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:06:15.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:06:15.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:06:15.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:06:15.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:06:15.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:06:15.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:06:15.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:06:00
2026-05-29T00:06:15.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70366, datetime.datetime(2026, 5, 29, 0, 6), datetime.datetime(2026, 5, 29, 0, 6), 'salt', 7.08, 77.83, None, 12.25, 132.41, 3.6, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:06:15.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:06:15.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:06:15.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:00, diff=15.416007s, valid=True
2026-05-29T00:06:15.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:06:15.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:06:15.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:12, diff=3.418868s, valid=True
2026-05-29T00:06:15.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:06:15.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:05:53, diff=22.425462s, valid=True
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:06:15.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:06:15.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:12, diff=3.428489s, valid=True
2026-05-29T00:06:15.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:06:15.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:06:15.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:06:15.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938617.429154s, valid=True
2026-05-29T00:06:15.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:06:15.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:06:15.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:06:15.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:06:15.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:06:15.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:06:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:06:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:06:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:06:15.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:06:15.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:06:15.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:06:15.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:06:15.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:06:16.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:06:16.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:06:16.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:06:16.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:06:16.500 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:06:16.500 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:06:16.581 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:06:16.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:06:46.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:06:46.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:06:46.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:06:47.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:06:47.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:06:47.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:06:47.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-29T00:06:47.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:06:47.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-29T00:06:47.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:06:47.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:06:47.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:06:47.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-29T00:06:50.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-29T00:06:50.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:06:50.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:06:50.496 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:06:50.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:06:50.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:06:50.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:06:50.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:06:50.517 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:06:50.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:06:50.517 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:06:50.517 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:06:50.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:06:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:06:50.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:06:50.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:06:50.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:06:50.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:06:50.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:06:50.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:06:50.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:06:50.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:06:50.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:06:50.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:06:50.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:06:31
2026-05-29T00:06:50.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70367, datetime.datetime(2026, 5, 29, 0, 6, 31), datetime.datetime(2026, 5, 29, 0, 6, 30), 'salt', 6.95, 77.83, None, 12.32, 133.09, 3.6, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:06:50.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:06:50.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:06:50.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:30, diff=20.883417s, valid=True
2026-05-29T00:06:50.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:06:50.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:06:50.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:12, diff=38.886313s, valid=True
2026-05-29T00:06:50.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:06:50.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:25, diff=25.893049s, valid=True
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:06:50.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:06:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:12, diff=38.896122s, valid=True
2026-05-29T00:06:50.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:06:50.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:06:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:06:50.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938652.896845s, valid=True
2026-05-29T00:06:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:06:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:06:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:06:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:06:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:06:50.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:06:50.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:06:50.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:06:50.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:06:51.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:06:51.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:06:51.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:06:51.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:06:51.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:06:51.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:06:51.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:06:51.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:06:51.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:06:51.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-29T00:06:51.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-29T00:06:51.966 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:06:51.966 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:07:21.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:07:21.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:07:21.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:07:22.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:07:22.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:07:22.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:07:22.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-29T00:07:22.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:07:22.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-29T00:07:22.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:07:22.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:07:22.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:07:22.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:07:25.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-29T00:07:25.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:07:25.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:07:25.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:07:25.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:07:25.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:07:25.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:07:25.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:07:25.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:07:25.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:07:25.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:07:25.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:07:25.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:07:25.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:07:25.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:07:25.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:07:25.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:07:25.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:07:25.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:07:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:07:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:07:25.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:07:25.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:07:25.314 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:07:25.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:07:01
2026-05-29T00:07:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70368, datetime.datetime(2026, 5, 29, 0, 7, 1), datetime.datetime(2026, 5, 29, 0, 7), 'salt', 6.88, 77.83, None, 12.28, 134.1, 3.59, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:07:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:07:25.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:07:25.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:00, diff=25.377465s, valid=True
2026-05-29T00:07:25.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:07:25.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:07:25.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:12, diff=13.380352s, valid=True
2026-05-29T00:07:25.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:07:25.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:07:25.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:06:56, diff=29.386951s, valid=True
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:07:25.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:07:25.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:12, diff=13.38994s, valid=True
2026-05-29T00:07:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:07:25.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:07:25.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:07:25.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938687.390588s, valid=True
2026-05-29T00:07:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:07:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:07:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:07:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:07:25.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:07:25.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:07:25.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:07:25.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:07:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:07:25.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:07:25.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:07:25.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:07:25.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:07:25.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:07:25.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:07:26.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:07:26.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:07:26.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:07:26.402 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:07:26.402 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:07:26.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:07:26.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:07:56.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:07:56.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:07:56.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:07:57.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:07:57.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:07:57.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:07:57.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-29T00:07:57.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:07:57.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:07:57.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:07:57.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:07:57.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:07:57.437 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:08:00.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-29T00:08:00.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:08:00.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:08:00.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:08:00.068 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:08:00.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:08:00.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:08:00.089 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:08:00.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:08:00.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:08:00.090 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:08:00.090 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:08:00.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:08:00.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:08:00.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:08:00.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:08:00.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:08:00.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:08:00.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:08:00.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:08:00.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:08:00.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:08:00.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:08:00.365 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:08:00.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:07:31
2026-05-29T00:08:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70369, datetime.datetime(2026, 5, 29, 0, 7, 31), datetime.datetime(2026, 5, 29, 0, 7, 31), 'salt', 6.82, 77.76, None, 12.21, 135.11, 3.61, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:08:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:08:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:08:00.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:31, diff=29.429081s, valid=True
2026-05-29T00:08:00.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:08:00.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:08:00.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:12, diff=48.432268s, valid=True
2026-05-29T00:08:00.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:08:00.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:28, diff=32.439503s, valid=True
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:08:00.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:08:00.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:08:00.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:07:12, diff=48.442935s, valid=True
2026-05-29T00:08:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:08:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:08:00.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:08:00.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938722.443699s, valid=True
2026-05-29T00:08:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:08:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:08:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:08:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:08:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:08:00.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:08:00.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:08:00.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:08:00.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:08:00.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:08:00.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:08:00.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:08:00.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:08:00.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:08:00.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:08:01.372 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:08:01.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:08:01.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:08:01.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-29T00:08:01.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-29T00:08:01.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:08:01.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:08:31.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:08:31.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:08:31.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:08:32.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:08:32.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:08:32.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:08:32.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-29T00:08:32.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:08:32.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-29T00:08:32.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:08:32.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:08:32.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:08: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-29T00:08:35.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-29T00:08:35.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:08:35.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:08:35.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:08:35.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:08:35.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:08:35.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:08:35.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:08:35.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:08:35.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:08:35.404 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:08:35.404 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:08:35.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:08:35.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:08:35.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:08:35.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:08:35.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:08:35.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:08:35.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:08:35.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:08:35.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:08:35.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:08:35.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:08:35.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:08:35.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:08:31
2026-05-29T00:08:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70371, datetime.datetime(2026, 5, 29, 0, 8, 31), datetime.datetime(2026, 5, 29, 0, 8, 31), 'salt', 6.78, 78.09, None, 11.93, 132.69, 3.54, 832.36, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:08:35.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:08:35.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:08:35.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:08:31, diff=4.747333s, valid=True
2026-05-29T00:08:35.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:08:35.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:08:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:08:12, diff=23.750222s, valid=True
2026-05-29T00:08:35.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:08:35.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:08:35.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:08:30, diff=5.756825s, valid=True
2026-05-29T00:08:35.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:08:35.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:08:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:08:35.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:08:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:08:35.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:08:35.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:08:12, diff=23.759847s, valid=True
2026-05-29T00:08:35.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:08:35.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:08:35.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:08:35.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938757.760495s, valid=True
2026-05-29T00:08:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:08:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:08:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:08:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:08:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:08:35.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:08:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:08:35.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:08:35.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:08:35.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:08:35.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:08:36.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:08:36.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:08:36.101 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:08:36.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:08:36.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:08:36.781 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:08:36.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:08:36.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-29T00:08:36.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-29T00:08:36.865 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:08:36.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:09:06.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:09:06.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:09:06.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:09:07.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:09:07.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:09:07.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:09:07.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-29T00:09:07.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:09:07.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-29T00:09:07.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:09:07.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:09:07.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:09:07.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:09:09.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-29T00:09:09.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:09:09.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:09:09.850 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:09:09.850 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:09:09.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:09:09.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:09:09.869 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:09:09.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:09:09.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:09:09.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:09:09.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:09:09.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:09:09.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:09:09.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:09:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:09:10.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:09:10.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:09:10.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:09:10.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:09:10.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:09:10.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:09:10.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:09:10.163 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:09:10.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:09:02
2026-05-29T00:09:10.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70372, datetime.datetime(2026, 5, 29, 0, 9, 2), datetime.datetime(2026, 5, 29, 0, 9, 1), 'salt', 6.78, 78.16, None, 12.28, 132.03, 3.53, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:09:10.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:09:10.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:09:10.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:01, diff=9.237285s, valid=True
2026-05-29T00:09:10.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:09:10.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:09:10.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=-1.759566s, valid=True
2026-05-29T00:09:10.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:09:10.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:09:10.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:08:52, diff=18.247786s, valid=True
2026-05-29T00:09:10.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:09:10.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:09:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:09:10.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:09:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:09:10.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:09:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=-1.748948s, valid=True
2026-05-29T00:09:10.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:09:10.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:09:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:09:10.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938792.251773s, valid=True
2026-05-29T00:09:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:09:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:09:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:09:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:09:10.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:09:10.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:09:10.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:09:10.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:09:10.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:09:10.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:09:10.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:09:10.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:09:10.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:09:10.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:09:10.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:09:11.203 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:09:11.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:09:11.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:09:11.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-29T00:09:11.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-29T00:09:11.391 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:09:11.391 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:09:41.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:09:41.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:09:41.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:09:41.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:09:41.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:09:41.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:09:41.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-29T00:09:41.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:09:41.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:09:41.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:09:41.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:09:41.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:09:41.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:09:44.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-29T00:09:44.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:09:44.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:09:44.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:09:44.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:09:44.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:09:44.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:09:44.334 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:09:44.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:09:44.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:09:44.335 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:09:44.335 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:09:44.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:09:44.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:09:44.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:09:44.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:09:44.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:09:44.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:09:44.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:09:44.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T00:09:44.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:09:44.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:09:44.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:09:44.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:09:44.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:09:32
2026-05-29T00:09:44.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70373, datetime.datetime(2026, 5, 29, 0, 9, 32), datetime.datetime(2026, 5, 29, 0, 9, 32), 'salt', 6.78, 78.16, None, 12.14, 133.82, 3.53, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:09:44.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:09:44.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:09:44.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:32, diff=12.719943s, valid=True
2026-05-29T00:09:44.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:09:44.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:09:44.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=32.723315s, valid=True
2026-05-29T00:09:44.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:09:44.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:23, diff=21.731039s, valid=True
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:09:44.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T00:09:44.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=32.734615s, valid=True
2026-05-29T00:09:44.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:09:44.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:09:44.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:09:44.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938826.735409s, valid=True
2026-05-29T00:09:44.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:09:44.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:09:44.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:09:44.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:09:44.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:09:44.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:09:44.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:09:44.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:09:44.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:09:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:09:44.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:09:44.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:09:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:09:45.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:09:45.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:09:45.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:09:45.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:09:45.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:09:45.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:09:45.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:09:45.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:09:45.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:10:15.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:10:15.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:10:15.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:10:16.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:10:16.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:10:16.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:10:16.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-29T00:10:16.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:10:16.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-29T00:10:16.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:10:16.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:10:16.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:10:16.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-29T00:10:18.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-29T00:10:18.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:10:18.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:10:18.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:10:18.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:10:18.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:10:18.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:10:18.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:10:18.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:10:18.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:10:18.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:10:18.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:10:18.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:10:18.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:10:18.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:10:18.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:10:18.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:10:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:10:18.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:10:18.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:10:18.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:10:18.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:10:18.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:10:18.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:10:19.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:10:02
2026-05-29T00:10:19.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70374, datetime.datetime(2026, 5, 29, 0, 10, 2), datetime.datetime(2026, 5, 29, 0, 10, 2), 'salt', 6.75, 77.96, None, 12.03, 132.97, 3.56, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:10:19.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:10:19.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:10:19.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:10:02, diff=17.054374s, valid=True
2026-05-29T00:10:19.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:10:19.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:10:19.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=67.057227s, valid=True
2026-05-29T00:10:19.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:10:19.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:10:19.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:54, diff=25.063827s, valid=True
2026-05-29T00:10:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:10:19.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:10:19.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:10:19.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:10:19.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:10:19.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:10:19.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=67.06679s, valid=True
2026-05-29T00:10:19.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:10:19.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:10:19.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:10:19.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938861.067441s, valid=True
2026-05-29T00:10:19.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:10:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:10:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:10:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:10:19.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:10:19.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:10:19.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:10:19.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:10:19.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:10:19.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:10:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:10:19.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:10:19.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:10:19.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:10:19.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:10:20.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:10:20.128 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:10:20.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:10:20.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-29T00:10:20.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-29T00:10:20.214 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:10:20.214 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:10:50.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:10:50.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:10:50.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:10:50.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:10:50.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:10:50.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:10:50.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-29T00:10:50.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:10:50.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:10:50.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:10:50.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:10:50.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:10:50.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-29T00:10:53.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-29T00:10:53.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:10:53.127 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:10:53.127 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:10:53.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:10:53.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:10:53.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:10:53.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:10:53.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:10:53.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:10:53.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:10:53.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:10:53.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:10:53.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:10:53.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:10:53.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:10:53.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:10:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:10:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:10:53.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:10:53.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:10:53.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:10:53.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:10:53.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:10:53.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:10:32
2026-05-29T00:10:53.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70375, datetime.datetime(2026, 5, 29, 0, 10, 32), datetime.datetime(2026, 5, 29, 0, 10, 32), 'salt', 6.72, 77.89, None, 12.18, 133.11, 3.58, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:10:53.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:10:53.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:10:53.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:10:32, diff=21.463411s, valid=True
2026-05-29T00:10:53.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:10:53.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:10:53.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=101.466261s, valid=True
2026-05-29T00:10:53.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:10:53.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:10:53.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:10:25, diff=28.472939s, valid=True
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:10:53.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:10:53.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=101.475978s, valid=True
2026-05-29T00:10:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:10:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:10:53.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:10:53.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938895.476646s, valid=True
2026-05-29T00:10:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:10:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:10:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:10:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:10:53.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:10:53.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:10:53.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:10:53.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:10:53.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:10:53.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:10:53.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:10:53.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:10:53.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:10:53.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:10:54.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:10:54.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:10:54.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:10:54.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:10:54.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-29T00:10:54.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-29T00:10:54.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:10:54.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:11:24.573 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:11:24.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:11:24.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:11:24.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:11:24.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:11:24.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:11:24.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-29T00:11:24.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:11:24.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-29T00:11:24.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:11:24.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:11:24.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:11:24.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-29T00:11:28.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:11:28.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:11:28.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:11:28.693 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:11:28.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:11:28.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:11:28.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:11:28.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:11:28.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:11:28.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:11:28.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:11:28.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:11:28.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:11:28.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:11:28.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:11:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:11:28.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:11:28.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:11:28.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:11:28.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:11:28.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:11:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:11:28.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:11:28.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:11:29.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:11:03
2026-05-29T00:11:29.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70376, datetime.datetime(2026, 5, 29, 0, 11, 3), datetime.datetime(2026, 5, 29, 0, 11, 2), 'salt', 6.62, 77.76, None, 11.96, 134.48, 3.6, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:11:29.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:11:29.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:11:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:11:02, diff=27.041235s, valid=True
2026-05-29T00:11:29.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:11:29.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:11:29.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=137.044063s, valid=True
2026-05-29T00:11:29.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:11:29.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:11:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:10:57, diff=32.050632s, valid=True
2026-05-29T00:11:29.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:11:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:11:29.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:11:29.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:11:29.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:11:29.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:11:29.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=137.05361s, valid=True
2026-05-29T00:11:29.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:11:29.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:11:29.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:11:29.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938931.054265s, valid=True
2026-05-29T00:11:29.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:11:29.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:11:29.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:11:29.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:11:29.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:11:29.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:11:29.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:11:29.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:11:29.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:11:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:11:29.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:11:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:11:29.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:11:29.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:11:29.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:11:30.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:11:30.180 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:11:30.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:11:30.180 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:11:30.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:11:30.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:11:30.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:12:00.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:12:00.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:12:00.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:12:00.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:12:00.960 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:12:01.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:12:01.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-29T00:12:01.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:12:01.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-29T00:12:01.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:12:01.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:12:01.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:12:01.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-29T00:12:03.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-29T00:12:03.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:12:03.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:12:03.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:12:03.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:12:03.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:12:03.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:12:03.596 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:12:03.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:12:03.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:12:03.597 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:12:03.597 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:12:03.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:12:03.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:12:03.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:12:03.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:12:03.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:12:03.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:12:03.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:12:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:12:03.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:12:03.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:12:03.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:12:03.860 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:12:03.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:12:03
2026-05-29T00:12:03.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70378, datetime.datetime(2026, 5, 29, 0, 12, 3), datetime.datetime(2026, 5, 29, 0, 12, 3), 'salt', 6.69, 77.73, None, 12.0, 132.46, 3.61, 832.42, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:12:03.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:12:03.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:12:03.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:12:03, diff=0.92712s, valid=True
2026-05-29T00:12:03.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:12:03.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:12:03.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=171.930011s, valid=True
2026-05-29T00:12:03.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:12:03.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:12:03.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:12:00, diff=3.936773s, valid=True
2026-05-29T00:12:03.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:12:03.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:12:03.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:12:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:12:03.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:12:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:12:03.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=171.939914s, valid=True
2026-05-29T00:12:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:12:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:12:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:12:03.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=938965.940574s, valid=True
2026-05-29T00:12:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:12:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:12:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:12:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:12:03.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:12:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:12:04.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:12:04.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:12:04.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:12:04.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:12:04.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:12:04.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:12:04.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:12:04.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:12:04.484 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:12:04.836 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:12:04.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:12:04.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:12:04.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-29T00:12:04.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-29T00:12:05.224 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:12:05.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:12:35.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:12:35.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:12:35.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:12:35.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:12:35.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:12:35.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:12:35.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:12:35.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:12:35.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-29T00:12:35.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:12:35.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:12:35.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:12:35.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-29T00:12:38.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-29T00:12:38.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:12:38.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:12:38.260 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:12:38.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:12:38.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:12:38.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:12:38.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:12:38.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:12:38.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:12:38.280 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:12:38.280 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:12:38.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:12:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:12:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:12:38.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:12:38.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:12:38.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:12:38.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:12:38.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:12:38.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:12:38.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:12:38.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:12:38.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:12:38.614 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:12:34
2026-05-29T00:12:38.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70379, datetime.datetime(2026, 5, 29, 0, 12, 34), datetime.datetime(2026, 5, 29, 0, 12, 33), 'salt', 6.69, 77.73, None, 12.25, 131.8, 3.61, 832.48, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:12:38.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:12:38.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:12:38.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:12:33, diff=5.621937s, valid=True
2026-05-29T00:12:38.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:12:38.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:12:38.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=206.625787s, valid=True
2026-05-29T00:12:38.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:12:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:12:31, diff=7.633119s, valid=True
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:12:38.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:12:38.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=206.63621s, valid=True
2026-05-29T00:12:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:12:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:12:38.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:12:38.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939000.636891s, valid=True
2026-05-29T00:12:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:12:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:12:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:12:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:12:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:12:38.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:12:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:12:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:12:38.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:12:38.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:12:38.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:12:38.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:12:38.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:12:39.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:12:39.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:12:39.656 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:12:39.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:12:39.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:12:39.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-29T00:12:39.758 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:12:39.986 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:12:39.986 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:13:10.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:13:10.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:13:10.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:13:10.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:13:10.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:13:10.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:13:10.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-29T00:13:10.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:13:10.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-29T00:13:10.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:13:10.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:13:10.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:13:10.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-29T00:13:13.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-29T00:13:13.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:13:13.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:13:13.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:13:13.316 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:13:13.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:13:13.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:13:13.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:13:13.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:13:13.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:13:13.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:13:13.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:13:13.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:13:13.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:13:13.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:13:13.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:13:13.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:13:13.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:13:13.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:13:13.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:13:13.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:13:13.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:13:13.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:13:13.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:13:13.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:13:04
2026-05-29T00:13:13.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70380, datetime.datetime(2026, 5, 29, 0, 13, 4), datetime.datetime(2026, 5, 29, 0, 13, 3), 'salt', 6.65, 77.63, None, 12.46, 131.85, 3.62, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:13:13.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:13:13.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:13:13.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:13:03, diff=10.685836s, valid=True
2026-05-29T00:13:13.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:13:13.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:13:13.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=241.688603s, valid=True
2026-05-29T00:13:13.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:13:13.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:13:03, diff=10.695297s, valid=True
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:13:13.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:13:13.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:09:12, diff=241.69833s, valid=True
2026-05-29T00:13:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:13:13.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:13:13.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:13:13.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939035.698995s, valid=True
2026-05-29T00:13:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:13:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:13:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:13:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:13:13.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:13:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:13:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:13:13.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:13:13.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:13:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:13:13.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:13:13.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:13:13.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:13:14.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:13:14.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:13:14.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:13:14.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:13:14.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:13: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-29T00:13: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-29T00:13:14.774 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:13:14.774 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:13:44.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:13:44.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:13:44.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:13:45.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:13:45.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:13:45.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:13:45.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-29T00:13:45.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:13:45.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-29T00:13:45.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:13:45.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:13:45.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:13:45.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-29T00:13:48.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-29T00:13:48.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:13:48.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:13:48.402 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:13:48.402 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:13:48.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:13:48.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:13:48.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:13:48.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:13:48.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:13:48.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:13:48.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:13:48.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:13:48.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:13:48.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:13:48.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:13:48.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:13:48.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:13:48.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:13:48.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:13:48.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:13:48.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:13:48.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:13:48.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:13:48.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:13:34
2026-05-29T00:13:48.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70381, datetime.datetime(2026, 5, 29, 0, 13, 34), datetime.datetime(2026, 5, 29, 0, 13, 34), 'salt', 6.62, 77.49, None, 11.65, 133.4, 3.65, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:13:48.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:13:48.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:13:48.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:13:34, diff=14.75463s, valid=True
2026-05-29T00:13:48.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:13:48.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:13:48.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:12, diff=-23.242499s, valid=True
2026-05-29T00:13:48.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:13:48.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:13:25, diff=23.764077s, valid=True
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:13:48.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:13:48.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:12, diff=-23.2329s, valid=True
2026-05-29T00:13:48.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:13:48.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:13:48.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:13:48.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939070.767768s, valid=True
2026-05-29T00:13:48.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:13:48.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:13:48.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:13:48.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:13:48.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:13:48.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:13:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:13:48.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:13:48.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:13:48.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:13:48.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:13:48.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:13:49.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:13:49.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:13:49.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:13:49.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:13:49.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:13:49.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:13:49.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-29T00:13:49.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-29T00:13:49.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:13:49.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:14:19.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:14:19.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:14:19.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:14:20.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:14:20.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:14:20.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:14:20.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-29T00:14:20.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:14:20.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-29T00:14:20.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:14:20.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:14:20.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:14:20.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-29T00:14:22.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-29T00:14:22.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:14:22.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:14:22.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:14:22.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:14:22.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:14:22.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:14:22.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:14:22.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:14:22.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:14:22.832 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:14:22.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:14:22.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:14:22.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:14:22.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:14:22.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:14:22.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:14:23.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:14:23.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:14:23.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:14:23.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:14:23.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:14:23.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:14:23.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:14:23.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:14:04
2026-05-29T00:14:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70382, datetime.datetime(2026, 5, 29, 0, 14, 4), datetime.datetime(2026, 5, 29, 0, 14, 4), 'salt', 6.65, 77.39, None, 11.22, 127.9, 3.66, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:14:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:14:23.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:14:23.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:04, diff=19.146753s, valid=True
2026-05-29T00:14:23.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:14:23.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:14:23.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:12, diff=11.149581s, valid=True
2026-05-29T00:14:23.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:14:23.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:13:55, diff=28.156302s, valid=True
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:14:23.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:14:23.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:12, diff=11.159296s, valid=True
2026-05-29T00:14:23.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:14:23.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:14:23.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:14:23.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939105.159959s, valid=True
2026-05-29T00:14:23.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:14:23.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:14:23.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:14:23.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:14:23.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:14:23.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:14:23.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:14:23.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:14:23.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:14:23.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:14:23.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:14:23.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:14:23.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:14:23.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:14:23.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:14:24.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:14:24.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:14:24.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:14:24.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:14:24.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:14:24.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:14:24.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:14:54.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:14:54.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:14:54.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:14:54.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:14:54.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:14:54.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:14:54.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:14:54.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:14:54.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:14:54.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:14:54.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:14:54.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:14:54.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-29T00:14:57.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:14:57.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:14:57.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:14:57.352 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:14:57.352 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:14:57.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:14:57.372 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:14:57.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:14:57.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:14:57.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:14:57.372 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:14:57.373 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:14:57.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:14:57.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:14:57.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:14:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:14:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:14:57.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:14:57.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:14:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:14:57.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:14:57.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:14:57.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:14:57.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:14:57.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:14:35
2026-05-29T00:14:57.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70383, datetime.datetime(2026, 5, 29, 0, 14, 35), datetime.datetime(2026, 5, 29, 0, 14, 34), 'salt', 6.59, 77.3, None, 11.58, 129.97, 3.69, 832.3, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:14:57.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:14:57.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:14:57.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:34, diff=23.696334s, valid=True
2026-05-29T00:14:57.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:14:57.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:14:57.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:15:12, diff=-14.300763s, valid=True
2026-05-29T00:14:57.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:14:57.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:14:57.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:27, diff=30.705858s, valid=True
2026-05-29T00:14:57.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:14:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:14:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:14:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:14:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:14:57.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:14:57.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:15:12, diff=-14.291143s, valid=True
2026-05-29T00:14:57.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:14:57.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:14:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:14:57.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939139.709504s, valid=True
2026-05-29T00:14:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:14:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:14:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:14:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:14:57.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:14:57.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:14:57.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:14:57.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:14:57.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:14:57.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:14:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:14:57.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:14:57.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:14:58.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:14:58.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:14:58.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:14:58.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:14:58.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:14:58.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-29T00:14:58.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-29T00:14:58.877 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:14:58.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:15:28.930 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:15:28.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:15:28.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:15:29.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:15:29.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:15:29.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:15:29.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-29T00:15:29.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:15:29.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-29T00:15:29.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:15:29.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:15:29.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:15:29.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-29T00:15: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-29T00:15:31.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:15:31.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:15:31.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:15:31.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:15:31.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:15:31.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:15:31.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:15:31.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:15:31.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:15:31.842 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:15:31.842 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:15:31.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:15:31.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:15:31.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:15:32.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:15:32.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:15:32.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:15:32.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:15:32.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:15:32.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:15:32.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:15:32.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:15:32.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:15:32.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:15:05
2026-05-29T00:15:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70384, datetime.datetime(2026, 5, 29, 0, 15, 5), datetime.datetime(2026, 5, 29, 0, 15, 4), 'salt', 6.59, 77.33, None, 12.56, 134.69, 3.68, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:15:32.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:15:32.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:15:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:15:04, diff=28.186976s, valid=True
2026-05-29T00:15:32.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:15:32.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:15:32.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:15:12, diff=20.190041s, valid=True
2026-05-29T00:15:32.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:15:32.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:15:32.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:14:58, diff=34.196743s, valid=True
2026-05-29T00:15:32.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:15:32.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:15:32.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:15:32.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:15:32.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:15:32.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:15:32.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:15:12, diff=20.199886s, valid=True
2026-05-29T00:15:32.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:15:32.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:15:32.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:15:32.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939174.200548s, valid=True
2026-05-29T00:15:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:15:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:15:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:15:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:15:32.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:15:32.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:15:32.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:15:32.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:15:32.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:15:32.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:15:32.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:15:32.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:15:32.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:15:32.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:15:32.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:15:33.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:15:33.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:15:33.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:15:33.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-29T00:15:33.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-29T00:15:33.340 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:15:33.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:16:03.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:16:03.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:16:03.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:16:03.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:16:03.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:16:04.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:16:04.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-29T00:16:04.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:16:04.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:16:04.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:16:04.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:16:04.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:16:04.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-29T00:16:06.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-29T00:16:06.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:16:06.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:16:06.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:16:06.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:16:06.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:16:06.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:16:06.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:16:06.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:16:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:16:06.345 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:16:06.345 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:16:06.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:16:06.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:16:06.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:16:06.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:16:06.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:16:06.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:16:06.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:16:06.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:16:06.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:16:06.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:16:06.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:16:06.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:16:06.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:16:05
2026-05-29T00:16:06.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70386, datetime.datetime(2026, 5, 29, 0, 16, 5), datetime.datetime(2026, 5, 29, 0, 16, 5), 'salt', 6.59, 77.3, None, 11.89, 128.77, 3.69, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:16:06.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:16:06.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:16:06.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:05, diff=1.677318s, valid=True
2026-05-29T00:16:06.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:16:06.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:16:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:12, diff=-5.319467s, valid=True
2026-05-29T00:16:06.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:16:06.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:01, diff=5.687562s, valid=True
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:16:06.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:16:06.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:16:06.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:12, diff=-5.309387s, valid=True
2026-05-29T00:16:06.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:16:06.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:16:06.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:16:06.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939208.691288s, valid=True
2026-05-29T00:16:06.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:16:06.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:16:06.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:16:06.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:16:06.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:16:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:16:06.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:16:06.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:16:06.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:16:06.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:16:06.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:16:06.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:16:06.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:16:07.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:16:07.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:16:07.575 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:16:07.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:16:07.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:16:07.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-29T00:16:07.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-29T00:16:07.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:16:07.757 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:16:37.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:16:37.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:16:37.760 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:16:37.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:16:37.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:16:38.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:16:38.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-29T00:16:38.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:16:38.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-29T00:16:38.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:16:38.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:16:38.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:16:38.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-29T00:16:40.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-29T00:16:40.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:16:40.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:16:40.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:16:40.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:16:40.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:16:40.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:16:40.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:16:40.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:16:40.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:16:40.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:16:40.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:16:40.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:16:40.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:16:40.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:16:40.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:16:40.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:16:40.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:16:40.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:16:40.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:16:40.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:16:41.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:16:41.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:16:41.002 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:16:41.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:16:35
2026-05-29T00:16:41.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70387, datetime.datetime(2026, 5, 29, 0, 16, 35), datetime.datetime(2026, 5, 29, 0, 16, 35), 'salt', 6.49, 76.96, None, 12.14, 128.98, 3.74, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:16:41.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:16:41.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:16:41.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:35, diff=6.068965s, valid=True
2026-05-29T00:16:41.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:16:41.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:16:41.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:12, diff=-30.927835s, valid=True
2026-05-29T00:16:41.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:16:41.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:16:41.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:16:33, diff=8.07958s, valid=True
2026-05-29T00:16:41.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:16:41.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:16:41.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:16:41.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:16:41.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:16:41.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:16:41.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:12, diff=-30.917025s, valid=True
2026-05-29T00:16:41.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:16:41.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:16:41.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:16:41.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939243.083718s, valid=True
2026-05-29T00:16:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:16:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:16:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:16:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:16:41.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:16:41.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:16:41.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:16:41.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:16:41.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:16:41.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:16:41.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:16:41.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:16:41.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:16:41.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:16:41.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:16:42.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:16:42.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:16:42.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:16:42.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-29T00:16:42.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-29T00:16:42.305 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:16:42.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:17:12.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:17:12.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:17:12.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:17:12.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:17:12.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:17:12.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:17:12.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:17:12.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:17:12.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-29T00:17:12.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:17:12.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:17:12.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:17:12.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:17:15.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:17:15.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:17:15.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:17:15.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:17:15.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:17:15.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:17:15.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:17:15.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:17:15.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:17:15.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:17:15.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:17:15.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:17:15.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:17:15.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:17:15.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:17:15.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:17:15.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:17:15.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:17:15.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:17:15.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:17:15.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:17:15.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:17:15.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:17:15.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:17:15.557 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:17:06
2026-05-29T00:17:15.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70388, datetime.datetime(2026, 5, 29, 0, 17, 6), datetime.datetime(2026, 5, 29, 0, 17, 5), 'salt', 6.62, 77.0, None, 11.29, 125.86, 3.74, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:17:15.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:17:15.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:17:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:05, diff=10.563207s, valid=True
2026-05-29T00:17:15.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:17:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:17:15.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:12, diff=3.566061s, valid=True
2026-05-29T00:17:15.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:17:15.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:17:15.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:04, diff=11.572771s, valid=True
2026-05-29T00:17:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:17:15.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:17:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:17:15.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:17:15.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:17:15.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:17:15.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:12, diff=3.575835s, valid=True
2026-05-29T00:17:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:17:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:17:15.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:17:15.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939277.576502s, valid=True
2026-05-29T00:17:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:17:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:17:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:17:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:17:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:17:15.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:17:15.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:17:15.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:17:15.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:17:15.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:17:15.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:17:15.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:17:15.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:17:15.896 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:17:16.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:17:16.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:17:16.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:17:16.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:17:16.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-29T00:17:16.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-29T00:17:16.641 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:17:16.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:17:46.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:17:46.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:17:46.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:17:46.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:17:46.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:17:47.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:17:47.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-29T00:17:47.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:17:47.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-29T00:17:47.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:17:47.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:17:47.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:17:47.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-29T00:17:50.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-29T00:17:50.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:17:50.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:17:50.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:17:50.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:17:50.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:17:50.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:17:50.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:17:50.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:17:50.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:17:50.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:17:50.366 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:17:50.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:17:50.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:17:50.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:17:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:17:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:17:50.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:17:50.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:17:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:17:50.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:17:50.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:17:50.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:17:50.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:17:50.754 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:17:36
2026-05-29T00:17:50.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70389, datetime.datetime(2026, 5, 29, 0, 17, 36), datetime.datetime(2026, 5, 29, 0, 17, 35), 'salt', 6.82, 76.73, None, 10.66, 128.65, 3.79, 832.11, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:17:50.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:17:50.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:17:50.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:35, diff=15.760659s, valid=True
2026-05-29T00:17:50.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:17:50.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:17:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:12, diff=-21.23202s, valid=True
2026-05-29T00:17:50.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:17:50.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:17:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:36, diff=14.785415s, valid=True
2026-05-29T00:17:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:17:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:17:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:17:50.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:17:50.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:17:50.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:17:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:12, diff=-21.208508s, valid=True
2026-05-29T00:17:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:17:50.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:17:50.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:17:50.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939312.792745s, valid=True
2026-05-29T00:17:50.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:17:50.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:17:50.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:17:50.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:17:50.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:17:50.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:17:50.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:17:50.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:17:50.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:17:50.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:17:51.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:17:51.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:17:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:17:51.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:17:51.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:17:51.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:17:51.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:17:51.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:17:51.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-29T00:17:51.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-29T00:17:52.061 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:17:52.061 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:18:22.091 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:18:22.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:18:22.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:18:22.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:18:22.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:18:22.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:18:22.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-29T00:18:22.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:18:22.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-29T00:18:22.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:18:22.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:18:22.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:18:22.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-29T00:18:25.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:18:25.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:18:25.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:18:25.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:18:25.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:18:25.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:18:25.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:18:25.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:18:25.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:18:25.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:18:25.417 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:18:25.417 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:18:25.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:18:25.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:18:25.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:18:25.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:18:25.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:18:25.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:18:25.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:18:25.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:18:25.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:18:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:18:25.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:18:25.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:18:25.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:18:06
2026-05-29T00:18:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70390, datetime.datetime(2026, 5, 29, 0, 18, 6), datetime.datetime(2026, 5, 29, 0, 18, 6), 'salt', 6.98, 76.07, None, 10.76, 129.73, 3.92, 832.17, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:18:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:18:25.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:18:25.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:06, diff=19.729348s, valid=True
2026-05-29T00:18:25.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:18:25.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:18:25.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:12, diff=13.732166s, valid=True
2026-05-29T00:18:25.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:18:25.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:18:25.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:17:58, diff=27.73896s, valid=True
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:18:25.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:18:25.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:12, diff=13.741965s, valid=True
2026-05-29T00:18:25.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:18:25.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:18:25.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:18:25.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939347.742647s, valid=True
2026-05-29T00:18:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:18:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:18:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:18:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:18:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:18:25.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:18:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:18:25.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:18:25.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:18:25.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:18:25.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:18:25.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:18:26.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:18:26.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:18:26.280 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:18:26.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:18:26.733 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:18:26.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:18:26.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-29T00:18:26.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-29T00:18:26.980 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:18:26.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:18:57.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:18:57.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:18:57.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:18:57.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:18:57.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:18:57.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:18:57.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-29T00:18:57.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:18:57.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-29T00:18:57.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:18:57.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:18:57.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:18:57.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-29T00:19:00.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-29T00:19:00.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:19:00.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:19:00.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:19:00.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:19:00.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:19:00.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:19:00.222 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:19:00.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:19:00.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:19:00.222 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:19:00.222 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:19:00.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:19:00.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:19:00.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:19:00.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:19:00.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:19:00.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:19:00.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:19:00.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:19:00.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:19:00.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:19:00.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:19:00.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:19:00.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:18:36
2026-05-29T00:19:00.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70391, datetime.datetime(2026, 5, 29, 0, 18, 36), datetime.datetime(2026, 5, 29, 0, 18, 36), 'salt', 6.95, 75.74, None, 10.45, 128.86, 3.98, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:19:00.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:19:00.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:19:00.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:36, diff=24.553057s, valid=True
2026-05-29T00:19:00.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:19:00.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:19:00.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:19:12, diff=-11.444082s, valid=True
2026-05-29T00:19:00.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:19:00.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:28, diff=32.56246s, valid=True
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:19:00.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:19:00.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:19:12, diff=-11.434508s, valid=True
2026-05-29T00:19:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:19:00.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:19:00.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:19:00.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939382.566151s, valid=True
2026-05-29T00:19:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:19:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:19:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:19:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:19:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:19:00.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:19:00.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:19:00.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:19:00.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:19:00.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:19:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:19:00.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:19:00.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:19:00.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:19:01.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:19:01.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:19:01.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:19:01.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:19:01.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-29T00:19:01.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-29T00:19:01.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:19:01.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:19:31.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:19:31.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:19:31.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:19:32.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:19:32.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:19:33.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:19:33.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:19:33.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:19:33.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-29T00:19:33.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:19:33.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:19:33.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:19:33.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-29T00:19:36.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:19:36.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:19:36.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:19:36.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:19:36.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:19:36.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:19:36.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:19:36.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:19:36.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:19:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:19:36.101 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:19:36.101 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:19:36.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:19:36.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:19:36.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:19:36.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:19:36.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:19:36.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:19:36.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:19:36.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:19:36.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:19:36.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:19:36.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:19:36.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:19:36.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:19:06
2026-05-29T00:19:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70392, datetime.datetime(2026, 5, 29, 0, 19, 6), datetime.datetime(2026, 5, 29, 0, 19, 6), 'salt', 6.92, 75.54, None, 10.87, 123.75, 4.02, 832.23, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:19:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:19:36.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:19:36.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:19:06, diff=30.433645s, valid=True
2026-05-29T00:19:36.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:19:36.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:19:36.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:19:12, diff=24.436466s, valid=True
2026-05-29T00:19:36.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:19:36.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:18:59, diff=37.443041s, valid=True
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:19:36.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:19:36.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:19:12, diff=24.446016s, valid=True
2026-05-29T00:19:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:19:36.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:19:36.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:19:36.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939418.446673s, valid=True
2026-05-29T00:19:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:19:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:19:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:19:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:19:36.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:19:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:19:36.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:19:36.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:19:36.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:19:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:19:36.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:19:36.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:19:36.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:19:36.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:19:36.981 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:19:37.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:19:37.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:19:37.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:19:37.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-29T00:19:37.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-29T00:19:37.677 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:19:37.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:20:07.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:20:07.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:20:07.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:20:07.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:20:08.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:20:08.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:20:08.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-29T00:20:08.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:20:08.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-29T00:20:08.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:20:08.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:20:08.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:20:08.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-29T00:20:10.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-29T00:20:10.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:20:10.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:20:10.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:20:10.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:20:10.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:20:10.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:20:10.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:20:10.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:20:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:20:10.679 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:20:10.679 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:20:10.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:20:10.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:20:10.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:20:10.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:20:10.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:20:10.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:20:10.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:20:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:20:10.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:20:10.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:20:10.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:20:10.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:20:11.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:20:07
2026-05-29T00:20:11.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70394, datetime.datetime(2026, 5, 29, 0, 20, 7), datetime.datetime(2026, 5, 29, 0, 20, 6), 'salt', 6.78, 75.37, None, 10.45, 118.72, 4.04, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:20:11.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:20:11.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:20:11.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:06, diff=5.006421s, valid=True
2026-05-29T00:20:11.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:20:11.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:20:11.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:12, diff=-0.990778s, valid=True
2026-05-29T00:20:11.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:20:11.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:20:11.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:02, diff=9.015752s, valid=True
2026-05-29T00:20:11.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:20:11.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:20:11.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:20:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:20:11.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:20:11.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:12, diff=-0.981298s, valid=True
2026-05-29T00:20:11.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:20:11.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:20:11.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:20:11.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939453.019355s, valid=True
2026-05-29T00:20:11.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:20:11.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:20:11.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:20:11.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:20:11.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:20:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:20:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:20:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:20:11.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:20:11.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:20:11.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:20:11.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:20:11.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:20:11.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:20:11.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:20:11.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:20:11.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:20:11.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:20:11.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-29T00:20:11.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-29T00:20:12.169 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:20:12.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:20:42.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:20:42.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:20:42.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:20:42.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:20:42.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:20:42.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:20:42.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-29T00:20:42.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:20:42.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-29T00:20:42.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:20:42.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:20:42.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:20:42.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-29T00:20:45.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-29T00:20:45.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:20:45.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:20:45.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:20:45.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:20:45.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:20:45.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:20:45.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:20:45.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:20:45.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:20:45.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:20:45.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:20:45.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:20:45.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:20:45.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:20:45.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:20:45.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:20:45.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:20:45.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:20:45.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:20:45.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:20:45.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:20:45.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:20:45.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:20:45.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:20:37
2026-05-29T00:20:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70395, datetime.datetime(2026, 5, 29, 0, 20, 37), datetime.datetime(2026, 5, 29, 0, 20, 37), 'salt', 6.82, 75.44, None, 10.73, 125.23, 4.03, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:20:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:20:45.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:20:45.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:37, diff=8.545721s, valid=True
2026-05-29T00:20:45.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:20:45.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:20:45.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:12, diff=-26.451301s, valid=True
2026-05-29T00:20:45.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:20:45.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:20:34, diff=11.555494s, valid=True
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:20:45.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:20:45.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:20:45.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:12, diff=-26.441348s, valid=True
2026-05-29T00:20:45.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:20:45.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:20:45.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:20:45.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939487.559314s, valid=True
2026-05-29T00:20:45.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:20:45.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:20:45.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:20:45.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:20:45.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:20:45.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:20:45.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:20:45.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:20:45.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:20:45.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:20:45.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:20:45.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:20:45.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:20:46.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:20:46.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:20:46.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:20:46.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:20:46.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:20:46.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-29T00:20:46.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-29T00:20:48.286 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:20:48.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:21:18.316 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:21:18.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:21:18.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:21:18.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:21:18.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:21:19.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:21:19.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-29T00:21:19.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:21:19.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-29T00:21:19.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:21:19.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:21:19.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:21:19.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-29T00:21:22.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-29T00:21:22.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:21:22.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:21:22.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:21:22.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:21:22.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:21:22.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:21:22.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:21:22.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:21:22.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:21:22.068 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:21:22.068 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:21:22.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:21:22.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:21:22.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:21:22.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:21:22.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:21:22.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:21:22.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:21:22.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:21:22.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:21:22.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:21:22.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:21:22.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:21:22.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:21:07
2026-05-29T00:21:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70396, datetime.datetime(2026, 5, 29, 0, 21, 7), datetime.datetime(2026, 5, 29, 0, 21, 7), 'salt', 6.69, 75.57, None, 10.76, 120.41, 4.01, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:21:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:21:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:21:22.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:07, diff=15.397421s, valid=True
2026-05-29T00:21:22.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:21:22.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:21:22.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:12, diff=10.40037s, valid=True
2026-05-29T00:21:22.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:21:22.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:21:22.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:05, diff=17.406921s, valid=True
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:21:22.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:21:22.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:12, diff=10.409843s, valid=True
2026-05-29T00:21:22.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:21:22.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:21:22.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:21:22.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939524.410487s, valid=True
2026-05-29T00:21:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:21:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:21:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:21:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:21:22.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:21:22.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:21:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:21:22.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:21:22.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:21:22.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:21:22.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:21:22.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:21:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:21:22.749 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:21:22.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:21:23.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:21:23.427 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:21:23.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:21:23.428 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:21:23.428 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:21:23.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:21:23.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:21:53.700 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:21:53.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:21:53.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:21:53.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:21:53.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:21:54.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:21:54.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-29T00:21:54.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:21:54.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-29T00:21:54.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:21:54.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:21:54.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:21:54.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:21:56.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:21:56.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:21:56.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:21:56.572 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:21:56.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:21:56.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:21:56.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:21:56.592 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:21:56.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:21:56.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:21:56.592 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:21:56.592 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:21:56.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:21:56.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:21:56.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:21:56.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:21:56.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:21:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:21:56.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:21:56.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:21:56.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:21:56.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:21:56.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:21:56.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:21:56.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:21:38
2026-05-29T00:21:56.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70397, datetime.datetime(2026, 5, 29, 0, 21, 38), datetime.datetime(2026, 5, 29, 0, 21, 37), 'salt', 6.72, 75.97, None, 9.92, 121.37, 3.93, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:21:56.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:21:56.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:21:56.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:37, diff=19.91398s, valid=True
2026-05-29T00:21:56.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:21:56.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:21:56.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:12, diff=-15.083152s, valid=True
2026-05-29T00:21:56.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:21:56.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:21:36, diff=20.923519s, valid=True
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:21:56.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:21:56.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:21:56.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:12, diff=-15.073355s, valid=True
2026-05-29T00:21:56.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:21:56.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:21:56.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:21:56.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939558.927311s, valid=True
2026-05-29T00:21:56.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:21:56.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:21:56.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:21:56.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:21:56.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:21:56.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:21:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:21:56.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:21:57.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:21:57.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:21:57.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:21:57.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:21:57.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:21:57.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:21:57.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:21:57.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:21:57.982 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:21:57.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:21:57.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-29T00:21:57.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-29T00:21:58.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:21:58.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:22:28.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:22:28.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:22:28.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:22:28.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:22:28.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:22:28.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:22:28.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-29T00:22:28.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:22:28.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-29T00:22:28.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:22:28.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:22:28.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:22:28.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:22:31.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-29T00:22:31.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:22:31.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:22:31.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:22:31.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:22:31.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:22:31.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:22:31.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:22:31.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:22:31.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:22:31.033 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:22:31.033 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:22:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:22:31.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:22:31.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:22:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:22:31.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:22:31.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:22:31.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:22:31.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:22:31.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:22:31.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:22:31.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:22:31.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:22:31.343 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:22:08
2026-05-29T00:22:31.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70398, datetime.datetime(2026, 5, 29, 0, 22, 8), datetime.datetime(2026, 5, 29, 0, 22, 7), 'salt', 6.79, 75.84, None, 10.91, 123.93, 3.96, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:22:31.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:22:31.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:22:31.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:07, diff=24.350272s, valid=True
2026-05-29T00:22:31.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:22:31.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:22:31.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:12, diff=19.353772s, valid=True
2026-05-29T00:22:31.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:22:31.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:22:31.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:00, diff=31.362942s, valid=True
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:22:31.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:22:31.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:12, diff=19.366388s, valid=True
2026-05-29T00:22:31.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:22:31.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:22:31.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:22:31.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939593.367095s, valid=True
2026-05-29T00:22:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:22:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:22:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:22:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:22:31.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:22:31.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:22:31.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:22:31.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:22:31.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:22:31.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:22:31.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:22:31.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:22:31.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:22:31.691 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:22:31.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:22:32.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:22:32.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:22:32.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:22:32.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-29T00:22:32.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-29T00:22:32.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:22:32.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:23:02.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:23:02.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:23:02.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:23:02.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:23:02.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:23:03.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:23:03.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-29T00:23:03.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:23:03.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-29T00:23:03.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:23:03.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:23:03.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:23:03.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-29T00:23:05.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-29T00:23:05.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:23:05.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:23:05.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:23:05.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:23:05.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:23:05.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:23:05.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:23:05.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:23:05.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:23:05.385 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:23:05.385 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:23:05.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:23:05.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:23:05.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:23:05.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:23:05.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:23:05.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:23:05.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:23:05.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:23:05.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:23:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:23:05.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:23:05.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:23:05.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:22:38
2026-05-29T00:23:05.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70399, datetime.datetime(2026, 5, 29, 0, 22, 38), datetime.datetime(2026, 5, 29, 0, 22, 38), 'salt', 6.75, 75.8, None, 10.31, 120.86, 3.96, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:23:05.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:23:05.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:23:05.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:38, diff=27.721456s, valid=True
2026-05-29T00:23:05.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:23:05.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:23:05.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:23:12, diff=-6.275701s, valid=True
2026-05-29T00:23:05.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:23:05.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:23:05.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:22:30, diff=35.730866s, valid=True
2026-05-29T00:23:05.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:23:05.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:23:05.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:23:05.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:23:05.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:23:05.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:23:05.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:23:12, diff=-6.266078s, valid=True
2026-05-29T00:23:05.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:23:05.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:23:05.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:23:05.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939627.73461s, valid=True
2026-05-29T00:23:05.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:23:05.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:23:05.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:23:05.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:23:05.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:23:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:23:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:23:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:23:05.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:23:05.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:23:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:23:05.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:23:06.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:23:06.134 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:23:06.348 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:23:06.703 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:23:06.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:23:06.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:23:06.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-29T00:23:06.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-29T00:23:06.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:23:06.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:23:36.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:23:36.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:23:36.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:23:37.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:23:37.353 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:23:37.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:23:37.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:23:37.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:23:37.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-29T00:23:37.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:23:37.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:23:37.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:23:37.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-29T00:23:39.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-29T00:23:39.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:23:39.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:23:39.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:23:39.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:23:39.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:23:39.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:23:39.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:23:39.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:23:39.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:23:39.955 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:23:39.955 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:23:39.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:23:40.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:23:40.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:23:40.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:23:40.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:23:40.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:23:40.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:23:40.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:23:40.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:23:40.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:23:40.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:23:40.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:23:40.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:23:38
2026-05-29T00:23:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70401, datetime.datetime(2026, 5, 29, 0, 23, 38), datetime.datetime(2026, 5, 29, 0, 23, 38), 'salt', 6.72, 75.77, None, 10.55, 122.69, 3.97, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:23:40.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:23:40.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:23:40.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:23:38, diff=2.285421s, valid=True
2026-05-29T00:23:40.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:23:40.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:23:40.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:12, diff=-31.711747s, valid=True
2026-05-29T00:23:40.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:23:40.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:23:40.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:23:32, diff=8.294938s, valid=True
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:23:40.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:23:40.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:12, diff=-31.702056s, valid=True
2026-05-29T00:23:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:23:40.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:23:40.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:23:40.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939662.298598s, valid=True
2026-05-29T00:23:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:23:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:23:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:23:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:23:40.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:23:40.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:23:40.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:23:40.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:23:40.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:23:40.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:23:40.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:23:40.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:23:40.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:23:40.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:23:40.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:23:41.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:23:41.297 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:23:41.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:23:41.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-29T00:23:41.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-29T00:23:41.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:23:41.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:24:11.413 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:24:11.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:24:11.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:24:11.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:24:11.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:24:11.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:24:11.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:24:11.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:24:11.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-29T00:24:11.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:24:11.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:24:11.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:24:11.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-29T00:24:14.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-29T00:24:14.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:24:14.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:24:14.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:24:14.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:24:14.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:24:14.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:24:14.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:24:14.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:24:14.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:24:14.464 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:24:14.464 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:24:14.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:24:14.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:24:14.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:24:14.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:24:14.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:24:14.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:24:14.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:24:14.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:24:14.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:24:14.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:24:14.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:24:14.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:24:14.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:24:09
2026-05-29T00:24:14.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70402, datetime.datetime(2026, 5, 29, 0, 24, 9), datetime.datetime(2026, 5, 29, 0, 24, 8), 'salt', 6.69, 75.77, None, 10.13, 123.37, 3.97, 832.24, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:24:14.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:24:14.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:24:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:08, diff=6.786671s, valid=True
2026-05-29T00:24:14.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:24:14.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:24:14.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:12, diff=2.789731s, valid=True
2026-05-29T00:24:14.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:24:14.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:03, diff=11.797046s, valid=True
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:24:14.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:24:14.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:12, diff=2.800111s, valid=True
2026-05-29T00:24:14.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:24:14.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:24:14.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:24:14.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939696.800787s, valid=True
2026-05-29T00:24:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:24:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:24:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:24:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:24:14.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:24:14.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:24:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:24:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:24:14.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:24:14.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:24:15.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:24:15.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:24:15.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:24:15.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:24:15.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:24:15.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:24:15.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:24:15.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:24:15.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-29T00:24:15.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-29T00:24:16.075 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:24:16.075 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:24:46.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:24:46.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:24:46.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:24:46.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:24:46.227 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:24:46.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:24:46.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-29T00:24:46.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:24:46.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-29T00:24:46.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:24:46.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:24:46.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:24:46.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-29T00:24:48.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-29T00:24:48.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:24:48.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:24:48.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:24:48.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:24:48.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:24:48.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:24:48.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:24:48.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:24:48.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:24:48.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:24:48.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:24:48.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:24:49.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:24:49.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:24:49.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:24:49.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:24:49.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:24:49.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:24:49.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:24:49.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:24:49.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:24:49.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:24:49.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:24:49.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:24:39
2026-05-29T00:24:49.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70403, datetime.datetime(2026, 5, 29, 0, 24, 39), datetime.datetime(2026, 5, 29, 0, 24, 38), 'salt', 6.65, 75.8, None, 10.13, 122.76, 3.96, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:24:49.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:24:49.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:24:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:38, diff=11.242021s, valid=True
2026-05-29T00:24:49.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:24:49.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:24:49.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:12, diff=-22.755155s, valid=True
2026-05-29T00:24:49.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:24:49.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:24:35, diff=14.251392s, valid=True
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:24:49.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:24:49.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:12, diff=-22.745626s, valid=True
2026-05-29T00:24:49.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:24:49.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:24:49.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:24:49.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939731.255034s, valid=True
2026-05-29T00:24:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:24:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:24:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:24:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:24:49.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:24:49.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:24:49.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:24:49.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:24:49.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:24:49.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:24:49.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:24:49.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:24:49.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:24:49.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:24:49.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:24:50.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:24:50.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:24:50.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:24: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-29T00:24: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-29T00:24:50.464 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:24:50.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:25:20.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:25:20.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:25:20.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:25:20.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:25:20.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:25:20.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:25:20.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-29T00:25:20.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:25:20.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-29T00:25:20.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:25:20.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:25:20.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:25:20.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-29T00:25:23.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-29T00:25:23.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:25:23.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:25:23.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:25:23.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:25:23.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:25:23.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:25:23.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:25:23.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:25:23.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:25:23.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:25:23.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:25:23.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:25:23.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:25:23.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:25:23.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:25:23.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:25:23.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:25:23.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:25:23.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:25:23.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:25:23.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:25:23.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:25:23.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:25:23.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:25:09
2026-05-29T00:25:23.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70404, datetime.datetime(2026, 5, 29, 0, 25, 9), datetime.datetime(2026, 5, 29, 0, 25, 9), 'salt', 6.59, 75.97, None, 10.59, 126.71, 3.93, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:25:23.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:25:23.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:25:23.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:09, diff=14.54727s, valid=True
2026-05-29T00:25:23.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:25:23.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:25:23.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:12, diff=11.550125s, valid=True
2026-05-29T00:25:23.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:25:23.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:25:23.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:06, diff=17.556699s, valid=True
2026-05-29T00:25:23.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:25:23.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:25:23.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:25:23.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:25:23.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:25:23.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:25:23.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:12, diff=11.559671s, valid=True
2026-05-29T00:25:23.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:25:23.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:25:23.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:25:23.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939765.560322s, valid=True
2026-05-29T00:25:23.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:25:23.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:25:23.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:25:23.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:25:23.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:25:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:25:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:25:23.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:25:23.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:25:23.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:25:23.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:25:23.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:25:23.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:25:23.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:25:24.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:25:24.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:25:24.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:25:24.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:25:24.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-29T00:25:24.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-29T00:25:24.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:25:24.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:25:54.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:25:54.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:25:54.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:25:55.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:25:55.484 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:25:55.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:25:55.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-29T00:25:55.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:25:55.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-29T00:25:55.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:25:55.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:25:55.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:25: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-29T00:25:58.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-29T00:25:58.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:25:58.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:25:58.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:25:58.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:25:58.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:25:58.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:25:58.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:25:58.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:25:58.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:25:58.284 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:25:58.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:25:58.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:25:58.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:25:58.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:25:58.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:25:58.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:25:58.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:25:58.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:25:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:25:58.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:25:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:25:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:25:58.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:25:58.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:25:39
2026-05-29T00:25:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70405, datetime.datetime(2026, 5, 29, 0, 25, 39), datetime.datetime(2026, 5, 29, 0, 25, 39), 'salt', 6.55, 76.2, None, 10.69, 127.32, 3.88, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:25:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:25:58.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:25:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:39, diff=19.616615s, valid=True
2026-05-29T00:25:58.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:25:58.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:25:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:12, diff=-13.380595s, valid=True
2026-05-29T00:25:58.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:25:58.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:25:38, diff=20.626218s, valid=True
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:25:58.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:25:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:12, diff=-13.370797s, valid=True
2026-05-29T00:25:58.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:25:58.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:25:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:25:58.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939800.629861s, valid=True
2026-05-29T00:25:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:25:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:25:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:25:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:25:58.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:25:58.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:25:58.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:25:58.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:25:58.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:25:58.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:25:58.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:25:58.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:25:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:25:58.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:25:59.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:25:59.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:25:59.630 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:25:59.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:25:59.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-29T00:25:59.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-29T00:25:59.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:25:59.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:26:29.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:26:29.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:26:29.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:26:30.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:26:30.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:26:30.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:26:30.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-29T00:26:30.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:26:30.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-29T00:26:30.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:26:30.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:26:30.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:26:30.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-29T00:26:32.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:26:32.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:26:32.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:26:32.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:26:32.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:26:32.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:26:32.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:26:32.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:26:32.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:26:32.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:26:32.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:26:32.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:26:32.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:26:32.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:26:32.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:26:32.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:26:32.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:26:32.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:26:32.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:26:32.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T00:26:32.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:26:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:26:32.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:26:32.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:26:32.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:26:09
2026-05-29T00:26:32.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70406, datetime.datetime(2026, 5, 29, 0, 26, 9), datetime.datetime(2026, 5, 29, 0, 26, 9), 'salt', 6.49, 76.27, None, 10.13, 124.24, 3.87, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:26:32.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:26:32.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:26:32.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:09, diff=23.992382s, valid=True
2026-05-29T00:26:32.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:26:32.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:26:32.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:12, diff=20.995194s, valid=True
2026-05-29T00:26:32.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:26:32.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:26:33.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:09, diff=24.001778s, valid=True
2026-05-29T00:26:33.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:26:33.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:26:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:26:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:26:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:26:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T00:26:33.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:12, diff=21.005321s, valid=True
2026-05-29T00:26:33.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:26:33.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:26:33.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:26:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939835.006162s, valid=True
2026-05-29T00:26:33.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:26:33.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:26:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:26:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:26:33.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:26:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:26:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:26:33.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:26:33.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:26:33.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:26:33.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:26:33.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:26:33.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:26:33.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:26:33.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:26:33.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:26:33.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:26:33.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:26:33.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-29T00:26:33.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-29T00:26:34.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:26:34.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:27:04.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:27:04.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:27: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-29T00:27:04.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:27:04.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:27:04.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:27:04.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-29T00:27:04.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:27:04.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-29T00:27:04.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:27:04.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:27:04.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:27:04.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-29T00:27:07.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-29T00:27:07.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:27:07.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:27:07.236 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:27:07.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:27:07.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:27:07.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:27:07.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:27:07.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:27:07.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:27:07.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:27:07.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:27:07.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:27:07.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:27:07.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:27:07.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:27:07.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:27:07.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:27:07.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:27:07.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:27:07.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:27:07.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:27:07.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:27:07.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:27:07.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:26:40
2026-05-29T00:27:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70407, datetime.datetime(2026, 5, 29, 0, 26, 40), datetime.datetime(2026, 5, 29, 0, 26, 39), 'salt', 6.52, 76.3, None, 9.85, 124.26, 3.86, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:27:07.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:27:07.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:27:07.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:39, diff=28.594755s, valid=True
2026-05-29T00:27:07.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:27:07.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:27:07.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:27:12, diff=-4.400607s, valid=True
2026-05-29T00:27:07.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:27:07.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:27:07.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:26:32, diff=35.608931s, valid=True
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:27:07.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:27:07.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:27:12, diff=-4.386391s, valid=True
2026-05-29T00:27:07.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:27:07.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:27:07.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:27:07.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939869.614676s, valid=True
2026-05-29T00:27:07.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:27:07.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:27:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:27:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:27:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:27:07.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:27:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:27:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:27:07.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:27:07.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:27:07.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:27:07.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:27:08.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:27:08.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:27:08.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:27:08.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:27:08.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:27:08.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:27:08.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-29T00:27:08.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-29T00:27:09.047 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:27:09.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:27:39.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:27:39.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:27:39.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:27:39.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:27:39.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:27:39.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:27:39.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:27:39.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:27:39.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-29T00:27:39.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:27:39.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:27:39.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:27:39.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-29T00:27:41.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-29T00:27:41.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:27:41.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:27:41.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:27:41.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:27:42.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:27:42.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:27:42.018 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:27:42.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:27:42.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:27:42.019 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:27:42.019 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:27:42.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:27:42.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:27:42.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:27:42.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:27:42.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:27:42.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:27:42.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:27:42.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:27:42.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:27:42.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:27:42.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:27:42.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:27:42.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:27:40
2026-05-29T00:27:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70409, datetime.datetime(2026, 5, 29, 0, 27, 40), datetime.datetime(2026, 5, 29, 0, 27, 40), 'salt', 6.52, 76.96, None, 9.35, 128.61, 3.74, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:27:42.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:27:42.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:27:42.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:27:40, diff=2.342451s, valid=True
2026-05-29T00:27:42.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:27:42.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:27:42.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:12, diff=-29.654718s, valid=True
2026-05-29T00:27:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:27:42.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:27:42.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:27:33, diff=9.35189s, valid=True
2026-05-29T00:27:42.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:27:42.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:27:42.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:27:42.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:27:42.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:27:42.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:27:42.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:12, diff=-29.645119s, valid=True
2026-05-29T00:27:42.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:27:42.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:27:42.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:27:42.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939904.355531s, valid=True
2026-05-29T00:27:42.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:27:42.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:27:42.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:27:42.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:27:42.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:27:42.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:27:42.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:27:42.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:27:42.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:27:42.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:27:42.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:27:42.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:27:42.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:27:42.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:27:42.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:27:43.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:27:43.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:27:43.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:27:43.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-29T00:27:43.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-29T00:27:43.635 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:27:43.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:28:13.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:28:13.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:28:13.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:28:13.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:28:13.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:28:14.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:28:14.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-29T00:28:14.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:28:14.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-29T00:28:14.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:28:14.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:28:14.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:28:14.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-29T00:28:16.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-29T00:28:16.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:28:16.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:28:16.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:28:16.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:28:16.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:28:16.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:28:16.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:28:16.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:28:16.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:28:16.548 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:28:16.548 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:28:16.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:28:16.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:28:16.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:28:16.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:28:16.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:28:16.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:28:16.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:28:16.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:28:16.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:28:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:28:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:28:16.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:28:16.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:28:10
2026-05-29T00:28:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70410, datetime.datetime(2026, 5, 29, 0, 28, 10), datetime.datetime(2026, 5, 29, 0, 28, 10), 'salt', 6.52, 77.36, None, 8.72, 123.75, 3.67, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:28:16.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:28:16.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:28:16.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:10, diff=6.870066s, valid=True
2026-05-29T00:28:16.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:28:16.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:28:16.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:12, diff=4.872867s, valid=True
2026-05-29T00:28:16.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:28:16.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:04, diff=12.879375s, valid=True
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:28:16.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:28:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:12, diff=4.88235s, valid=True
2026-05-29T00:28:16.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:28:16.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:28:16.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:28:16.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939938.883012s, valid=True
2026-05-29T00:28:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:28:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:28:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:28:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:28:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:28:16.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:28:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:28:16.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:28:16.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:28:17.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:28:17.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:28:17.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:28:17.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:28:17.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:28:17.501 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:28:17.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:28:17.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:28:17.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:28:17.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-29T00:28:17.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-29T00:28:18.219 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:28:18.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:28:48.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:28:48.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:28:48.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:28:48.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:28:48.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:28:48.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:28:48.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-29T00:28:48.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00: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-29T00:28:48.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:28:48.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:28:48.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:28:48.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-29T00:28:51.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-29T00:28:51.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:28:51.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:28:51.465 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:28:51.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:28:51.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:28:51.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:28:51.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:28:51.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:28:51.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:28:51.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:28:51.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:28:51.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:28:51.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:28:51.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:28:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:28:51.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:28:51.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:28:51.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:28:51.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:28:51.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:28:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:28:51.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:28:51.769 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:28:51.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:28:41
2026-05-29T00:28:51.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70411, datetime.datetime(2026, 5, 29, 0, 28, 41), datetime.datetime(2026, 5, 29, 0, 28, 40), 'salt', 6.59, 77.3, None, 9.46, 121.49, 3.69, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:28:51.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:28:51.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:28:51.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:40, diff=11.83928s, valid=True
2026-05-29T00:28:51.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:28:51.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:28:51.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:12, diff=-20.157735s, valid=True
2026-05-29T00:28:51.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:28:51.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:28:36, diff=15.849031s, valid=True
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:28:51.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:28:51.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:12, diff=-20.147873s, valid=True
2026-05-29T00:28:51.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:28:51.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:28:51.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:28:51.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=939973.85281s, valid=True
2026-05-29T00:28:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:28:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:28:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:28:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:28:51.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:28:51.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:28:51.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:28:51.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:28:51.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:28:51.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:28:52.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:28:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:28:52.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:28:52.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:28:52.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:28:52.748 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:28:52.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:28:52.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:28:52.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-29T00:28:52.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-29T00:28:52.987 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:28:52.987 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:29:23.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:29:23.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:29:23.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:29:23.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:29:23.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:29:23.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:29:23.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-29T00:29:23.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:29:23.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-29T00:29:23.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:29:23.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:29:23.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:29:23.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:29:26.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-29T00:29:26.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:29:26.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:29:26.134 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:29:26.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:29:26.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:29:26.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:29:26.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:29:26.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:29:26.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:29:26.154 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:29:26.154 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:29:26.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:29:26.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:29:26.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:29:26.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:29:26.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:29:26.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:29:26.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:29:26.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:29:26.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:29:26.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:29:26.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:29:26.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:29:26.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:29:11
2026-05-29T00:29:26.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70412, datetime.datetime(2026, 5, 29, 0, 29, 11), datetime.datetime(2026, 5, 29, 0, 29, 10), 'salt', 6.65, 77.36, None, 8.47, 117.24, 3.67, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:29:26.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:29:26.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:29:26.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:10, diff=16.474468s, valid=True
2026-05-29T00:29:26.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:29:26.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:29:26.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:12, diff=14.477256s, valid=True
2026-05-29T00:29:26.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:29:26.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:29:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:07, diff=19.483801s, valid=True
2026-05-29T00:29:26.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:29:26.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:29:26.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:29:26.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:29:26.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:29:26.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:29:26.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:12, diff=14.486795s, valid=True
2026-05-29T00:29:26.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:29:26.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:29:26.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:29:26.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940008.487451s, valid=True
2026-05-29T00:29:26.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:29:26.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:29:26.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:29:26.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:29:26.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:29:26.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:29:26.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:29:26.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:29:26.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:29:26.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:29:26.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:29:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:29:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:29:26.874 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:29:27.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:29:27.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:29:27.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:29:27.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:29:27.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:29:27.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-29T00:29:27.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:29:27.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:29:57.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:29:57.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:29:57.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:29:58.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:29:58.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:29:58.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:29:58.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-29T00:29:58.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:29:58.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-29T00:29:58.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:29:58.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:29:58.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:29:58.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-29T00:30:00.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-29T00:30:00.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:30:00.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:30:00.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:30:00.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:30:00.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:30:00.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:30:00.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:30:00.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:30:00.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:30:00.573 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:30:00.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:30:00.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:30:00.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:30:00.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:30:00.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:30:00.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:30:00.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:30:00.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:30:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:30:00.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:30:00.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:30:00.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:30:00.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:30:00.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:29:41
2026-05-29T00:30:00.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70413, datetime.datetime(2026, 5, 29, 0, 29, 41), datetime.datetime(2026, 5, 29, 0, 29, 41), 'salt', 6.65, 77.23, None, 8.93, 119.68, 3.69, 832.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:30:00.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:30:00.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:30:00.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:41, diff=19.895891s, valid=True
2026-05-29T00:30:00.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:30:00.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:30:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:12, diff=-11.101321s, valid=True
2026-05-29T00:30:00.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:30:00.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:29:39, diff=21.905147s, valid=True
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:30:00.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:30:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:12, diff=-11.091859s, valid=True
2026-05-29T00:30:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:30:00.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:30:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:30:00.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940042.908799s, valid=True
2026-05-29T00:30:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:30:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:30:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:30:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:30:00.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:30:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:30:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:30:00.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:30:00.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:30:01.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:30:01.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:30:01.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:30:01.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:30:01.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:30:01.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:30:01.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:30:02.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:30:02.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:30:02.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-29T00:30:02.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-29T00:30:02.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:30:02.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:30:32.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:30:32.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:30:32.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:30:32.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:30:32.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:30:33.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:30:33.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-29T00:30:33.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:30:33.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-29T00:30:33.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:30:33.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:30:33.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:30:33.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-29T00:30:35.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-29T00:30:35.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:30:35.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:30:35.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:30:35.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:30:35.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:30:35.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:30:35.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:30:35.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:30:35.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:30:35.495 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:30:35.495 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:30:35.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:30:35.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:30:35.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:30:35.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:30:35.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:30:35.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:30:35.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:30:35.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:30:35.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:30:35.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:30:35.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:30:35.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:30:35.814 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:30:11
2026-05-29T00:30:35.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70414, datetime.datetime(2026, 5, 29, 0, 30, 11), datetime.datetime(2026, 5, 29, 0, 30, 11), 'salt', 6.69, 76.9, None, 9.56, 124.5, 3.76, 832.18, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:30:35.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:30:35.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:30:35.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:11, diff=24.821033s, valid=True
2026-05-29T00:30:35.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:30:35.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:30:35.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:12, diff=23.824403s, valid=True
2026-05-29T00:30:35.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:30:35.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:10, diff=25.831041s, valid=True
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:30:35.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:30:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:12, diff=23.834062s, valid=True
2026-05-29T00:30:35.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:30:35.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:30:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:30:35.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940077.834724s, valid=True
2026-05-29T00:30:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:30:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:30:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:30:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:30:35.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:30:35.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:30:35.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:30:35.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:30:35.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:30:35.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:30:36.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:30:36.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:30:36.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:30:36.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:30:36.458 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:30:36.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:30:36.917 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:30:36.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:30:36.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-29T00:30:36.918 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:30:37.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:30:37.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:31:07.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:31:07.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:31:07.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:31:07.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:31:07.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:31:07.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:31:07.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-29T00:31:07.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:31:07.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:31:07.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:31:07.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:31:07.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:31:07.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-29T00:31:10.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:31:10.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:31:10.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:31:10.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:31:10.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:31:10.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:31:10.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:31:10.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:31:10.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:31:10.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:31:10.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:31:10.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:31:10.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:31:10.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:31:10.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:31:10.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:31:10.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:31:10.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:31:10.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:31:10.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:31:10.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:31:10.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:31:10.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:31:10.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:31:10.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:30:41
2026-05-29T00:31:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70415, datetime.datetime(2026, 5, 29, 0, 30, 41), datetime.datetime(2026, 5, 29, 0, 30, 41), 'salt', 6.65, 76.67, None, 9.18, 119.43, 3.8, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:31:10.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:31:10.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:31:10.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:41, diff=29.864175s, valid=True
2026-05-29T00:31:10.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:31:10.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:31:10.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:31:12, diff=-1.133036s, valid=True
2026-05-29T00:31:10.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:31:10.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:30:34, diff=36.873397s, valid=True
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:31:10.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:31:10.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:31:12, diff=-1.122744s, valid=True
2026-05-29T00:31:10.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:31:10.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:31:10.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:31:10.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940112.878348s, valid=True
2026-05-29T00:31:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:31:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:31:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:31:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:31:10.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:31:10.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:31:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:31:10.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:31:10.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:31:11.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:31:11.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:31:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:31:11.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:31:11.211 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:31:11.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:31:11.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:31:11.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:31:11.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:31:11.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-29T00:31:11.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-29T00:31:12.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:31:12.082 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:31:42.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:31:42.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:31:42.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:31:42.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:31:42.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:31:42.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:31:42.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-29T00:31:42.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:31:42.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-29T00:31:42.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:31:42.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:31:42.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:31:42.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-29T00:31:45.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-29T00:31:45.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:31:45.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:31:45.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:31:45.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:31:45.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:31:45.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:31:45.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:31:45.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:31:45.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:31:45.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:31:45.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:31:45.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:31:45.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:31:45.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:31:45.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:31:45.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:31:45.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:31:45.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:31:46.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:31:46.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:31:46.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:31:46.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:31:46.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:31:46.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:31:42
2026-05-29T00:31:46.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70417, datetime.datetime(2026, 5, 29, 0, 31, 42), datetime.datetime(2026, 5, 29, 0, 31, 41), 'salt', 6.62, 76.37, None, 9.64, 115.81, 3.85, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:31:46.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:31:46.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:31:46.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:31:41, diff=5.091601s, valid=True
2026-05-29T00:31:46.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:31:46.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:31:46.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:12, diff=-25.905569s, valid=True
2026-05-29T00:31:46.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:31:46.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:31:35, diff=11.101021s, valid=True
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:31:46.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:31:46.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:12, diff=-25.896014s, valid=True
2026-05-29T00:31:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:31:46.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:31:46.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:31:46.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940148.104638s, valid=True
2026-05-29T00:31:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:31:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:31:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:31:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:31:46.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:31:46.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:31:46.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:31:46.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:31:46.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:31:46.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:31:46.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:31:46.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:31:46.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:31:46.502 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:31:46.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:31:47.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:31:47.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:31:47.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:31:47.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-29T00:31:47.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-29T00:31:47.358 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:31:47.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:32:17.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:32:17.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:32:17.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:32:17.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:32:17.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:32:17.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:32:17.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-29T00:32:17.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:32:17.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-29T00:32:17.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:32:17.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:32:17.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:32:17.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-29T00:32:20.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-29T00:32:20.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:32:20.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:32:20.250 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:32:20.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:32:20.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:32:20.268 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:32:20.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:32:20.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:32:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:32:20.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:32:20.268 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:32:20.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:32:20.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:32:20.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:32:20.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:32:20.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:32:20.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:32:20.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:32:20.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:32:20.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:32:20.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:32:20.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:32:20.544 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:32:20.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:32:12
2026-05-29T00:32:20.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70418, datetime.datetime(2026, 5, 29, 0, 32, 12), datetime.datetime(2026, 5, 29, 0, 32, 11), 'salt', 6.72, 76.67, None, 9.28, 113.84, 3.8, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:32:20.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:32:20.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:32:20.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:11, diff=9.61236s, valid=True
2026-05-29T00:32:20.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:32:20.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:32:20.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:12, diff=8.61516s, valid=True
2026-05-29T00:32:20.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:32:20.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:32:20.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:05, diff=15.621756s, valid=True
2026-05-29T00:32:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:32:20.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:32:20.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:32:20.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:32:20.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:32:20.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:32:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:12, diff=8.624739s, valid=True
2026-05-29T00:32:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:32:20.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:32:20.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:32:20.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940182.625389s, valid=True
2026-05-29T00:32:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:32:20.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:32:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:32:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:32:20.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:32:20.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:32:20.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:32:20.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:32:20.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:32:20.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:32:20.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:32:20.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:32:20.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:32:20.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:32:21.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:32:21.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:32:21.639 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:32:21.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:32: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-29T00:32: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-29T00:32:23.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:32:23.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:32:53.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:32:53.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:32:53.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:32:53.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:32:53.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:32:54.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:32:54.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-29T00:32:54.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:32:54.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-29T00:32:54.062 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:32:54.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:32:54.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:32:54.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-29T00:32:56.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-29T00:32:56.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:32:56.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:32:56.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:32:56.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:32:56.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:32:56.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:32:56.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:32:56.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:32:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:32:56.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:32:56.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:32:56.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:32:56.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:32:56.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:32:56.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:32:56.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:32:56.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:32:56.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:32:56.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:32:56.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:32:56.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:32:56.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:32:56.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:32:56.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:32:42
2026-05-29T00:32:56.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70419, datetime.datetime(2026, 5, 29, 0, 32, 42), datetime.datetime(2026, 5, 29, 0, 32, 42), 'salt', 6.72, 76.67, None, 8.86, 116.05, 3.8, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:32:56.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:32:56.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:32:56.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:42, diff=14.819011s, valid=True
2026-05-29T00:32:56.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:32:56.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:32:56.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:12, diff=-15.178186s, valid=True
2026-05-29T00:32:56.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:32:56.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:32:37, diff=19.828329s, valid=True
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:32:56.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:32:56.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:12, diff=-15.168701s, valid=True
2026-05-29T00:32:56.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:32:56.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:32:56.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:32:56.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940218.83197s, valid=True
2026-05-29T00:32:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:32:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:32:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:32:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:32:56.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:32:56.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:32:56.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:32:56.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:32:56.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:32:56.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:32:57.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:32:57.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:32:57.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:32:57.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:32:57.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:32:57.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:32:57.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:32:57.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:32:57.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-29T00:32:57.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-29T00:32:57.911 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:32:57.911 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:33:27.919 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:33:27.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:33:27.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:33:28.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:33:28.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:33:28.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:33:28.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-29T00:33:28.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:33:28.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-29T00:33:28.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:33:28.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:33:28.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:33:28.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-29T00:33:30.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-29T00:33:30.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:33:30.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:33:30.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:33:30.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:33:30.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:33:30.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:33:30.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:33:30.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:33:30.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:33:30.920 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:33:30.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:33:30.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:33:31.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:33:31.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:33:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:33:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:33:31.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:33:31.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:33:31.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:33:31.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:33:31.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:33:31.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:33:31.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:33:31.255 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:33:13
2026-05-29T00:33:31.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70420, datetime.datetime(2026, 5, 29, 0, 33, 13), datetime.datetime(2026, 5, 29, 0, 33, 12), 'salt', 6.69, 77.06, None, 9.6, 109.87, 3.73, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:33:31.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:33:31.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:33:31.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:12, diff=19.261807s, valid=True
2026-05-29T00:33:31.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:33:31.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:33:31.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:12, diff=19.268092s, valid=True
2026-05-29T00:33:31.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:33:31.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:08, diff=23.280994s, valid=True
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:33:31.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:33:31.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:12, diff=19.284046s, valid=True
2026-05-29T00:33:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:33:31.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:33:31.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:33:31.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940253.284743s, valid=True
2026-05-29T00:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:33:31.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:33:31.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:33:31.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:33:31.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:33:31.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:33:31.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:33:31.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:33:31.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:33:31.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:33:31.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:33:31.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:33:32.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:33:32.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:33:32.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:33:32.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-29T00:33:32.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-29T00:33:32.438 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:33:32.438 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:34:02.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:34:02.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:34:02.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:34:02.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:34:02.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:34:03.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:34: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-29T00:34:03.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:34:03.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-29T00:34:03.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:34:03.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:34:03.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:34:03.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-29T00:34:05.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-29T00:34:05.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:34:05.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:34:05.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:34:05.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:34:05.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:34:05.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:34:05.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:34:05.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:34:05.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:34:05.458 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:34:05.459 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:34:05.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:34:05.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:34:05.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:34:05.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:34:05.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:34:05.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:34:05.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:34:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:34:05.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:34:05.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:34:05.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:34:05.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:34:05.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:33:43
2026-05-29T00:34:05.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70421, datetime.datetime(2026, 5, 29, 0, 33, 43), datetime.datetime(2026, 5, 29, 0, 33, 42), 'salt', 6.65, 77.16, None, 10.27, 112.83, 3.71, 831.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:34:05.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:34:05.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:34:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:42, diff=23.790967s, valid=True
2026-05-29T00:34:05.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:34:05.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:34:05.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:12, diff=-6.206211s, valid=True
2026-05-29T00:34:05.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:34:05.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:33:40, diff=25.800487s, valid=True
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:34:05.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:34:05.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:12, diff=-6.196527s, valid=True
2026-05-29T00:34:05.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:34:05.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:34:05.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:34:05.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940287.804141s, valid=True
2026-05-29T00:34:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:34:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:34:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:34:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:34:05.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:34:05.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:34:05.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:34:05.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:34:05.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:34:05.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:34:06.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:34:06.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:34:06.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:34:06.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:34:06.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:34:06.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:34:06.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:34:06.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:34:06.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-29T00:34:06.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-29T00:34:07.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:34:07.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:34:37.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:34:37.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:34:37.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:34:37.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:34:37.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:34:37.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:34:37.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-29T00:34:37.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:34:37.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-29T00:34:37.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:34:37.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:34:37.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:34:37.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-29T00:34:40.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-29T00:34:40.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:34:40.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:34:40.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:34:40.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:34:40.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:34:40.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:34:40.049 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:34:40.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:34:40.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:34:40.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:34:40.049 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:34:40.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:34:40.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:34:40.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:34:40.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:34:40.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:34:40.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:34:40.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:34:40.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:34:40.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:34:40.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:34:40.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:34:40.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:34:40.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:34:13
2026-05-29T00:34:40.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70422, datetime.datetime(2026, 5, 29, 0, 34, 13), datetime.datetime(2026, 5, 29, 0, 34, 13), 'salt', 6.65, 77.46, None, 10.41, 112.31, 3.65, 832.0, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:34:40.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:34:40.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:34:40.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:13, diff=27.400936s, valid=True
2026-05-29T00:34:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:34:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:34:40.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:12, diff=28.403798s, valid=True
2026-05-29T00:34:40.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:34:40.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:11, diff=29.410364s, valid=True
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:34:40.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:34:40.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:34:12, diff=28.4134s, valid=True
2026-05-29T00:34:40.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:34:40.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:34:40.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:34:40.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940322.414071s, valid=True
2026-05-29T00:34:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:34:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:34:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:34:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:34:40.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:34:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:34:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:34:40.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:34:40.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:34:40.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:34:40.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:34:40.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:34:40.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:34:40.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:34:41.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:34:41.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:34:41.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:34:41.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:34:41.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-29T00:34:41.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-29T00:34:41.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:34:41.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:35:11.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:35:11.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:35:11.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:35:11.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:35:11.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:35:12.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:35:12.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-29T00:35:12.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:35:12.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-29T00:35:12.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:35:12.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:35:12.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:35:12.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-29T00:35:14.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-29T00:35:14.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:35:14.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:35:14.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:35:14.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:35:14.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:35:14.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:35:14.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:35:14.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:35:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:35:14.536 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:35:14.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:35:14.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:35:14.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T00:35:14.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:35:14.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T00:35:14.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:35:14.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:35:14.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:35:14.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:35:14.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:35:14.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:35:14.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:35:14.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:35:14.847 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:35:13
2026-05-29T00:35:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70424, datetime.datetime(2026, 5, 29, 0, 35, 13), datetime.datetime(2026, 5, 29, 0, 35, 13), 'salt', 6.72, 77.4, None, 9.71, 113.79, 3.67, 831.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:35:14.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:35:14.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T00:35:14.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:13, diff=1.853846s, valid=True
2026-05-29T00:35:14.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:35:14.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:35:14.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:12, diff=2.85668s, valid=True
2026-05-29T00:35:14.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:35:14.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:07, diff=7.863348s, valid=True
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:35:14.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:35:14.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:12, diff=2.866419s, valid=True
2026-05-29T00:35:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:35:14.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:35:14.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:35:14.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940356.867091s, valid=True
2026-05-29T00:35:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:35:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:35:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:35:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:35:14.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:35:14.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:35:14.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:35:14.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:35:14.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:35:15.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:35:15.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:35:15.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:35:15.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:35:15.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:35:15.402 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:35:15.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:35:15.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:35:15.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:35:15.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-29T00:35:15.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-29T00:35:16.103 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:35:16.103 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:35:46.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:35:46.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:35:46.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:35:46.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:35:46.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:35:46.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:35:46.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:35:46.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:35:46.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-29T00:35:46.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:35:46.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:35:46.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:35:46.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-29T00:35:49.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-29T00:35:49.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:35:49.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:35:49.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:35:49.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:35:49.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:35:49.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:35:49.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:35:49.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:35:49.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:35:49.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:35:49.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:35:49.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:35:49.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:35:49.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:35:49.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:35:49.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:35:49.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:35:49.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:35:49.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:35:49.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:35:49.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:35:49.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:35:49.471 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:35:49.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:35:44
2026-05-29T00:35:49.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70425, datetime.datetime(2026, 5, 29, 0, 35, 44), datetime.datetime(2026, 5, 29, 0, 35, 43), 'salt', 6.72, 77.3, None, 9.92, 117.06, 3.69, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:35:49.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:35:49.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:35:49.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:43, diff=6.535102s, valid=True
2026-05-29T00:35:49.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:35:49.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:35:49.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:12, diff=-22.46205s, valid=True
2026-05-29T00:35:49.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:35:49.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:35:37, diff=12.544484s, valid=True
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:35:49.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:35:49.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:12, diff=-22.452513s, valid=True
2026-05-29T00:35:49.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:35:49.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:35:49.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:35:49.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940391.548177s, valid=True
2026-05-29T00:35:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:35:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:35:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:35:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:35:49.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:35:49.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:35:49.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:35:49.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:35:49.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:35:49.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:35:49.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:35:49.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:35:49.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:35:49.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:35:50.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:35:50.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:35:50.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:35:50.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:35:50.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-29T00:35:50.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-29T00:35:50.744 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:35:50.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:36:20.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:36:20.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:36:20.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:36:21.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:36:21.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:36:21.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:36:21.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-29T00:36:21.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:36:21.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-29T00:36:21.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:36:21.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:36:21.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:36: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-29T00:36:23.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:36:23.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:36:23.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:36:23.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:36:23.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:36:23.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:36:23.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:36:23.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:36:23.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:36:23.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:36:23.555 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:36:23.555 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:36:23.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:36:23.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:36:23.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:36:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:36:23.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:36:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:36:23.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:36:23.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:36:23.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:36:23.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:36:23.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:36:23.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:36:23.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:36:14
2026-05-29T00:36:23.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70426, datetime.datetime(2026, 5, 29, 0, 36, 14), datetime.datetime(2026, 5, 29, 0, 36, 13), 'salt', 6.62, 77.2, None, 9.64, 119.0, 3.7, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:36:23.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:36:23.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:36:23.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:13, diff=10.915109s, valid=True
2026-05-29T00:36:23.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:36:23.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:36:23.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:12, diff=11.918531s, valid=True
2026-05-29T00:36:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:36:23.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:36:23.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:07, diff=16.925784s, valid=True
2026-05-29T00:36:23.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:36:23.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:36:23.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:36:23.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:36:23.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:36:23.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:36:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:12, diff=11.929375s, valid=True
2026-05-29T00:36:23.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:36:23.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:36:23.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:36:23.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940425.930175s, valid=True
2026-05-29T00:36:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:36:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:36:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:36:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:36:23.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:36:23.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:36:23.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:36:23.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:36:24.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:36:24.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:36:24.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:36:24.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:36:24.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:36:24.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:36:24.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:36:24.806 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:36:24.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:36:24.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:36:24.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-29T00:36:24.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-29T00:36:24.989 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:36:24.989 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:36:55.006 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:36:55.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:36:55.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:36:55.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:36:55.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:36:55.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:36:55.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-29T00:36:55.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:36:55.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-29T00:36:55.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:36:55.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:36:55.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:36:55.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-29T00:36:57.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-29T00:36:57.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:36:57.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:36:57.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:36:57.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:36:57.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:36:57.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:36:57.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:36:57.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:36:57.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:36:57.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:36:57.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:36:57.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:36:57.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:36:57.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:36:57.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:36:57.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:36:57.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:36:57.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:36:58.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:36:58.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:36:58.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:36:58.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:36:58.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:36:58.095 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:36:44
2026-05-29T00:36:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70427, datetime.datetime(2026, 5, 29, 0, 36, 44), datetime.datetime(2026, 5, 29, 0, 36, 44), 'salt', 6.65, 77.46, None, 9.88, 117.34, 3.65, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:36:58.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:36:58.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:36:58.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:44, diff=14.101182s, valid=True
2026-05-29T00:36:58.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:36:58.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:36:58.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:12, diff=-13.895927s, valid=True
2026-05-29T00:36:58.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:36:58.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:36:58.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:36:39, diff=19.110704s, valid=True
2026-05-29T00:36:58.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:36:58.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:36:58.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:36:58.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:36:58.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:36:58.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:36:58.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:12, diff=-13.886182s, valid=True
2026-05-29T00:36:58.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:36:58.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:36:58.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:36:58.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940460.114497s, valid=True
2026-05-29T00:36:58.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:36:58.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:36:58.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:36:58.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:36:58.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:36:58.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:36:58.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:36:58.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:36:58.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:36:58.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:36:58.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:36:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:36:58.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:36:58.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:36:58.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:36:59.112 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:36:59.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:36:59.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:36:59.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-29T00:36:59.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-29T00:36:59.292 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:36:59.292 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:37:29.322 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:37:29.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:37:29.322 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:37:29.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:37:29.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:37:30.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:37:30.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-29T00:37:30.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:37:30.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-29T00:37:30.234 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:37:30.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:37:30.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:37:30.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-29T00:37:32.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-29T00:37:32.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:37:32.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:37:32.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:37:32.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:37:32.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:37:32.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:37:32.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:37:32.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:37:32.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:37:32.662 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:37:32.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:37:32.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:37:32.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:37:32.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:37:32.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:37:32.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:37:32.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:37:32.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:37:32.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:37:32.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:37:32.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:37:32.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:37:32.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:37:32.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:37:14
2026-05-29T00:37:32.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70428, datetime.datetime(2026, 5, 29, 0, 37, 14), datetime.datetime(2026, 5, 29, 0, 37, 14), 'salt', 6.65, 78.26, None, 9.25, 116.37, 3.51, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:37:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:37:32.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:37:32.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:14, diff=18.988875s, valid=True
2026-05-29T00:37:32.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:37:32.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:37:32.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:12, diff=20.991787s, valid=True
2026-05-29T00:37:32.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:37:32.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:10, diff=22.998531s, valid=True
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:37:32.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:37:33.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:12, diff=21.001595s, valid=True
2026-05-29T00:37:33.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:37:33.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:37:33.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:37:33.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940495.00226s, valid=True
2026-05-29T00:37:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:37:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:37:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:37:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:37:33.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:37:33.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:37:33.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:37:33.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:37:33.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:37:33.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:37:33.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:37:33.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:37:33.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:37:33.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:37:33.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:37:33.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:37:33.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:37:33.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:37:33.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-29T00:37:33.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-29T00:37:34.203 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:37:34.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:38:04.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:38:04.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:38:04.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:38:04.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:38:04.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:38:04.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:38:04.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:38:04.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:38:04.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-29T00:38:04.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:38:04.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:38:04.729 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:38:04.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:38:07.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-29T00:38:07.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:38:07.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:38:07.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:38:07.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:38:07.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:38:07.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:38:07.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:38:07.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:38:07.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:38:07.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:38:07.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:38:07.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:38:07.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:38:07.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:38:07.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:38:07.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:38:07.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:38:07.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:38:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:38:07.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:38:07.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:38:07.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:38:07.357 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:38:07.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:37:45
2026-05-29T00:38:07.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70429, datetime.datetime(2026, 5, 29, 0, 37, 45), datetime.datetime(2026, 5, 29, 0, 37, 44), 'salt', 6.59, 78.39, None, 9.21, 116.94, 3.49, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:38:07.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:38:07.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:38:07.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:44, diff=23.420872s, valid=True
2026-05-29T00:38:07.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:38:07.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:38:07.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:12, diff=-4.576245s, valid=True
2026-05-29T00:38:07.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:38:07.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:37:42, diff=25.430501s, valid=True
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:38:07.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:38:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:12, diff=-4.566464s, valid=True
2026-05-29T00:38:07.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:38:07.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:38:07.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:38:07.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940529.43422s, valid=True
2026-05-29T00:38:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:38:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:38:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:38:07.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:38:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:38:07.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:38:07.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:38:07.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:38:07.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:38:07.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:38:07.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:38:07.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:38:07.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:38:07.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:38:08.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:38:08.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:38:08.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:38:08.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:38: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-29T00:38: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-29T00:38:08.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:38:08.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:38:38.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:38:38.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:38:38.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:38:38.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:38:38.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:38:38.900 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:38:38.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-29T00:38:38.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:38:38.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-29T00:38:38.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:38:38.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:38:38.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:38:38.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-29T00:38:42.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-29T00:38:42.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:38:42.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:38:42.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:38:42.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:38:42.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:38:42.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:38:42.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:38:42.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:38:42.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:38:42.097 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:38:42.097 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:38:42.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:38:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:38:42.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:38:42.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:38:42.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:38:42.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:38:42.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:38:42.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:38:42.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:38:42.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:38:42.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:38:42.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:38:42.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:38:15
2026-05-29T00:38:42.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70430, datetime.datetime(2026, 5, 29, 0, 38, 15), datetime.datetime(2026, 5, 29, 0, 38, 15), 'salt', 6.69, 79.19, None, 9.64, 121.87, 3.35, 831.87, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:38:42.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:38:42.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:38:42.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:15, diff=27.409758s, valid=True
2026-05-29T00:38:42.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:38:42.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:38:42.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:12, diff=30.412607s, valid=True
2026-05-29T00:38:42.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:38:42.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:13, diff=29.419212s, valid=True
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:38:42.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:38:42.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:38:12, diff=30.422282s, valid=True
2026-05-29T00:38:42.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:38:42.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:38:42.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:38:42.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940564.422956s, valid=True
2026-05-29T00:38:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:38:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:38:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:38:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:38:42.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:38:42.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:38:42.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:38:42.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:38:42.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:38:42.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:38:42.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:38:42.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:38:42.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:38:42.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:38:42.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:38:43.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:38:43.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:38:43.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:38:43.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-29T00:38:43.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-29T00:38:45.496 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:38:45.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:39:15.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:39:15.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:39:15.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:39:15.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:39:15.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:39:16.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:39:16.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-29T00:39:16.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:39:16.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-29T00:39:16.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:39:16.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:39:16.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:39:16.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-29T00:39:18.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-29T00:39:18.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:39:18.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:39:18.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:39:18.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:39:18.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:39:18.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:39:18.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:39:18.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:39:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:39:18.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:39:18.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:39:18.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:39:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T00:39:18.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:39:18.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T00:39:18.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:39:18.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:39:18.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:39:18.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:39:18.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:39:18.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:39:18.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:39:18.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:39:18.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:39:16
2026-05-29T00:39:18.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70432, datetime.datetime(2026, 5, 29, 0, 39, 16), datetime.datetime(2026, 5, 29, 0, 39, 15), 'salt', 6.49, 79.69, None, 9.53, 122.81, 3.25, 831.81, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T00:39:18.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:39:18.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T00:39:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:15, diff=3.790612s, valid=True
2026-05-29T00:39:18.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:39:18.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:39:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:12, diff=6.793415s, valid=True
2026-05-29T00:39:18.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:39:18.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T00:39:18.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:09, diff=9.799902s, valid=True
2026-05-29T00:39:18.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:39:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:39:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:39:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:39:18.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:39:18.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:39:18.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:12, diff=6.802848s, valid=True
2026-05-29T00:39:18.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:39:18.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:39:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:39:18.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940600.803491s, valid=True
2026-05-29T00:39:18.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:39:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:39:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:39:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:39:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:39:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:39:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:39:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:39:18.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:39:18.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:39:18.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:39:19.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:39:19.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:39:19.121 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:39:19.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:39:19.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:39:19.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:39:19.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:39:19.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-29T00:39:19.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-29T00:39:19.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:39:19.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:39:50.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:39:50.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:39:50.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:39:50.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:39:50.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:39:50.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:39:50.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-29T00:39:50.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:39:50.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-29T00:39:50.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:39:50.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:39:50.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:39:50.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-29T00:39:52.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-29T00:39:52.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:39:52.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:39:52.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:39:52.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:39:52.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:39:52.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:39:52.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:39:52.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:39:52.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:39:52.926 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:39:52.926 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:39:52.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:39:53.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:39:53.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:39:53.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:39:53.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:39:53.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:39:53.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:39:53.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:39:53.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:39:53.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:39:53.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:39:53.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:39:53.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:39:46
2026-05-29T00:39:53.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70433, datetime.datetime(2026, 5, 29, 0, 39, 46), datetime.datetime(2026, 5, 29, 0, 39, 45), 'salt', 6.62, 80.05, None, 9.49, 124.54, 3.19, 831.87, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:39:53.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:39:53.288 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:39:53.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:45, diff=8.303762s, valid=True
2026-05-29T00:39:53.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:39:53.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:39:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:12, diff=-18.688954s, valid=True
2026-05-29T00:39:53.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:39:53.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:39:53.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:39:39, diff=14.327963s, valid=True
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:39:53.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:39:53.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:12, diff=-18.6645s, valid=True
2026-05-29T00:39:53.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:39:53.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:39:53.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:39:53.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940635.337011s, valid=True
2026-05-29T00:39:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:39:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:39:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:39:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:39:53.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:39:53.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:39:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:39:53.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:39:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:39:53.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:39:53.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:39:53.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:39:53.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:39:53.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:39:53.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:39:54.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:39:54.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:39:54.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:39:54.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-29T00:39:54.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-29T00:39:54.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:39:54.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:40:24.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:40:24.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:40:24.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:40:25.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:40:25.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:40:25.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:40:25.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-29T00:40:25.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:40:25.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-29T00:40:25.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:40:25.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:40:25.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:40:25.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-29T00:40:28.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-29T00:40:28.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:40:28.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:40:28.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:40:28.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:40:28.027 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:40:28.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:40:28.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:40:28.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:40:28.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:40:28.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:40:28.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:40:28.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:40:28.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:40:28.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:40:28.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:40:28.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:40:28.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:40:28.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:40:28.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:40:28.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:40:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:40:28.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:40:28.300 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:40:28.359 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:40:16
2026-05-29T00:40:28.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70434, datetime.datetime(2026, 5, 29, 0, 40, 16), datetime.datetime(2026, 5, 29, 0, 40, 16), 'salt', 6.59, 80.48, None, 9.92, 127.1, 3.11, 831.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:40:28.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:40:28.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:40:28.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:16, diff=12.365153s, valid=True
2026-05-29T00:40:28.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:40:28.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:40:28.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:12, diff=16.367998s, valid=True
2026-05-29T00:40:28.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:40:28.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:10, diff=18.374589s, valid=True
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:40:28.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:40:28.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:40:28.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:12, diff=16.377599s, valid=True
2026-05-29T00:40:28.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:40:28.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:40:28.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:40:28.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940670.378265s, valid=True
2026-05-29T00:40:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:40:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:40:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:40:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:40:28.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:40:28.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:40:28.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:40:28.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:40:28.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:40:28.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:40:28.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:40:28.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:40:28.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:40:28.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:40:28.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:40:29.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:40:29.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:40:29.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:40:29.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-29T00:40:29.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-29T00:40:29.434 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:40:29.434 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:40:59.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:40:59.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:40:59.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:40:59.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:40:59.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:41:00.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:41:00.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-29T00:41:00.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:41:00.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-29T00:41:00.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:41:00.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:41:00.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:41:00.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:41:02.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-29T00:41:02.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:41:02.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:41:02.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:41:02.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:41:02.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:41:02.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:41:02.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:41:02.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:41:02.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:41:02.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:41:02.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:41:02.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:41:02.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:41:02.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:41:02.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:41:02.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:41:02.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:41:02.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:41:02.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:41:02.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:41:02.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:41:02.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:41:02.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:41:02.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:40:46
2026-05-29T00:41:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70435, datetime.datetime(2026, 5, 29, 0, 40, 46), datetime.datetime(2026, 5, 29, 0, 40, 46), 'salt', 6.59, 80.91, None, 9.53, 127.27, 3.04, 831.87, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:41:02.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:41:02.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:41:02.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:46, diff=16.90278s, valid=True
2026-05-29T00:41:02.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:41:02.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:41:02.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:12, diff=-9.094324s, valid=True
2026-05-29T00:41:02.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:41:02.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:40:40, diff=22.912409s, valid=True
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:41:02.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:41:02.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:12, diff=-9.084535s, valid=True
2026-05-29T00:41:02.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:41:02.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:41:02.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:41:02.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940704.916136s, valid=True
2026-05-29T00:41:02.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:41:02.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:41:02.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:41:02.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:41:02.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:41:02.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:41:02.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:41:02.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:41:02.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:41:03.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:41:03.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:41:03.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:41:03.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:41:03.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:41:03.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:41:03.858 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:41:03.953 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:41:03.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:41: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-29T00:41: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-29T00:41:04.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:41:04.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:41:34.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:41:34.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:41:34.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:41:34.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:41:34.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:41:34.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:41:34.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-29T00:41:34.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:41:34.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-29T00:41:34.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:41:34.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:41:34.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:41:34.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-29T00:41:37.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-29T00:41:37.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:41:37.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:41:37.022 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:41:37.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:41:37.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:41:37.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:41:37.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:41:37.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:41:37.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:41:37.043 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:41:37.043 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:41:37.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:41:37.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:41:37.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:41:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:41:37.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:41:37.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:41:37.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:41:37.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:41:37.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:41:37.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:41:37.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:41:37.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:41:37.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:41:16
2026-05-29T00:41:37.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70436, datetime.datetime(2026, 5, 29, 0, 41, 16), datetime.datetime(2026, 5, 29, 0, 41, 16), 'salt', 6.72, 81.35, None, 9.88, 127.03, 2.96, 831.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:41:37.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:41:37.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:41:37.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:16, diff=21.353397s, valid=True
2026-05-29T00:41:37.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:41:37.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:41:37.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:12, diff=25.35621s, valid=True
2026-05-29T00:41:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:41:37.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:41:37.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:11, diff=26.362684s, valid=True
2026-05-29T00:41:37.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:41:37.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:41:37.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:41:37.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:41:37.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:41:37.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:41:37.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:12, diff=25.365821s, valid=True
2026-05-29T00:41:37.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:41:37.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:41:37.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:41:37.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940739.366477s, valid=True
2026-05-29T00:41:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:41:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:41:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:41:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:41:37.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:41:37.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:41:37.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:41:37.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:41:37.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:41:37.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:41:37.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:41:37.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:41:37.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:41:37.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:41:37.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:41:38.223 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:41:38.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:41:38.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:41:38.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-29T00:41:38.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-29T00:41:38.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:41:38.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:42:08.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:42:08.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:42:08.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:42:08.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:42:08.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:42:09.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:42:09.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-29T00:42:09.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:42:09.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-29T00:42:09.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:42:09.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:42:09.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:42:09.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-29T00:42:12.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-29T00:42:12.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:42:12.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:42:12.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:42:12.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:42:12.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:42:12.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:42:12.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:42:12.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:42:12.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:42:12.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:42:12.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:42:12.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:42:12.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:42:12.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:42:12.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:42:12.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:42:12.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:42:12.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:42:12.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:42:12.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:42:12.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:42:12.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:42:12.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:42:12.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:41:47
2026-05-29T00:42:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70437, datetime.datetime(2026, 5, 29, 0, 41, 47), datetime.datetime(2026, 5, 29, 0, 41, 46), 'salt', 6.72, 81.91, None, 9.99, 127.36, 2.87, 832.06, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:42:12.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:42:12.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:42:12.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:46, diff=26.556374s, valid=True
2026-05-29T00:42:12.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:42:12.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:42:12.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:12, diff=0.559162s, valid=True
2026-05-29T00:42:12.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:42:12.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:42:12.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:41:43, diff=29.565763s, valid=True
2026-05-29T00:42:12.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:42:12.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:42:12.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:42:12.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:42:12.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:42:12.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:42:12.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:12, diff=0.568847s, valid=True
2026-05-29T00:42:12.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:42:12.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:42:12.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:42:12.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940774.569498s, valid=True
2026-05-29T00:42:12.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:42:12.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:42:12.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:42:12.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:42:12.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:42:12.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:42:12.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:42:12.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:42:12.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:42:12.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:42:12.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:42:12.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:42:12.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:42:12.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:42:13.321 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:42:13.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:42:13.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:42:13.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:42:13.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-29T00:42:13.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-29T00:42:13.852 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:42:13.853 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:42:43.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:42:43.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:42:43.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:42:43.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:42:43.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:42:44.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:42:44.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-29T00:42:44.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:42:44.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-29T00:42:44.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:42:44.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:42:44.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:42:44.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-29T00:42:46.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-29T00:42:46.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:42:46.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:42:46.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:42:46.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:42:46.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:42:46.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:42:46.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:42:46.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:42:46.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:42:46.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:42:46.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:42:46.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:42:46.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:42:46.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:42:46.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:42:46.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:42:46.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:42:46.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:42:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:42:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:42:46.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:42:46.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:42:46.949 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:42:47.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:42:17
2026-05-29T00:42:47.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70438, datetime.datetime(2026, 5, 29, 0, 42, 17), datetime.datetime(2026, 5, 29, 0, 42, 17), 'salt', 6.72, 82.14, None, 9.49, 126.19, 2.82, 832.06, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:42:47.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:42:47.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:42:47.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:17, diff=30.013841s, valid=True
2026-05-29T00:42:47.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:42:47.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:42:47.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:12, diff=35.016691s, valid=True
2026-05-29T00:42:47.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:42:47.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:15, diff=32.023306s, valid=True
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:42:47.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:42:47.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:42:12, diff=35.026331s, valid=True
2026-05-29T00:42:47.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:42:47.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:42:47.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:42:47.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940809.026985s, valid=True
2026-05-29T00:42:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:42:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:42:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:42:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:42:47.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:42:47.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:42:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:42:47.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:42:47.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:42:47.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:42:47.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:42:47.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:42:47.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:42:47.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:42:47.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:42:47.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:42:47.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:42:47.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:42:47.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-29T00:42:47.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-29T00:42:48.201 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:42:48.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:43:18.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:43:18.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:43:18.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:43:18.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:43:18.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:43:18.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:43:18.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-29T00:43:18.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:43:18.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:43:18.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:43:18.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:43:18.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:43:18.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:43:21.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-29T00:43:21.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:43:21.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:43:21.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:43:21.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:43:21.375 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:43:21.386 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:43:21.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:43:21.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:43:21.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:43:21.387 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:43:21.387 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:43:21.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:43:21.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T00:43:21.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:43:21.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:43:21.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:43:21.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:43:21.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:43:21.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:43:21.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:43:21.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:43:21.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:43:21.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:43:21.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:43:17
2026-05-29T00:43:21.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70440, datetime.datetime(2026, 5, 29, 0, 43, 17), datetime.datetime(2026, 5, 29, 0, 43, 17), 'salt', 6.69, 82.77, None, 9.64, 130.18, 2.72, 831.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:43:21.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:43:21.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T00:43:21.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:17, diff=4.737878s, valid=True
2026-05-29T00:43:21.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:43:21.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:43:21.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:12, diff=9.740761s, valid=True
2026-05-29T00:43:21.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:43:21.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:11, diff=10.747543s, valid=True
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:43:21.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:43:21.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:43:21.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:12, diff=9.75065s, valid=True
2026-05-29T00:43:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:43:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:43:21.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:43:21.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940843.751322s, valid=True
2026-05-29T00:43:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:43:21.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:43:21.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:43:21.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:43:21.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:43:21.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:43:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:43:21.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:43:21.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:43:21.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:43:21.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:43:21.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:43:22.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:43:22.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:43:22.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:43:22.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:43:22.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:43:22.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:43: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-29T00:43: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-29T00:43:22.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:43:22.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:43:52.921 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:43:52.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:43:52.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:43:53.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:43:53.900 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:43:54.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:43:54.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-29T00:43:54.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:43:54.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-29T00:43:54.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:43:54.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:43:54.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:43:54.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-29T00:43:56.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-29T00:43:56.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:43:56.533 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:43:56.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:43:56.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:43:56.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:43:56.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:43:56.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:43:56.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:43:56.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:43:56.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:43:56.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:43:56.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:43:56.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:43:56.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:43:56.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:43:56.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:43:56.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:43:56.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:43:56.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:43:56.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:43:56.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:43:56.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:43:56.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:43:56.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:43:48
2026-05-29T00:43:56.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70441, datetime.datetime(2026, 5, 29, 0, 43, 48), datetime.datetime(2026, 5, 29, 0, 43, 47), 'salt', 6.49, 83.1, None, 9.67, 126.05, 2.66, 831.87, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:43:56.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:43:56.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:43:56.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:47, diff=9.87591s, valid=True
2026-05-29T00:43:56.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:43:56.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:43:56.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:12, diff=-15.12124s, valid=True
2026-05-29T00:43:56.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:43:56.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:43:41, diff=15.885417s, valid=True
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:43:56.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:43:56.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:12, diff=-15.111584s, valid=True
2026-05-29T00:43:56.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:43:56.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:43:56.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:43:56.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940878.889098s, valid=True
2026-05-29T00:43:56.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:43:56.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:43:56.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:43:56.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:43:56.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:43:56.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:43:56.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:43:56.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:43:56.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:43:57.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:43:57.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:43:57.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:43:57.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:43:57.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:43:57.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:43:57.766 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:43:57.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:43:57.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:43:57.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-29T00:43:57.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-29T00:43:59.301 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:43:59.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:44:29.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:44:29.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:44:29.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:44:29.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:44:29.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:44:29.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:44:29.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:44:29.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:44:29.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:44:29.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:44:29.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:44:29.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:44:29.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-29T00:44:32.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-29T00:44:32.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:44:32.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:44:32.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:44:32.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:44:32.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:44:32.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:44:32.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:44:32.983 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:44:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:44:32.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:44:32.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:44:32.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:44:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:44:33.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:44:33.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:44:33.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:44:33.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:44:33.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:44:33.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:44:33.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:44:33.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:44:33.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:44:33.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:44:33.297 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:44:18
2026-05-29T00:44:33.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70442, datetime.datetime(2026, 5, 29, 0, 44, 18), datetime.datetime(2026, 5, 29, 0, 44, 17), 'salt', 6.55, 83.4, None, 9.18, 126.14, 2.6, 831.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:44:33.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:44:33.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:44:33.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:17, diff=16.303203s, valid=True
2026-05-29T00:44:33.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:44:33.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:44:33.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:12, diff=21.306114s, valid=True
2026-05-29T00:44:33.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:44:33.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:44:33.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:12, diff=21.312774s, valid=True
2026-05-29T00:44:33.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:44:33.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:44:33.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:44:33.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:44:33.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:44:33.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:44:33.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:12, diff=21.315852s, valid=True
2026-05-29T00:44:33.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:44:33.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:44:33.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:44:33.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940915.316516s, valid=True
2026-05-29T00:44:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:44:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:44:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:44:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:44:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:44:33.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:44:33.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:44:33.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:44:33.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:44:33.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:44:33.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:44:33.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:44:33.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:44:33.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:44:34.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:44:34.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:44:34.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:44:34.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:44:34.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-29T00:44:34.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-29T00:44:34.710 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:44:34.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:45:04.713 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:45:04.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:45:04.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:45:04.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:45:04.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:45:05.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:45:05.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:45:05.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:45:05.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-29T00:45:05.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:45:05.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:45:05.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:45:05.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-29T00:45:07.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:45:07.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:45:07.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:45:07.723 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:45:07.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:45:07.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:45:07.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:45:07.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:45:07.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:45:07.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:45:07.743 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:45:07.743 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:45:07.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:45:07.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:45:07.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:45:07.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:45:07.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:45:08.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:45:08.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:45:08.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:45:08.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:45:08.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:45:08.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:45:08.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:45:08.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:44:48
2026-05-29T00:45:08.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70443, datetime.datetime(2026, 5, 29, 0, 44, 48), datetime.datetime(2026, 5, 29, 0, 44, 48), 'salt', 6.62, 83.93, None, 8.65, 127.34, 2.51, 832.0, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T00:45:08.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:45:08.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:45:08.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:48, diff=20.123603s, valid=True
2026-05-29T00:45:08.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:45:08.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:45:08.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:12, diff=-3.873479s, valid=True
2026-05-29T00:45:08.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:45:08.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:44:42, diff=26.133381s, valid=True
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:45:08.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:45:08.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:12, diff=-3.863503s, valid=True
2026-05-29T00:45:08.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:45:08.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:45:08.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:45:08.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940950.137174s, valid=True
2026-05-29T00:45:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:45:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:45:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:45:08.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:45:08.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:45:08.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:45:08.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:45:08.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:45:08.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:45:08.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:45:08.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:45:08.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:45:08.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:45:08.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:45:08.654 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:45:08.986 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:45:09.086 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:45:09.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:45:09.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-29T00:45:09.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-29T00:45:09.304 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:45:09.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:45:39.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:45:39.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:45:39.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:45:39.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:45:39.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:45:39.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:45:39.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-29T00:45:39.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:45: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-29T00:45:39.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:45:39.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:45:39.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:45:39.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-29T00:45:42.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-29T00:45:42.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:45:42.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:45:42.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:45:42.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:45:42.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:45:42.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:45:42.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:45:42.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:45:42.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:45:42.526 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:45:42.526 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:45:42.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:45:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:45:42.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:45:42.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:45:42.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:45:42.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:45:42.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:45:42.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:45:42.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:45:42.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:45:42.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:45:42.780 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:45:42.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:45:18
2026-05-29T00:45:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70444, datetime.datetime(2026, 5, 29, 0, 45, 18), datetime.datetime(2026, 5, 29, 0, 45, 18), 'salt', 6.65, 84.1, None, 9.64, 131.99, 2.48, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:45:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:45:42.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:45:42.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:18, diff=24.844174s, valid=True
2026-05-29T00:45:42.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:45:42.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:45:42.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:12, diff=30.847007s, valid=True
2026-05-29T00:45:42.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:45:42.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:13, diff=29.853519s, valid=True
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:45:42.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:45:42.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:12, diff=30.856526s, valid=True
2026-05-29T00:45:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:45:42.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:45:42.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:45:42.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=940984.857183s, valid=True
2026-05-29T00:45:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:45:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:45:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:45:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:45:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:45:42.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:45:42.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:45:42.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:45:42.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:45:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:45:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:45:43.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:45:43.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:45:43.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:45:43.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:45:43.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:45:43.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:45:43.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:45:43.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-29T00:45:43.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-29T00:45:43.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:45:43.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:46:13.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:46:13.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:46:13.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:46:14.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:46:14.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:46:14.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:46:14.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-29T00:46:14.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:46:14.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-29T00:46:14.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:46:14.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:46:14.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:46:14.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:46:17.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:46:17.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:46:17.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:46:17.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:46:17.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:46:17.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:46:17.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:46:17.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:46:17.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:46:17.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:46:17.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:46:17.104 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:46:17.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:46:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:46:17.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:46:17.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:46:17.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:46:17.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:46:17.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:46:17.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:46:17.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:46:17.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:46:17.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:46:17.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:46:17.427 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:45:48
2026-05-29T00:46:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70445, datetime.datetime(2026, 5, 29, 0, 45, 48), datetime.datetime(2026, 5, 29, 0, 45, 48), 'salt', 6.55, 84.27, None, 9.6, 129.03, 2.45, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:46:17.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:46:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:46:17.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:48, diff=29.433895s, valid=True
2026-05-29T00:46:17.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:46:17.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:46:17.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:46:12, diff=5.43734s, valid=True
2026-05-29T00:46:17.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:46:17.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:46:17.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:45:44, diff=33.443969s, valid=True
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:46:17.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:46:17.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:46:12, diff=5.44696s, valid=True
2026-05-29T00:46:17.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:46:17.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:46:17.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:46:17.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941019.447613s, valid=True
2026-05-29T00:46:17.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:46:17.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:46:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:46:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:46:17.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:46:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:46:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:46:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:46:17.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:46:17.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:46:17.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:46:17.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:46:17.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:46:17.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:46:17.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:46:18.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:46:18.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:46:18.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:46:18.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-29T00:46:18.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-29T00:46:18.518 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:46:18.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:46:48.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:46:48.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:46:48.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:46:49.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:46:49.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:46:49.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:46:49.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:46:49.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:46:49.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-29T00:46:49.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:46:49.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:46:49.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:46:49.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-29T00:46:52.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-29T00:46:52.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:46:52.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:46:52.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:46:52.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:46:52.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:46:52.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:46:52.569 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:46:52.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:46:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:46:52.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:46:52.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:46:52.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:46:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:46:52.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:46:52.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:46:52.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:46:52.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:46:52.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:46:52.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:46:52.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:46:52.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:46:52.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:46:52.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:46:52.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:46:49
2026-05-29T00:46:52.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70447, datetime.datetime(2026, 5, 29, 0, 46, 49), datetime.datetime(2026, 5, 29, 0, 46, 49), 'salt', 6.32, 84.53, None, 9.39, 128.87, 2.41, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:46:52.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:46:52.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:46:52.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:46:49, diff=3.896004s, valid=True
2026-05-29T00:46:52.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:46:52.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:46:52.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:12, diff=-19.10121s, valid=True
2026-05-29T00:46:52.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:46:52.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:46:47, diff=5.905262s, valid=True
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:46:52.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:46:52.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:12, diff=-19.091779s, valid=True
2026-05-29T00:46:52.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:46:52.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:46:52.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:46:52.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941054.908889s, valid=True
2026-05-29T00:46:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:46:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:46:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:46:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:46:52.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:46:52.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:46:52.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:46:52.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:46:52.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:46:53.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:46:53.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:46:53.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:46:53.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:46:53.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:46:53.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:46:53.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:46:53.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:46:53.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:46:53.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-29T00:46:53.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-29T00:46:54.087 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:46:54.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:47:24.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:47:24.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:47:24.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:47:24.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:47:24.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:47:24.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:47:24.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-29T00:47:24.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:47:24.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-29T00:47:24.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:47:24.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:47:24.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:47:24.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-29T00:47:28.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-29T00:47:28.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:47:28.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:47:28.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:47:28.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:47:28.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:47:28.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:47:28.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:47:28.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:47:28.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:47:28.571 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:47:28.571 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:47:28.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:47:28.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:47:28.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:47:28.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:47:28.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:47:28.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:47:28.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:47:28.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:47:28.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:47:28.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:47:28.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:47:28.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:47:28.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:47:19
2026-05-29T00:47:28.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70448, datetime.datetime(2026, 5, 29, 0, 47, 19), datetime.datetime(2026, 5, 29, 0, 47, 19), 'salt', 6.49, 84.8, None, 9.74, 129.34, 2.37, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:47:28.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:47:28.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:47:28.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:19, diff=9.893262s, valid=True
2026-05-29T00:47:28.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:47:28.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:47:28.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:12, diff=16.89613s, valid=True
2026-05-29T00:47:28.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:47:28.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:47:28.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:19, diff=9.902708s, valid=True
2026-05-29T00:47:28.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:47:28.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:47:28.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:47:28.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:47:28.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:47:28.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:47:28.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:12, diff=16.905709s, valid=True
2026-05-29T00:47:28.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:47:28.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:47:28.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:47:28.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941090.906353s, valid=True
2026-05-29T00:47:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:47:28.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:47:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:47:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:47:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:47:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:47:28.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:47:28.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:47:28.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:47:29.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:47:29.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:47:29.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:47:29.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:47:29.240 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:47:29.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:47:29.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:47:29.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:47:29.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:47:29.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:47:29.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:47:30.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:47:30.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:48:00.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:48:00.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:48:00.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:48:00.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:48:00.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:48:00.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:48:00.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-29T00:48:00.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:48:00.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-29T00:48:00.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:48:00.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:48:00.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:48:00.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-29T00:48:03.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-29T00:48:03.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:48:03.068 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:48:03.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:48:03.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:48:03.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:48:03.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:48:03.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:48:03.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:48:03.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:48:03.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:48:03.092 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:48:03.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:48:03.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:48:03.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:48:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:48:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:48:03.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:48:03.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:48:03.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:48:03.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:48:03.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:48:03.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:48:03.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:48:03.415 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:47:49
2026-05-29T00:48:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70449, datetime.datetime(2026, 5, 29, 0, 47, 49), datetime.datetime(2026, 5, 29, 0, 47, 49), 'salt', 6.39, 85.06, None, 9.53, 129.78, 2.32, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:48:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:48:03.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:48:03.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:49, diff=14.421277s, valid=True
2026-05-29T00:48:03.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:48:03.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:48:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:12, diff=-8.573447s, valid=True
2026-05-29T00:48:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:48:03.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:47:44, diff=19.433237s, valid=True
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:48:03.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:48:03.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:12, diff=-8.563659s, valid=True
2026-05-29T00:48:03.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:48:03.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:48:03.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:48:03.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941125.43702s, valid=True
2026-05-29T00:48:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:48:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:48:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:48:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:48:03.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:48:03.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:48:03.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:48:03.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:48:03.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:48:03.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:48:03.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:48:03.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:48:03.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:48:03.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:48:04.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:48:04.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:48:04.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:48:04.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:48:04.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-29T00:48:04.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-29T00:48:04.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:48:04.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:48:34.574 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:48:34.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:48:34.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:48:34.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:48:34.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:48:34.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:48:34.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:48:34.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:48:34.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T00:48:34.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:48:34.930 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:48:34.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:48: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-29T00:48:37.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-29T00:48:37.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:48:37.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:48:37.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:48:37.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:48:37.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:48:37.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:48:37.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:48:37.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:48:37.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:48:37.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:48:37.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:48:37.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:48:37.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:48:37.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:48:37.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:48:37.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:48:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:48:38.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:48:38.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:48:38.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:48:38.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:48:38.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:48:38.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:48:38.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:48:20
2026-05-29T00:48:38.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70450, datetime.datetime(2026, 5, 29, 0, 48, 20), datetime.datetime(2026, 5, 29, 0, 48, 19), 'salt', 6.36, 85.26, None, 9.95, 130.11, 2.29, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:48:38.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:48:38.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:48:38.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:19, diff=19.133608s, valid=True
2026-05-29T00:48:38.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:48:38.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:48:38.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:12, diff=26.136493s, valid=True
2026-05-29T00:48:38.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:48:38.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:14, diff=24.143124s, valid=True
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:48:38.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:48:38.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:12, diff=26.146151s, valid=True
2026-05-29T00:48:38.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:48:38.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:48:38.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:48:38.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941160.146822s, valid=True
2026-05-29T00:48:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:48:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:48:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:48:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:48:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:48:38.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:48:38.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:48:38.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:48:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:48:38.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:48:38.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:48:38.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:48:38.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:48:38.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:48:38.661 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:48:39.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:48:39.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:48:39.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:48:39.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-29T00:48:39.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-29T00:48:39.242 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:48:39.243 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:49:09.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:49:09.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:49:09.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:49:09.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:49:09.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:49:09.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:49:09.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-29T00:49:09.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:49:09.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-29T00:49:09.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:49:09.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:49:09.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:49:09.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-29T00:49:12.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-29T00:49:12.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:49:12.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:49:12.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:49:12.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:49:12.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:49:12.842 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:49:12.842 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:49:12.842 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:49:12.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:49:12.843 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:49:12.843 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:49:12.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:49:12.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:49:12.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:49:13.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:49:13.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:49:13.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:49:13.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:49:13.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:49:13.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:49:13.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:49:13.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:49:13.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:49:13.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:48:50
2026-05-29T00:49:13.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70451, datetime.datetime(2026, 5, 29, 0, 48, 50), datetime.datetime(2026, 5, 29, 0, 48, 49), 'salt', 6.52, 85.76, None, 9.35, 127.11, 2.21, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:49:13.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:49:13.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:49:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:49, diff=24.16347s, valid=True
2026-05-29T00:49:13.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:49:13.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:49:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:12, diff=1.166299s, valid=True
2026-05-29T00:49:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:49:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:49:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:48:43, diff=30.172795s, valid=True
2026-05-29T00:49:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:49:13.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:49:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:49:13.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:49:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:49:13.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:49:13.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:12, diff=1.175811s, valid=True
2026-05-29T00:49:13.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:49:13.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:49:13.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:49:13.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941195.176466s, valid=True
2026-05-29T00:49:13.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:49:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:49:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:49:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:49:13.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:49:13.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:49:13.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:49:13.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:49:13.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:49:13.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:49:13.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:49:13.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:49:13.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:49:13.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:49:13.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:49:14.024 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:49:14.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:49:14.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:49: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-29T00:49:14.123 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:49:14.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:49:14.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:49:44.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:49:44.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:49:44.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:49:44.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:49:44.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:49:44.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:49:44.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-29T00:49:44.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:49:44.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-29T00:49:44.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:49:44.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:49:44.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:49:44.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-29T00:49:47.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:49:47.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:49:47.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:49:47.054 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:49:47.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:49:47.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:49:47.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:49:47.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:49:47.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:49:47.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:49:47.073 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:49:47.073 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:49:47.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:49:47.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:49:47.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:49:47.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:49:47.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:49:47.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:49:47.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:49:47.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:49:47.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:49:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:49:47.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:49:47.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:49:47.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:49:21
2026-05-29T00:49:47.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70452, datetime.datetime(2026, 5, 29, 0, 49, 21), datetime.datetime(2026, 5, 29, 0, 49, 20), 'salt', 6.59, 85.99, None, 9.46, 126.45, 2.17, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:49:47.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:49:47.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:49:47.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:20, diff=27.384424s, valid=True
2026-05-29T00:49:47.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:49:47.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:49:47.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:12, diff=35.387299s, valid=True
2026-05-29T00:49:47.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:49:47.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:49:47.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:15, diff=32.393972s, valid=True
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:49:47.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:49:47.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:49:12, diff=35.397035s, valid=True
2026-05-29T00:49:47.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:49:47.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:49:47.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:49:47.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941229.397733s, valid=True
2026-05-29T00:49:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:49:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:49:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:49:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:49:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:49:47.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:49:47.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:49:47.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:49:47.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:49:47.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:49:47.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:49:47.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:49:47.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:49:47.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:49:47.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:49:48.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:49:48.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:49:48.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:49:48.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-29T00:49:48.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-29T00:49:48.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:49:48.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:50:18.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:50:18.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:50:18.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:50:18.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:50:18.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:50:19.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:50:19.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-29T00:50:19.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:50:19.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-29T00:50:19.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:50:19.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:50:19.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:50:19.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-29T00:50:22.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-29T00:50:22.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:50:22.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:50:22.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:50:22.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:50:22.449 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:50:22.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:50:22.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:50:22.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:50:22.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:50:22.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:50:22.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:50:22.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:50:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T00:50:22.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:50:22.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T00:50:22.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:50:22.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:50:22.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:50:22.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:50:22.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:50:22.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:50:22.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:50:22.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:50:22.772 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:50:21
2026-05-29T00:50:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70454, datetime.datetime(2026, 5, 29, 0, 50, 21), datetime.datetime(2026, 5, 29, 0, 50, 21), 'salt', 6.65, 86.26, None, 9.71, 128.26, 2.12, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:50:22.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:50:22.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T00:50:22.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:21, diff=1.778794s, valid=True
2026-05-29T00:50:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:50:22.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:50:22.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:12, diff=10.781637s, valid=True
2026-05-29T00:50:22.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:50:22.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:17, diff=5.788119s, valid=True
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:50:22.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:50:22.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:12, diff=10.79113s, valid=True
2026-05-29T00:50:22.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:50:22.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:50:22.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:50:22.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941264.791806s, valid=True
2026-05-29T00:50:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:50:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:50:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:50:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:50:22.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:50:22.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:50:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:50:22.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:50:22.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:50:22.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:50:22.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:50:23.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:50:23.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:50:23.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:50:23.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:50:23.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:50:23.737 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:50:23.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:50:23.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-29T00:50:23.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-29T00:50:24.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:50:24.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:50:54.021 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:50:54.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:50:54.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:50:54.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:50:54.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:50:54.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:50:54.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:50:54.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:50:54.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-29T00:50:54.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:50:54.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:50:54.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:50:54.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-29T00:50:56.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-29T00:50:56.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:50:56.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:50:56.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:50:56.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:50:56.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:50:56.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:50:56.803 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:50:56.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:50:56.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:50:56.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:50:56.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:50:56.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:50:56.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:50:56.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:50:56.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:50:56.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:50:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:50:57.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:50:57.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:50:57.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:50:57.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:50:57.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:50:57.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:50:57.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:50:51
2026-05-29T00:50:57.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70455, datetime.datetime(2026, 5, 29, 0, 50, 51), datetime.datetime(2026, 5, 29, 0, 50, 51), 'salt', 6.55, 86.32, None, 9.71, 128.61, 2.11, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:50:57.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:50:57.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:50:57.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:51, diff=6.119961s, valid=True
2026-05-29T00:50:57.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:50:57.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:50:57.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:12, diff=-14.877008s, valid=True
2026-05-29T00:50:57.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:50:57.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:50:48, diff=9.129532s, valid=True
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:50:57.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:50:57.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:50:57.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:12, diff=-14.86737s, valid=True
2026-05-29T00:50:57.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:50:57.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:50:57.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:50:57.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941299.133296s, valid=True
2026-05-29T00:50:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:50:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:50:57.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:50:57.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:50:57.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:50:57.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:50:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:50:57.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:50:57.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:50:57.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:50:57.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:50:57.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:50:57.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:50:57.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:50:57.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:50:58.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:50:58.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:50:58.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:50:58.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-29T00:50:58.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-29T00:50:58.422 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:50:58.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:51:28.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:51:28.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:51:28.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:51:28.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:51:28.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:51:28.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:51:28.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-29T00:51:28.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:51: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-29T00:51:28.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:51:28.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:51:28.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:51:28.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-29T00:51:31.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-29T00:51:31.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:51:31.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:51:31.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:51:31.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:51:31.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:51:31.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:51:31.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:51:31.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:51:31.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:51:31.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:51:31.270 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:51:31.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:51:31.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:51:31.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:51:31.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:51:31.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:51:31.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:51:31.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:51:31.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:51:31.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:51:31.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:51:31.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:51:31.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:51:31.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:51:21
2026-05-29T00:51:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70456, datetime.datetime(2026, 5, 29, 0, 51, 21), datetime.datetime(2026, 5, 29, 0, 51, 21), 'salt', 6.65, 86.46, None, 9.99, 128.63, 2.09, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:51:31.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:51:31.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:51:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:21, diff=10.585505s, valid=True
2026-05-29T00:51:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:51:31.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:51:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:12, diff=19.588352s, valid=True
2026-05-29T00:51:31.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:51:31.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:20, diff=11.594993s, valid=True
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:51:31.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:51:31.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:12, diff=19.598022s, valid=True
2026-05-29T00:51:31.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:51:31.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:51:31.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:51:31.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941333.598702s, valid=True
2026-05-29T00:51:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:51:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:51:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:51:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:51:31.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:51:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:51:31.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:51:31.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:51:31.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:51:31.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:51:31.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:51:31.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:51:31.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:51:31.919 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:51:32.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:51:32.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:51:32.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:51:32.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:51:32.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-29T00:51:32.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-29T00:51:32.721 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:51:32.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:52:02.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:52:02.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:52:02.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:52:03.249 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:52:03.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:52:03.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:52:03.457 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:52:03.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:52:03.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-29T00:52:03.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:52:03.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:52:03.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:52:03.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:52:05.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-29T00:52:05.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:52:05.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:52:05.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:52:05.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:52:05.997 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:52:06.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:52:06.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:52:06.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:52:06.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:52:06.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:52:06.010 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:52:06.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:52:06.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:52:06.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:52:06.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:52:06.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:52:06.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:52:06.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:52:06.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:52:06.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:52:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:52:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:52:06.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:52:06.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:51:52
2026-05-29T00:52:06.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70457, datetime.datetime(2026, 5, 29, 0, 51, 52), datetime.datetime(2026, 5, 29, 0, 51, 51), 'salt', 6.59, 86.62, None, 9.6, 127.41, 2.07, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:52:06.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:52:06.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:52:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:51, diff=15.34572s, valid=True
2026-05-29T00:52:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:52:06.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:52:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:12, diff=-5.651443s, valid=True
2026-05-29T00:52:06.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:52:06.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:51:46, diff=20.355107s, valid=True
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:52:06.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:52:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:12, diff=-5.641892s, valid=True
2026-05-29T00:52:06.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:52:06.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:52:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:52:06.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941368.358765s, valid=True
2026-05-29T00:52:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:52:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:52:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:52:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:52:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:52:06.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:52:06.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:52:06.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:52:06.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:52:06.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:52:06.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:52:06.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:52:06.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:52:06.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:52:06.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:52:07.286 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:52:07.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:52:07.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:52:07.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-29T00:52:07.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-29T00:52:07.471 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:52:07.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:52:37.493 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:52:37.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:52:37.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:52:37.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:52:37.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:52:38.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:52:38.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T00:52:38.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:52:38.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-29T00:52:38.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:52:38.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:52:38.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:52:38.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-29T00:52:41.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-29T00:52:41.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:52:41.198 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:52:41.198 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:52:41.198 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:52:41.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:52:41.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:52:41.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:52:41.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:52:41.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:52:41.224 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:52:41.224 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:52:41.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:52:41.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:52:41.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:52:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:52:41.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:52:41.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:52:41.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:52:41.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:52:41.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:52:41.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:52:41.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:52:41.492 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:52:41.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:52:22
2026-05-29T00:52:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70458, datetime.datetime(2026, 5, 29, 0, 52, 22), datetime.datetime(2026, 5, 29, 0, 52, 21), 'salt', 6.52, 86.66, None, 10.09, 128.26, 2.06, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:52:41.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:52:41.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:52:41.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:21, diff=20.57454s, valid=True
2026-05-29T00:52:41.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:52:41.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:52:41.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:12, diff=29.577434s, valid=True
2026-05-29T00:52:41.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:52:41.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:17, diff=24.584142s, valid=True
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:52:41.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:52:41.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:12, diff=29.587212s, valid=True
2026-05-29T00:52:41.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:52:41.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:52:41.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:52:41.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941403.587882s, valid=True
2026-05-29T00:52:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:52:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:52:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:52:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:52:41.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:52:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:52:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:52:41.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:52:41.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:52:41.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:52:41.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:52:41.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:52:41.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:52:41.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:52:42.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:52:42.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:52:42.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:52:42.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:52:42.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-29T00:52:42.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-29T00:52:42.742 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:52:42.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:53:12.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:53:12.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:53:12.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:53:12.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:53:12.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:53:13.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:53:13.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-29T00:53:13.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:53:13.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-29T00:53:13.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:53:13.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:53:13.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:53:13.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-29T00:53:16.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-29T00:53:16.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:53:16.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:53:16.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:53:16.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:53:16.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:53:16.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:53:16.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:53:16.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:53:16.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:53:16.208 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:53:16.208 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:53:16.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:53:16.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:53:16.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:53:16.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:53:16.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:53:16.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:53:16.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:53:16.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:53:16.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:53:16.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:53:16.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:53:16.475 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:53:16.538 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:52:52
2026-05-29T00:53:16.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70459, datetime.datetime(2026, 5, 29, 0, 52, 52), datetime.datetime(2026, 5, 29, 0, 52, 52), 'salt', 6.65, 86.82, None, 9.64, 128.68, 2.03, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:53:16.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:53:16.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:53:16.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:52, diff=24.544809s, valid=True
2026-05-29T00:53:16.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:53:16.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:53:16.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:12, diff=4.547657s, valid=True
2026-05-29T00:53:16.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:53:16.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:52:44, diff=32.554169s, valid=True
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:53:16.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:53:16.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:12, diff=4.557191s, valid=True
2026-05-29T00:53:16.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:53:16.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:53:16.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:53:16.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941438.557851s, valid=True
2026-05-29T00:53:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:53:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:53:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:53:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:53:16.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:53:16.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:53:16.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:53:16.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:53:16.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:53:16.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:53:16.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:53:16.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:53:16.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:53:16.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:53:17.146 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:53:17.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:53:17.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:53:17.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:53:17.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-29T00:53:17.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-29T00:53:17.737 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:53:17.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:53:47.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:53:47.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:53:47.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:53:48.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:53:48.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:53:48.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:53:48.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-29T00:53:48.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:53:48.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-29T00:53:48.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:53:48.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:53:48.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:53:48.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:53: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-29T00:53:50.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:53:50.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:53:50.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:53:50.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:53:50.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:53:50.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:53:50.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:53:50.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:53:50.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:53:50.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:53:50.668 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:53:50.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:53:50.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:53:50.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:53:50.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:53:50.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:53:50.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:53:50.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:53:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:53:50.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:53:50.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:53:50.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:53:50.926 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:53:50.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:53:22
2026-05-29T00:53:50.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70460, datetime.datetime(2026, 5, 29, 0, 53, 22), datetime.datetime(2026, 5, 29, 0, 53, 22), 'salt', 6.62, 86.89, None, 9.56, 129.05, 2.02, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:53:50.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:53:50.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:53:50.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:22, diff=28.991632s, valid=True
2026-05-29T00:53:50.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:53:50.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:53:50.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:12, diff=38.994431s, valid=True
2026-05-29T00:53:50.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:53:50.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:17, diff=34.001008s, valid=True
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:53:51.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:53:51.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:53:12, diff=39.003993s, valid=True
2026-05-29T00:53:51.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:53:51.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:53:51.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:53:51.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941473.004642s, valid=True
2026-05-29T00:53:51.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:53:51.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:53:51.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:53:51.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:53:51.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:53:51.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:53:51.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:53:51.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:53:51.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:53:51.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:53:51.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:53:51.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:53:51.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:53:51.322 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:53:51.524 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:53:51.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:53:51.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:53:51.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:53:51.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-29T00:53:51.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-29T00:53:52.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:53:52.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:54:22.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:54:22.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:54:22.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:54:22.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:54:22.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:54:22.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:54:22.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-29T00:54:22.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:54:22.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-29T00:54:22.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:54:22.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:54:22.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:54:22.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-29T00:54:25.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-29T00:54:25.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:54:25.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:54:25.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:54:25.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:54:25.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:54:25.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:54:25.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:54:25.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:54:25.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:54:25.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:54:25.423 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:54:25.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:54:25.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T00:54:25.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:54:25.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:54:25.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:54:25.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:54:25.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:54:25.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:54:25.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:54:25.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:54:25.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:54:25.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:54:25.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:54:23
2026-05-29T00:54:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70462, datetime.datetime(2026, 5, 29, 0, 54, 23), datetime.datetime(2026, 5, 29, 0, 54, 22), 'salt', 6.65, 87.19, None, 9.71, 127.41, 1.97, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:54:25.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:54:25.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T00:54:25.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:22, diff=3.744085s, valid=True
2026-05-29T00:54:25.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:54:25.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:54:25.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:12, diff=13.746913s, valid=True
2026-05-29T00:54:25.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:54:25.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:18, diff=7.753391s, valid=True
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:54:25.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:54:25.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:12, diff=13.756417s, valid=True
2026-05-29T00:54:25.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:54:25.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:54:25.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:54:25.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941507.757076s, valid=True
2026-05-29T00:54:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:54:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:54:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:54:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:54:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:54:25.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:54:25.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:54:25.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:54:25.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:54:25.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:54:25.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:54:25.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:54:26.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:54:26.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:54:26.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:54:26.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:54:26.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:54:26.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:54:26.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-29T00:54:26.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-29T00:54:26.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:54:26.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:54:56.945 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:54:56.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:54:56.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:54:57.526 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:54:57.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:54:57.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:54:57.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-29T00:54:57.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:54:57.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-29T00:54:57.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:54:57.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:54:57.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:54:57.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T00:55:00.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-29T00:55:00.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:55:00.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:55:00.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:55:00.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:55:00.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:55:00.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:55:00.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:55:00.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:55:00.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:55:00.047 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:55:00.047 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:55:00.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:55:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:55:00.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:55:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:55:00.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:55:00.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:55:00.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:55:00.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T00:55:00.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:55:00.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:55:00.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:55:00.305 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:55:00.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:54:53
2026-05-29T00:55:00.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70463, datetime.datetime(2026, 5, 29, 0, 54, 53), datetime.datetime(2026, 5, 29, 0, 54, 53), 'salt', 6.69, 87.29, None, 9.92, 132.25, 1.96, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:55:00.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:55:00.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:55:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:53, diff=7.376784s, valid=True
2026-05-29T00:55:00.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:55:00.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:55:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:12, diff=48.3796s, valid=True
2026-05-29T00:55:00.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:55:00.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:50, diff=10.386167s, valid=True
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:55:00.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T00:55:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:54:12, diff=48.389188s, valid=True
2026-05-29T00:55:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:55:00.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:55:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:55:00.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941542.389858s, valid=True
2026-05-29T00:55:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:55:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:55:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:55:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:55:00.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:55:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:55:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:55:00.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:55:00.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:55:00.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:55:00.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:55:00.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:55:00.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:55:00.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:55:00.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:55:01.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:55:01.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:55:01.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:55:01.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T00:55:01.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T00:55:01.647 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:55:01.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:55:31.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:55:31.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:55:31.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:55:31.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:55:31.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:55:32.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:55:32.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-29T00:55:32.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:55:32.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-29T00:55:32.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:55:32.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:55:32.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:55:32.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-29T00:55:34.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-29T00:55:34.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:55:34.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:55:34.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:55:34.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:55:34.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:55:34.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:55:34.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:55:34.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:55:34.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:55:34.471 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:55:34.471 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:55:34.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:55:34.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:55:34.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:55:34.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:55:34.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:55:34.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:55:34.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:55:34.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:55:34.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:55:34.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:55:34.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:55:34.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:55:34.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:55:23
2026-05-29T00:55:34.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70464, datetime.datetime(2026, 5, 29, 0, 55, 23), datetime.datetime(2026, 5, 29, 0, 55, 23), 'salt', 6.65, 87.32, None, 10.06, 133.23, 1.95, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:55:34.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:55:34.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:55:34.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:23, diff=11.800377s, valid=True
2026-05-29T00:55:34.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:55:34.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:55:34.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:48, diff=-13.196794s, valid=True
2026-05-29T00:55:34.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:55:34.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:55:34.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:21, diff=13.809769s, valid=True
2026-05-29T00:55:34.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:55:34.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:55:34.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:55:34.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:55:34.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:55:34.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:55:34.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:48, diff=-13.187191s, valid=True
2026-05-29T00:55:34.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:55:34.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:55:34.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:55:34.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941576.813461s, valid=True
2026-05-29T00:55:34.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:55:34.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:55:34.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:55:34.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:55:34.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:55:34.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:55:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:55:34.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:55:34.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:55:34.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:55:35.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:55:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:55:35.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:55:35.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:55:35.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:55:35.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:55:35.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:55:35.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:55:35.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-29T00:55:35.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-29T00:55:36.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:55:36.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:56:06.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:56:06.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:56:06.140 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:56:06.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:56:06.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:56:06.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:56:06.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-29T00:56:06.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:56:06.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-29T00:56:06.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:56:06.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:56:06.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:56:06.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-29T00:56:09.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-29T00:56:09.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:56:09.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:56:09.537 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:56:09.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:56:09.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:56:09.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:56:09.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:56:09.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:56:09.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:56:09.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:56:09.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:56:09.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:56:09.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:56:09.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:56:09.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:56:09.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:56:09.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:56:09.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:56:09.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T00:56:09.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:56:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:56:09.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:56:09.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:56:09.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:55:53
2026-05-29T00:56:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70465, datetime.datetime(2026, 5, 29, 0, 55, 53), datetime.datetime(2026, 5, 29, 0, 55, 53), 'salt', 6.59, 87.32, None, 10.52, 132.04, 1.95, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:56:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:56:09.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:56:09.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:53, diff=16.88274s, valid=True
2026-05-29T00:56:09.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:56:09.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:56:09.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:48, diff=21.885839s, valid=True
2026-05-29T00:56:09.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:56:09.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:56:09.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:53, diff=16.892771s, valid=True
2026-05-29T00:56:09.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:56:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:56:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:56:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:56:09.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:56:09.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T00:56:09.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:55:48, diff=21.895876s, valid=True
2026-05-29T00:56:09.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:56:09.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:56:09.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:56:09.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941611.896539s, valid=True
2026-05-29T00:56:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:56:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:56:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:56:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:56:09.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:56:09.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:56:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:56:09.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:56:09.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:56:10.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:56:10.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:56:10.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:56:10.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:56:10.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:56:10.515 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:56:10.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:56:10.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:56:10.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:56:10.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-29T00:56:10.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-29T00:56:11.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:56:11.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:56:41.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:56:41.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:56:41.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:56:41.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:56:41.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:56:41.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:56:41.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-29T00:56:41.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:56:41.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-29T00:56:41.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:56:41.427 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:56:41.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:56:41.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-29T00:56:43.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-29T00:56:43.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:56:43.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:56:43.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:56:43.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:56:43.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:56:43.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:56:43.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:56:43.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:56:43.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:56:43.805 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:56:43.805 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:56:43.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:56:43.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:56:43.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:56:43.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:56:43.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:56:44.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:56:44.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:56:44.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:56:44.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:56:44.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:56:44.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:56:44.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:56:44.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:56:24
2026-05-29T00:56:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70466, datetime.datetime(2026, 5, 29, 0, 56, 24), datetime.datetime(2026, 5, 29, 0, 56, 23), 'salt', 6.49, 87.25, None, 10.73, 130.14, 1.96, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:56:44.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:56:44.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:56:44.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:23, diff=21.144288s, valid=True
2026-05-29T00:56:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:56:44.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:56:44.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=-3.852883s, valid=True
2026-05-29T00:56:44.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:56:44.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:56:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:19, diff=25.153654s, valid=True
2026-05-29T00:56:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:56:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:56:44.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:56:44.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:56:44.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:56:44.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:56:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=-3.843329s, valid=True
2026-05-29T00:56:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:56:44.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:56:44.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:56:44.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941646.157318s, valid=True
2026-05-29T00:56:44.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:56:44.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:56:44.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:56:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:56:44.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:56:44.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:56:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:56:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:56:44.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:56:44.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:56:44.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:56:44.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:56:44.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:56:44.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:56:44.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:56:45.042 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:56:45.141 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:56:45.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:56:45.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-29T00:56:45.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-29T00:56:45.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:56:45.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:57:15.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:57:15.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:57:15.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:57:15.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:57:15.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:57:15.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:57:15.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-29T00:57:15.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:57:15.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-29T00:57:15.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:57:15.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:57:15.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:57:15.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-29T00:57:18.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-29T00:57:18.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:57:18.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:57:18.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:57:18.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:57:18.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:57:18.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:57:18.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:57:18.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:57:18.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:57:18.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:57:18.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:57:18.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:57:18.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:57:18.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:57:18.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:57:18.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:57:18.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:57:18.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:57:18.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:57:18.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:57:18.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:57:18.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:57:18.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:57:18.467 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:56:54
2026-05-29T00:57:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70467, datetime.datetime(2026, 5, 29, 0, 56, 54), datetime.datetime(2026, 5, 29, 0, 56, 53), 'salt', 6.52, 87.39, None, 10.98, 128.14, 1.94, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:57:18.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:57:18.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:57:18.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:53, diff=25.474185s, valid=True
2026-05-29T00:57:18.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:57:18.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:57:18.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=30.477093s, valid=True
2026-05-29T00:57:18.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:57:18.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:57:18.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:49, diff=29.483702s, valid=True
2026-05-29T00:57:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:57:18.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:57:18.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:57:18.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:57:18.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:57:18.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:57:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=30.486705s, valid=True
2026-05-29T00:57:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:57:18.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:57:18.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:57:18.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941680.487354s, valid=True
2026-05-29T00:57:18.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:57:18.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:57:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:57:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:57:18.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:57:18.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:57:18.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:57:18.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:57:18.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:57:18.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:57:18.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:57:18.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:57:18.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:57:18.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:57:19.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:57:19.478 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:57:19.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:57:19.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:57:19.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-29T00:57:19.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-29T00:57:19.821 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:57:19.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:57:49.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:57:49.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:57:49.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:57:50.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:57:50.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:57:50.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:57:50.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-29T00:57:50.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:57:50.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-29T00:57:50.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:57:50.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:57:50.331 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:57:50.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-29T00:57:52.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:57:52.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:57:52.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:57:52.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:57:52.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:57:52.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:57:52.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:57:52.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:57:52.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:57:52.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:57:52.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:57:52.717 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:57:52.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:57:52.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:57:52.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:57:52.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:57:52.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:57:52.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:57:52.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:57:52.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:57:52.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:57:52.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:57:52.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:57:52.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:57:53.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:57:24
2026-05-29T00:57:53.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70468, datetime.datetime(2026, 5, 29, 0, 57, 24), datetime.datetime(2026, 5, 29, 0, 57, 24), 'salt', 6.55, 87.52, None, 10.69, 127.11, 1.91, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:57:53.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:57:53.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:57:53.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:57:24, diff=29.041818s, valid=True
2026-05-29T00:57:53.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:57:53.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:57:53.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=65.044626s, valid=True
2026-05-29T00:57:53.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:57:53.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:57:20, diff=33.051203s, valid=True
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:57:53.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:57:53.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:56:48, diff=65.054198s, valid=True
2026-05-29T00:57:53.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:57:53.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:57:53.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:57:53.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941715.05486s, valid=True
2026-05-29T00:57:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:57:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:57:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:57:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:57:53.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:57:53.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:57:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:57:53.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:57:53.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:57:53.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:57:53.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:57:53.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:57:53.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:57:53.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:57:53.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:57:53.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:57:54.021 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:57:54.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:57:54.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-29T00:57:54.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-29T00:57:54.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:57:54.200 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:58:24.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:58:24.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:58:24.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:58:24.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:58:24.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:58:24.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:58:24.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-29T00:58:24.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:58:24.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-29T00:58:24.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:58:24.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:58:24.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:58:24.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-29T00:58:27.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-29T00:58:27.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:58:27.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:58:27.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:58:27.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:58:27.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:58:27.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:58:27.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:58:27.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:58:27.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:58:27.640 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:58:27.640 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:58:27.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:58:27.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:58:27.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:58:27.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:58:27.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:58:27.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:58:27.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:58:27.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:58:27.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:58:27.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:58:27.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:58:27.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:58:27.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:58:24
2026-05-29T00:58:27.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70470, datetime.datetime(2026, 5, 29, 0, 58, 24), datetime.datetime(2026, 5, 29, 0, 58, 24), 'salt', 6.59, 87.69, None, 10.91, 125.93, 1.89, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:58:27.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:58:27.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:58:27.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:24, diff=3.971646s, valid=True
2026-05-29T00:58:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:58:27.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:58:27.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:12, diff=15.974514s, valid=True
2026-05-29T00:58:27.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:58:27.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:20, diff=7.981208s, valid=True
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:58:27.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:58:27.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:12, diff=15.98419s, valid=True
2026-05-29T00:58:27.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:58:27.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:58:27.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:58:27.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941749.984859s, valid=True
2026-05-29T00:58:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:58:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:58:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:58:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:58:27.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:58:28.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:58:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:58:28.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:58:28.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:58:28.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:58:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:58:28.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:58:28.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:58:28.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:58:28.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:58:28.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:58:29.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:58:29.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:58:29.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-29T00:58:29.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-29T00:58:29.127 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:58:29.127 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:58:59.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:58:59.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:58:59.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:58:59.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:58:59.433 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:58:59.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:58:59.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-29T00:58:59.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:58:59.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-29T00:58:59.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:58:59.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:58:59.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:58:59.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-29T00:59:01.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T00:59:01.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:59:01.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:59:01.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:59:01.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:59:01.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:59:01.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:59:01.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:59:01.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:59:01.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:59:01.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:59:01.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:59:01.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:59:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:59:02.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:59:02.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:59:02.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:59:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:59:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:59:02.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:59:02.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:59:02.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:59:02.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:59:02.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:59:02.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:58:55
2026-05-29T00:59:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70471, datetime.datetime(2026, 5, 29, 0, 58, 55), datetime.datetime(2026, 5, 29, 0, 58, 54), 'salt', 6.55, 87.69, None, 11.29, 125.18, 1.89, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:59:02.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:59:02.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:59:02.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:54, diff=8.293344s, valid=True
2026-05-29T00:59:02.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:59:02.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:59:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:12, diff=-9.703845s, valid=True
2026-05-29T00:59:02.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:59:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:59:02.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:58:51, diff=11.302671s, valid=True
2026-05-29T00:59:02.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:59:02.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:59:02.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:59:02.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:59:02.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:59:02.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:59:02.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:12, diff=-9.694346s, valid=True
2026-05-29T00:59:02.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:59:02.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:59:02.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:59:02.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941784.306298s, valid=True
2026-05-29T00:59:02.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:59:02.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:59:02.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:59:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:59:02.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:59:02.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:59:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:59:02.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:59:02.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:59:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:59:02.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:59:02.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:59:02.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:59:02.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:59:02.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:59:03.337 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:59:03.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:59:03.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:59:03.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-29T00:59:03.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-29T00:59:03.532 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:59:03.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T00:59:33.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T00:59:33.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T00:59:33.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T00:59:33.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T00:59:33.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T00:59:34.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T00:59:34.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-29T00:59:34.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T00:59:34.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-29T00:59:34.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T00:59:34.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T00:59:34.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T00:59:34.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-29T00:59:36.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-29T00:59:36.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T00:59:36.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T00:59:36.350 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T00:59:36.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T00:59:36.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T00:59:36.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T00:59:36.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T00:59:36.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T00:59:36.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T00:59:36.372 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T00:59:36.372 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T00:59:36.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T00:59:36.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T00:59:36.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T00:59:36.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T00:59:36.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:59:36.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:59:36.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T00:59:36.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T00:59:36.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T00:59:36.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T00:59:36.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T00:59:36.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T00:59:36.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:59:25
2026-05-29T00:59:36.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70472, datetime.datetime(2026, 5, 29, 0, 59, 25), datetime.datetime(2026, 5, 29, 0, 59, 25), 'salt', 6.45, 87.62, None, 11.19, 124.2, 1.89, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T00:59:36.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T00:59:36.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T00:59:36.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:25, diff=11.699041s, valid=True
2026-05-29T00:59:36.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T00:59:36.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:59:36.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:12, diff=24.701934s, valid=True
2026-05-29T00:59:36.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T00:59:36.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:23, diff=13.708554s, valid=True
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T00:59:36.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T00:59:36.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T00:59:36.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:12, diff=24.711737s, valid=True
2026-05-29T00:59:36.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T00:59:36.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T00:59:36.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T00:59:36.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941818.712404s, valid=True
2026-05-29T00:59:36.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T00:59:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T00:59:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T00:59:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T00:59:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T00:59:36.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T00:59:36.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T00:59:36.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T00:59:36.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T00:59:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T00:59:36.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T00:59:37.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T00:59:37.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T00:59:37.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T00:59:37.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:59:37.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T00:59:37.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T00:59:37.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T00:59:37.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-29T00:59:37.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-29T00:59:37.875 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T00:59:37.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:00:07.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:00:07.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:00:07.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:00:08.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:00:08.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:00:08.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:00:08.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-29T01:00:08.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:00:08.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-29T01:00:08.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:00:08.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:00:08.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:00:08.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:00:11.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-29T01:00:11.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:00:11.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:00:11.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:00:11.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:00:11.522 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:00:11.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:00:11.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:00:11.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:00:11.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:00:11.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:00:11.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:00:11.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:00:11.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:00:11.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:00:11.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:00:11.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:00:11.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:00:11.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:00:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:00:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:00:11.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:00:11.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:00:11.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:00:11.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 00:59:55
2026-05-29T01:00:11.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70473, datetime.datetime(2026, 5, 29, 0, 59, 55), datetime.datetime(2026, 5, 29, 0, 59, 55), 'salt', 6.42, 87.65, None, 11.68, 123.96, 1.89, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:00:11.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:00:11.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:00:11.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:55, diff=16.899926s, valid=True
2026-05-29T01:00:11.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:00:11.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:00:11.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:12, diff=-0.09723s, valid=True
2026-05-29T01:00:11.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:00:11.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 00:59:54, diff=17.909355s, valid=True
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:00:11.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:00:11.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:12, diff=-0.087583s, valid=True
2026-05-29T01:00:11.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:00:11.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:00:11.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:00:11.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941853.913078s, valid=True
2026-05-29T01:00:11.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:00:11.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:00:11.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:00:11.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:00:11.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:00:11.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:00:11.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:00:11.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:00:11.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:00:12.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:00:12.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:00:12.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:00:12.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:00:12.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:00:12.434 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:00:12.770 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:00:12.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:00:12.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:00:12.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-29T01:00:12.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-29T01:00:13.124 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:00:13.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:00:43.130 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:00:43.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:00:43.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:00:43.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:00:43.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:00:43.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:00:43.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-29T01:00:43.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:00:43.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-29T01:00:43.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:00:43.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:00:43.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:00:43.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-29T01:00:46.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:00:46.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:00:46.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:00:46.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:00:46.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:00:46.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:00:46.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:00:46.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:00:46.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:00:46.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:00:46.860 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:00:46.860 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:00:46.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:00:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:00:46.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:00:47.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:00:47.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:00:47.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:00:47.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:00:47.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:00:47.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:00:47.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:00:47.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:00:47.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:00:47.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:00:26
2026-05-29T01:00:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70474, datetime.datetime(2026, 5, 29, 1, 0, 26), datetime.datetime(2026, 5, 29, 1, 0, 25), 'salt', 6.42, 87.69, None, 11.61, 123.0, 1.89, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:00:47.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:00:47.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:00:47.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:25, diff=22.189508s, valid=True
2026-05-29T01:00:47.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:00:47.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:00:47.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:12, diff=35.192465s, valid=True
2026-05-29T01:00:47.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:00:47.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:25, diff=22.199397s, valid=True
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:00:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:00:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:12, diff=35.202472s, valid=True
2026-05-29T01:00:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:00:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:00:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:00:47.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941889.203144s, valid=True
2026-05-29T01:00:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:00:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:00:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:00:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:00:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:00:47.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:00:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:00:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:00:47.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:00:47.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:00:47.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:00:47.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:00:47.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:00:47.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:00:47.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:00:48.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:00:48.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:00:48.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:00:48.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-29T01:00: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-29T01:00:48.379 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:00:48.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:01:18.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:01:18.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:01:18.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:01:18.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:01:18.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:01:18.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:01:18.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:01:18.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:01:18.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-29T01:01:18.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:01:18.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:01:18.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:01:18.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-29T01:01:22.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-29T01:01:22.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:01:22.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:01:22.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:01:22.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:01:22.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:01:22.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:01:22.213 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:01:22.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:01:22.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:01:22.213 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:01:22.213 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:01:22.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:01:22.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:01:22.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:01:22.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:01:22.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:01:22.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:01:22.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:01:22.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:01:22.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:01:22.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:01:22.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:01:22.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:01:22.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:00:56
2026-05-29T01:01:22.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70475, datetime.datetime(2026, 5, 29, 1, 0, 56), datetime.datetime(2026, 5, 29, 1, 0, 55), 'salt', 6.32, 87.75, None, 11.19, 120.39, 1.87, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:01:22.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:01:22.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:01:22.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:55, diff=27.536539s, valid=True
2026-05-29T01:01:22.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:01:22.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:01:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:01:12, diff=10.539436s, valid=True
2026-05-29T01:01:22.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:01:22.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:00:51, diff=31.546078s, valid=True
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:01:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:01:22.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:01:12, diff=10.549151s, valid=True
2026-05-29T01:01:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:01:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:01:22.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:01:22.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941924.549824s, valid=True
2026-05-29T01:01:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:01:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:01:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:01:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:01:22.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:01:22.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:01:22.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:01:22.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:01:22.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:01:22.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:01:22.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:01:22.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:01:22.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:01:22.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:01:23.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:01:23.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:01:23.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:01:23.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:01:23.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-29T01:01:23.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-29T01:01:23.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:01:23.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:01:53.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:01:53.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:01:53.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:01:54.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:01:54.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:01:54.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:01:54.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-29T01:01:54.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:01:54.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:01:54.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:01:54.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:01:54.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:01:54.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-29T01:01:57.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-29T01:01:57.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:01:57.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:01:57.207 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:01:57.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:01:57.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:01:57.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:01:57.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:01:57.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:01:57.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:01:57.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:01:57.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:01:57.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:01:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T01:01:57.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:01:57.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T01:01:57.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:01:57.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T01:01:57.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:01:57.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T01:01:57.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:01:57.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:01:57.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:01:57.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:01:57.552 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:01:56
2026-05-29T01:01:57.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70477, datetime.datetime(2026, 5, 29, 1, 1, 56), datetime.datetime(2026, 5, 29, 1, 1, 56), 'salt', 6.49, 88.05, None, 12.35, 127.86, 1.83, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:01:57.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:01:57.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T01:01:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:01:56, diff=1.558795s, valid=True
2026-05-29T01:01:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:01:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T01:01:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:12, diff=-14.438366s, valid=True
2026-05-29T01:01:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:01:57.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:01:52, diff=5.568252s, valid=True
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:01:57.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T01:01:57.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:12, diff=-14.428704s, valid=True
2026-05-29T01:01:57.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:01:57.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:01:57.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:01:57.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941959.571954s, valid=True
2026-05-29T01:01:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:01:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:01:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:01:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:01:57.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:01:57.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:01:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:01:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:01:57.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:01:57.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:01:57.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:01:57.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:01:57.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:01:57.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:01:58.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:01:58.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:01:58.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:01:58.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:01:58.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-29T01:01:58.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-29T01:01:58.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:01:58.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:02:28.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:02:28.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:02:28.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:02:28.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:02:28.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:02:29.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:02:29.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:02:29.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:02:29.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:02:29.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:02:29.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:02:29.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:02:29.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-29T01:02:31.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:02:31.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:02:31.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:02:31.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:02:31.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:02:31.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:02:31.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:02:31.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:02:31.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:02:31.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:02:31.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:02:31.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:02:31.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:02:31.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:02:31.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:02:31.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:02:31.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:02:31.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:02:31.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:02:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:02:31.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:02:31.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:02:31.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:02:31.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:02:31.840 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:02:26
2026-05-29T01:02:31.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70478, datetime.datetime(2026, 5, 29, 1, 2, 26), datetime.datetime(2026, 5, 29, 1, 2, 26), 'salt', 6.55, 88.22, None, 12.63, 125.25, 1.8, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:02:31.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:02:31.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:02:31.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:26, diff=5.846594s, valid=True
2026-05-29T01:02:31.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:02:31.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:02:31.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:12, diff=19.849389s, valid=True
2026-05-29T01:02:31.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:02:31.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:02:31.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:22, diff=9.855916s, valid=True
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:02:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:02:31.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:12, diff=19.858872s, valid=True
2026-05-29T01:02:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:02:31.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:02:31.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:02:31.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=941993.859532s, valid=True
2026-05-29T01:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:02:31.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:02:31.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:02:31.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:02:31.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:02:31.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:02:31.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:02:32.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:02:32.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:02:32.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:02:32.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:02:32.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:02:32.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:02:32.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:02:32.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:02:32.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-29T01:02:32.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-29T01:02:32.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:02:32.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:03:03.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:03:03.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:03:03.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:03:03.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:03:03.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:03:03.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:03:03.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-29T01:03:03.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:03:03.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-29T01:03:03.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:03:03.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:03:03.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:03:03.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-29T01:03:06.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-29T01:03:06.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:03:06.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:03:06.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:03:06.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:03:06.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:03:06.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:03:06.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:03:06.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:03:06.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:03:06.203 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:03:06.203 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:03:06.209 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:03:06.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:03:06.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:03:06.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:03:06.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:03:06.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:03:06.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:03:06.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:03:06.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:03:06.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:03:06.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:03:06.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:03:06.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:02:57
2026-05-29T01:03:06.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70479, datetime.datetime(2026, 5, 29, 1, 2, 57), datetime.datetime(2026, 5, 29, 1, 2, 56), 'salt', 6.62, 88.22, None, 13.37, 125.56, 1.8, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:03:06.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:03:06.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:03:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:56, diff=10.521558s, valid=True
2026-05-29T01:03:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:03:06.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:03:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:12, diff=-5.475667s, valid=True
2026-05-29T01:03:06.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:03:06.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:03:06.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:02:52, diff=14.530809s, valid=True
2026-05-29T01:03:06.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:03:06.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:03:06.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:03:06.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:03:06.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:03:06.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:03:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:12, diff=-5.466229s, valid=True
2026-05-29T01:03:06.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:03:06.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:03:06.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:03:06.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942028.534413s, valid=True
2026-05-29T01:03:06.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:03:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:03:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:03:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:03:06.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:03:06.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:03:06.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:03:06.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:03:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:03:06.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:03:06.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:03:06.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:03:06.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:03:06.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:03:07.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:03:07.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:03:07.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:03:07.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:03:07.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-29T01:03:07.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-29T01:03:07.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:03:07.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:03:37.652 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:03:37.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:03:37.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:03:38.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:03:38.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:03:38.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:03:38.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-29T01:03:38.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:03:38.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-29T01:03:38.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:03:38.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:03:38.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:03:38.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-29T01:03:40.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:03:40.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:03:40.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:03:40.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:03:40.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:03:40.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:03:40.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:03:40.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:03:40.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:03:40.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:03:40.718 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:03:40.719 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:03:40.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:03:40.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:03:40.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:03:40.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:03:40.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:03:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:03:40.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:03:40.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:03:40.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:03:40.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:03:40.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:03:40.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:03:41.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:03:27
2026-05-29T01:03:41.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70480, datetime.datetime(2026, 5, 29, 1, 3, 27), datetime.datetime(2026, 5, 29, 1, 3, 26), 'salt', 6.52, 88.18, None, 13.34, 118.51, 1.81, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:03:41.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:03:41.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:03:41.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:26, diff=15.036344s, valid=True
2026-05-29T01:03:41.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:03:41.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:03:41.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:12, diff=29.039204s, valid=True
2026-05-29T01:03:41.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:03:41.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:03:41.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:23, diff=18.045777s, valid=True
2026-05-29T01:03:41.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:03:41.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:03:41.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:03:41.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:03:41.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:03:41.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:03:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:12, diff=29.048777s, valid=True
2026-05-29T01:03:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:03:41.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:03:41.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:03:41.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942063.049422s, valid=True
2026-05-29T01:03:41.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:03:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:03:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:03:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:03:41.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:03:41.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:03:41.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:03:41.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:03:41.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:03:41.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:03:41.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:03:41.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:03:41.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:03:41.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:03:41.665 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:03:42.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:03:42.106 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:03:42.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:03:42.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-29T01:03:42.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-29T01:03:42.610 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:03:42.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:04:12.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:04:12.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:04:12.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:04:13.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:04:13.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:04:13.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:04:13.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-29T01:04:13.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:04:13.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-29T01:04:13.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:04:13.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:04:13.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:04:13.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-29T01:04:16.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-29T01:04:16.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:04:16.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:04:16.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:04:16.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:04:16.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:04:16.080 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:04:16.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:04:16.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:04:16.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:04:16.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:04:16.080 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:04:16.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:04:16.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:04:16.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:04:16.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:04:16.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:04:16.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:04:16.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:04:16.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:04:16.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:04:16.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:04:16.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:04:16.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:04:16.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:03:57
2026-05-29T01:04:16.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70481, datetime.datetime(2026, 5, 29, 1, 3, 57), datetime.datetime(2026, 5, 29, 1, 3, 57), 'salt', 6.62, 88.35, None, 13.16, 124.1, 1.78, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:04:16.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:04:16.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:04:16.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:57, diff=19.397581s, valid=True
2026-05-29T01:04:16.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:04:16.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:04:16.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:12, diff=4.400396s, valid=True
2026-05-29T01:04:16.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:04:16.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:04:16.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:03:55, diff=21.406857s, valid=True
2026-05-29T01:04:16.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:04:16.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:04:16.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:04:16.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:04:16.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:04:16.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:04:16.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:12, diff=4.40983s, valid=True
2026-05-29T01:04:16.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:04:16.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:04:16.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:04:16.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942098.410475s, valid=True
2026-05-29T01:04:16.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:04:16.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:04:16.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:04:16.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:04:16.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:04:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:04:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:04:16.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:04:16.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:04:16.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:04:16.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:04:16.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:04:16.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:04:16.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:04:16.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:04:17.274 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:04:17.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:04:17.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:04:17.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-29T01:04:17.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-29T01:04:17.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:04:17.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:04:47.487 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:04:47.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:04:47.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:04:47.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:04:47.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:04:47.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:04:47.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-29T01:04:47.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:04:47.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-29T01:04:47.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:04:47.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:04:47.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:04:47.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-29T01:04:50.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-29T01:04:50.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:04:50.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:04:50.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:04:50.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:04:50.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:04:50.938 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:04:50.938 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:04:50.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:04:50.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:04:50.939 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:04:50.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:04:50.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:04:51.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:04:51.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:04:51.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:04:51.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:04:51.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:04:51.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:04:51.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:04:51.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:04:51.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:04:51.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:04:51.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:04:51.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:04:27
2026-05-29T01:04:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70482, datetime.datetime(2026, 5, 29, 1, 4, 27), datetime.datetime(2026, 5, 29, 1, 4, 27), 'salt', 6.62, 88.35, None, 13.55, 124.22, 1.78, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:04:51.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:04:51.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:04:51.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:27, diff=24.262873s, valid=True
2026-05-29T01:04:51.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:04:51.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:04:51.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:12, diff=39.265761s, valid=True
2026-05-29T01:04:51.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:04:51.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:26, diff=25.272342s, valid=True
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:04:51.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:04:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:12, diff=39.275427s, valid=True
2026-05-29T01:04:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:04:51.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:04:51.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:04:51.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942133.276106s, valid=True
2026-05-29T01:04:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:04:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:04:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:04:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:04:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:04:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:04:51.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:04:51.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:04:51.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:04:51.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:04:51.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:04:51.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:04:51.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:04:51.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:04:51.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:04:52.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:04:52.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:04:52.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:04:52.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-29T01:04:52.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-29T01:04:52.400 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:04:52.400 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:05:22.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:05:22.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:05:22.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:05:22.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:05:22.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:05:22.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:05:22.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-29T01:05:22.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:05:22.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-29T01:05:22.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:05:22.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:05:22.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:05:22.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-29T01:05:25.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-29T01:05:25.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:05:25.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:05:25.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:05:25.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:05:25.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:05:25.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:05:25.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:05:25.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:05:25.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:05:25.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:05:25.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:05:25.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:05:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:05:25.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:05:25.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:05:25.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:05:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:05:25.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:05:25.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:05:25.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:05:25.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:05:25.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:05:25.444 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:05:25.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:04:58
2026-05-29T01:05:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70483, datetime.datetime(2026, 5, 29, 1, 4, 58), datetime.datetime(2026, 5, 29, 1, 4, 58), 'salt', 6.65, 88.42, None, 13.73, 127.72, 1.77, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:05:25.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:05:25.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:05:25.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:58, diff=27.509193s, valid=True
2026-05-29T01:05:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:05:25.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:05:25.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:05:12, diff=13.511998s, valid=True
2026-05-29T01:05:25.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:05:25.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:04:57, diff=28.518587s, valid=True
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:05:25.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:05:25.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:05:25.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:05:12, diff=13.521548s, valid=True
2026-05-29T01:05:25.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:05:25.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:05:25.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:05:25.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942167.522201s, valid=True
2026-05-29T01:05:25.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:05:25.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:05:25.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:05:25.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:05:25.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:05:25.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:05:25.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:05:25.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:05:25.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:05:25.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:05:25.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:05:25.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:05:25.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:05:25.851 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:05:26.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:05:26.425 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:05:26.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:05:26.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:05:26.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-29T01:05:26.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-29T01:05:26.775 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:05:26.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:05:56.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:05:56.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:05:56.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:05:57.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:05:57.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:05:57.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:05:57.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-29T01:05:57.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:05:57.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-29T01:05:57.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:05:57.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:05:57.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:05:57.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-29T01:05:59.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-29T01:05:59.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:05:59.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:05:59.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:05:59.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:05:59.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:05:59.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:05:59.576 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:05:59.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:05:59.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:05:59.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:05:59.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:05:59.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:05:59.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T01:05:59.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:05:59.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T01:05:59.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:05:59.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T01:05:59.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:05:59.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T01:05:59.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:05:59.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:05:59.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:05:59.854 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:05:59.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:05:59
2026-05-29T01:05:59.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70485, datetime.datetime(2026, 5, 29, 1, 5, 59), datetime.datetime(2026, 5, 29, 1, 5, 58), 'salt', 6.72, 88.55, None, 10.94, 128.12, 1.75, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:05:59.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:05:59.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T01:05:59.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:05:58, diff=1.925766s, valid=True
2026-05-29T01:05:59.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:05:59.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T01:05:59.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:12, diff=-12.071075s, valid=True
2026-05-29T01:05:59.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:05:59.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:05:54, diff=5.937049s, valid=True
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:05:59.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T01:05:59.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:12, diff=-12.05961s, valid=True
2026-05-29T01:05:59.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:05:59.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:05:59.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:05:59.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942201.941123s, valid=True
2026-05-29T01:05:59.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:05:59.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:05:59.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:05:59.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:05:59.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:06:00.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:06:00.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:06:00.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:06:00.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:06:00.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:06:00.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:06:00.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:06:00.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:06:00.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:06:00.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:06:00.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:06:01.048 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:06:01.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:06:01.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-29T01:06:01.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-29T01:06:01.128 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:06:01.128 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:06:31.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:06:31.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:06:31.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:06:31.438 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:06:31.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:06:31.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:06:31.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-29T01:06:31.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:06:31.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-29T01:06:31.680 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:06:31.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:06:31.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:06:31.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-29T01:06:34.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:06:34.035 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:06:34.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:06:34.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:06:34.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:06:34.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:06:34.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:06:34.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:06:34.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:06:34.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:06:34.060 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:06:34.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:06:34.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:06:34.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:06:34.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:06:34.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:06:34.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:06:34.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:06:34.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:06:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:06:34.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:06:34.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:06:34.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:06:34.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:06:34.387 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:06:29
2026-05-29T01:06:34.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70486, datetime.datetime(2026, 5, 29, 1, 6, 29), datetime.datetime(2026, 5, 29, 1, 6, 29), 'salt', 6.72, 88.45, None, 10.62, 126.35, 1.77, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:06:34.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:06:34.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:06:34.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:29, diff=5.393392s, valid=True
2026-05-29T01:06:34.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:06:34.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:06:34.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:12, diff=22.396245s, valid=True
2026-05-29T01:06:34.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:06:34.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:06:34.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:24, diff=10.402968s, valid=True
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:06:34.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:06:34.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:12, diff=22.40607s, valid=True
2026-05-29T01:06:34.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:06:34.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:06:34.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:06:34.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942236.406746s, valid=True
2026-05-29T01:06:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:06:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:06:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:06:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:06:34.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:06:34.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:06:34.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:06:34.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:06:34.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:06:34.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:06:34.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:06:34.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:06:34.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:06:34.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:06:34.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:06:35.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:06:35.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:06:35.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:06:35.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-29T01:06:35.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-29T01:06:35.583 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:06:35.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:07:05.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:07:05.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:07:05.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:07:06.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:07:06.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:07:06.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:07:06.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-29T01:07:06.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:07: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-29T01:07:06.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:07:06.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:07:06.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:07:06.336 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:07:08.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-29T01:07:08.722 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:07:08.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:07:08.726 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:07:08.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:07:08.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:07:08.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:07:08.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:07:08.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:07:08.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:07:08.749 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:07:08.749 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:07:08.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:07:08.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:07:08.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:07:08.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:07:08.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:07:08.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:07:08.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:07:08.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:07:08.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:07:09.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:07:09.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:07:09.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:07:09.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:06:59
2026-05-29T01:07:09.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70487, datetime.datetime(2026, 5, 29, 1, 6, 59), datetime.datetime(2026, 5, 29, 1, 6, 59), 'salt', 6.62, 88.38, None, 10.02, 125.67, 1.78, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:07:09.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:07:09.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:07:09.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:59, diff=10.070973s, valid=True
2026-05-29T01:07:09.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:07:09.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:07:09.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:12, diff=-2.92613s, valid=True
2026-05-29T01:07:09.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:07:09.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:06:54, diff=15.080499s, valid=True
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:07:09.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:07:09.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:12, diff=-2.916461s, valid=True
2026-05-29T01:07:09.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:07:09.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:07:09.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:07:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942271.084217s, valid=True
2026-05-29T01:07:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:07:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:07:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:07:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:07:09.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:07:09.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:07:09.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:07:09.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:07:09.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:07:09.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:07:09.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:07:09.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:07:09.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:07:09.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:07:09.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:07:09.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:07:10.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:07:10.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:07:10.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-29T01:07:10.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-29T01:07:10.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:07:10.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:07:40.287 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:07:40.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:07:40.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:07:40.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:07:40.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:07:40.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:07:40.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:07:40.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:07:40.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-29T01:07:40.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:07:40.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:07:40.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:07:40.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-29T01:07:42.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:07:42.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:07:42.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:07:42.911 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:07:42.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:07:42.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:07:42.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:07:42.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:07:42.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:07:42.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:07:42.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:07:42.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:07:42.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:07:43.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:07:43.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:07:43.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:07:43.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:07:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:07:43.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:07:43.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:07:43.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:07:43.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:07:43.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:07:43.196 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:07:43.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:07:29
2026-05-29T01:07:43.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70488, datetime.datetime(2026, 5, 29, 1, 7, 29), datetime.datetime(2026, 5, 29, 1, 7, 29), 'salt', 6.69, 88.38, None, 11.08, 123.28, 1.78, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:07:43.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:07:43.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:07:43.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:29, diff=14.26082s, valid=True
2026-05-29T01:07:43.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:07:43.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:07:43.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:12, diff=31.263635s, valid=True
2026-05-29T01:07:43.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:07:43.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:24, diff=19.270119s, valid=True
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:07:43.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:07:43.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:12, diff=31.273176s, valid=True
2026-05-29T01:07:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:07:43.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:07:43.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:07:43.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942305.273833s, valid=True
2026-05-29T01:07:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:07:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:07:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:07:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:07:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:07:43.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:07:43.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:07:43.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:07:43.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:07:43.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:07:43.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:07:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:07:43.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:07:43.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:07:43.817 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:07:44.219 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:07:44.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:07:44.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:07:44.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-29T01:07:44.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-29T01:07:44.404 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:07:44.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:08:14.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:08:14.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:08:14.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:08:14.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:08:14.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:08:14.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:08:14.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-29T01:08:14.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:08:14.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-29T01:08:14.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:08:14.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:08:14.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:08:14.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-29T01:08:17.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:08:17.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:08:17.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:08:17.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:08:17.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:08:17.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:08:17.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:08:17.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:08:17.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:08:17.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:08:17.169 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:08:17.169 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:08:17.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:08:17.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:08:17.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:08:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:08:17.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:08:17.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:08:17.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:08:17.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:08:17.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:08:17.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:08:17.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:08:17.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:08:17.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:08:00
2026-05-29T01:08:17.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70489, datetime.datetime(2026, 5, 29, 1, 8), datetime.datetime(2026, 5, 29, 1, 7, 59), 'salt', 6.65, 88.35, None, 10.45, 123.16, 1.78, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:08:17.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:08:17.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:08:17.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:59, diff=18.513422s, valid=True
2026-05-29T01:08:17.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:08:17.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:08:17.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:12, diff=5.516242s, valid=True
2026-05-29T01:08:17.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:08:17.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:08:17.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:07:56, diff=21.522772s, valid=True
2026-05-29T01:08:17.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:08:17.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:08:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:08:17.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:08:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:08:17.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:08:17.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:12, diff=5.525779s, valid=True
2026-05-29T01:08:17.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:08:17.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:08:17.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:08:17.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942339.526422s, valid=True
2026-05-29T01:08:17.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:08:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:08:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:08:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:08:17.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:08:17.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:08:17.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:08:17.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:08:17.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:08:17.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:08:17.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:08:17.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:08:17.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:08:17.864 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:08:18.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:08:18.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:08:18.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:08:18.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:08:18.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-29T01:08:18.570 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:08:18.655 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:08:18.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:08:48.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:08:48.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:08:48.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:08:48.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:08:48.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:08:49.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:08:49.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-29T01:08:49.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:08:49.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-29T01:08:49.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:08:49.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:08:49.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:08: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-29T01:08:51.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-29T01:08:51.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:08:51.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:08:51.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:08:51.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:08:51.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:08:51.950 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:08:51.951 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:08:51.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:08:51.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:08:51.951 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:08:51.951 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:08:51.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:08:52.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:08:52.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:08:52.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:08:52.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:08:52.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:08:52.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:08:52.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:08:52.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:08:52.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:08:52.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:08:52.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:08:52.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:08:30
2026-05-29T01:08:52.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70490, datetime.datetime(2026, 5, 29, 1, 8, 30), datetime.datetime(2026, 5, 29, 1, 8, 30), 'salt', 6.52, 88.15, None, 11.05, 115.95, 1.81, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:08:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:08:52.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:08:52.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:30, diff=22.292849s, valid=True
2026-05-29T01:08:52.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:08:52.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:08:52.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:12, diff=40.295609s, valid=True
2026-05-29T01:08:52.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:08:52.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:27, diff=25.302163s, valid=True
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:08:52.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:08:52.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:12, diff=40.305145s, valid=True
2026-05-29T01:08:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:08:52.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:08:52.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:08:52.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942374.305811s, valid=True
2026-05-29T01:08:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:08:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:08:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:08:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:08:52.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:08:52.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:08:52.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:08:52.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:08:52.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:08:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:08:52.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:08:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:08:52.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:08:52.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:08:52.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:08:53.297 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:08:53.397 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:08:53.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:08:53.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-29T01:08:53.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-29T01:08:53.476 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:08:53.477 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:09:23.501 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:09:23.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:09:23.501 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:09:23.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:09:23.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:09:23.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:09:23.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-29T01:09:23.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:09:23.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-29T01:09:24.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:09:24.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:09:24.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:09:24.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-29T01:09:26.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:09:26.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:09:26.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:09:26.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:09:26.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:09:26.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:09:26.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:09:26.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:09:26.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:09:26.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:09:26.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:09:26.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:09:26.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:09:26.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:09:26.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:09:26.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:09:26.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:09:26.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:09:26.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:09:26.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:09:26.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:09:26.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:09:26.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:09:26.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:09:26.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:09:00
2026-05-29T01:09:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70491, datetime.datetime(2026, 5, 29, 1, 9), datetime.datetime(2026, 5, 29, 1, 9), 'salt', 6.59, 88.28, None, 11.58, 120.7, 1.8, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:09:26.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:09:26.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:09:26.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:09:00, diff=26.706843s, valid=True
2026-05-29T01:09:26.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:09:26.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:09:26.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:09:12, diff=14.709607s, valid=True
2026-05-29T01:09:26.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:09:26.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:08:58, diff=28.716112s, valid=True
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:09:26.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:09:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:09:12, diff=14.719087s, valid=True
2026-05-29T01:09:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:09:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:09:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:09:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942408.719747s, valid=True
2026-05-29T01:09:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:09:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:09:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:09:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:09:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:09:26.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:09:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:09:26.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:09:26.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:09:26.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:09:26.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:09:26.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:09:27.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:09:27.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:09:27.250 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:09:27.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:09:27.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:09:27.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:09:27.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-29T01:09:27.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-29T01:09:29.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:09:29.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:09:59.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:09:59.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:09:59.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:10:00.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:10:00.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:10:00.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:10:00.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-29T01:10:00.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:10:00.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-29T01:10:00.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:10:00.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:10:00.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:10:00.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:10:02.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-29T01:10:02.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:10:02.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:10:02.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:10:02.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:10:02.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:10:02.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:10:02.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:10:02.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:10:02.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:10:02.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:10:02.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:10:02.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:10:02.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:10:02.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:10:02.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:10:02.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:10:02.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:10:02.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:10:02.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:10:02.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:10:02.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:10:02.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:10:02.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:10:03.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:10:02
2026-05-29T01:10:03.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70493, datetime.datetime(2026, 5, 29, 1, 10, 2), datetime.datetime(2026, 5, 29, 1, 10, 1), 'salt', 6.55, 88.35, None, 12.21, 126.61, 1.78, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:10:03.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:10:03.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:10:03.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:01, diff=2.028698s, valid=True
2026-05-29T01:10:03.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:10:03.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:10:03.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=-8.968453s, valid=True
2026-05-29T01:10:03.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:10:03.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:01, diff=2.038087s, valid=True
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:10:03.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:10:03.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=-8.958898s, valid=True
2026-05-29T01:10:03.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:10:03.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:10:03.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:10:03.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942445.041769s, valid=True
2026-05-29T01:10:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:10:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:10:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:10:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:10:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:10:03.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:10:03.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:10:03.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:10:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:10:03.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:10:03.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:10:03.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:10:03.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:10:03.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:10:03.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:10:03.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:10:04.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:10:04.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:10:04.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:10:04.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-29T01:10:04.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:10:04.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:10:34.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:10:34.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:10:34.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:10:34.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:10:34.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:10:34.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:10:34.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:10:34.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:10:34.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-29T01:10:34.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:10:34.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:10:34.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:10:34.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-29T01:10:37.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-29T01:10:37.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:10:37.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:10:37.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:10:37.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:10:37.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:10:37.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:10:37.284 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:10:37.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:10:37.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:10:37.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:10:37.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:10:37.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:10:37.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:10:37.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:10:37.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:10:37.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:10:37.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:10:37.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:10:37.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:10:37.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:10:37.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:10:37.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:10:37.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:10:37.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:10:32
2026-05-29T01:10:37.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70494, datetime.datetime(2026, 5, 29, 1, 10, 32), datetime.datetime(2026, 5, 29, 1, 10, 31), 'salt', 6.55, 88.28, None, 13.34, 115.11, 1.79, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:10:37.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:10:37.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:10:37.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:31, diff=6.624069s, valid=True
2026-05-29T01:10:37.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:10:37.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:10:37.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=25.626885s, valid=True
2026-05-29T01:10:37.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:10:37.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:10:37.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:27, diff=10.634818s, valid=True
2026-05-29T01:10:37.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:10:37.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:10:37.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:10:37.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:10:37.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:10:37.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:10:37.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=25.637792s, valid=True
2026-05-29T01:10:37.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:10:37.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:10:37.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:10:37.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942479.63845s, valid=True
2026-05-29T01:10:37.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:10:37.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:10:37.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:10:37.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:10:37.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:10:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:10:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:10:37.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:10:37.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:10:37.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:10:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:10:37.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:10:37.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:10:37.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:10:38.182 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:10:38.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:10:38.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:10:38.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:10:38.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-29T01:10:38.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-29T01:10:38.822 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:10:38.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:11:08.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:11:08.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:11:08.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:11:09.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:11:09.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:11:09.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:11:09.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-29T01:11:09.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:11:09.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-29T01:11:09.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:11:09.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:11:09.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:11:09.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-29T01:11: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-29T01:11:11.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:11:12.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:11:12.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:11:12.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:11:12.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:11:12.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:11:12.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:11:12.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:11:12.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:11:12.020 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:11:12.020 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:11:12.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:11:12.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:11:12.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:11:12.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:11:12.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:11:12.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:11:12.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:11:12.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:11:12.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:11:12.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:11:12.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:11:12.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:11:12.366 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:11:02
2026-05-29T01:11:12.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70495, datetime.datetime(2026, 5, 29, 1, 11, 2), datetime.datetime(2026, 5, 29, 1, 11, 1), 'salt', 6.69, 88.52, None, 12.74, 116.49, 1.76, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:11:12.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:11:12.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:11:12.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:11:01, diff=11.372184s, valid=True
2026-05-29T01:11:12.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:11:12.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:11:12.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=60.374943s, valid=True
2026-05-29T01:11:12.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:11:12.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:57, diff=15.381461s, valid=True
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:11:12.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:11:12.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=60.384514s, valid=True
2026-05-29T01:11:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:11:12.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:11:12.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:11:12.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942514.38519s, valid=True
2026-05-29T01:11:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:11:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:11:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:11:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:11:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:11:12.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:11:12.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:11:12.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:11:12.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:11:12.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:11:12.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:11:12.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:11:12.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:11:12.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:11:12.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:11:13.315 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:11:13.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:11:13.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:11:13.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-29T01:11:13.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-29T01:11:13.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:11:13.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:11:43.522 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:11:43.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:11:43.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:11:43.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:11:43.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:11:43.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:11:43.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-29T01:11:44.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:11:44.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-29T01:11:44.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:11:44.014 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:11:44.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:11:44.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-29T01:11:46.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-29T01:11:46.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:11:46.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:11:46.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:11:46.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:11:46.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:11:46.434 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:11:46.434 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:11:46.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:11:46.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:11:46.435 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:11:46.435 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:11:46.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:11:46.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:11:46.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:11:46.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:11:46.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:11:46.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:11:46.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:11:46.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:11:46.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:11:46.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:11:46.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:11:46.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:11:46.751 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:11:32
2026-05-29T01:11:46.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70496, datetime.datetime(2026, 5, 29, 1, 11, 32), datetime.datetime(2026, 5, 29, 1, 11, 32), 'salt', 6.82, 88.68, None, 11.75, 120.25, 1.73, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:11:46.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:11:46.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:11:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:11:32, diff=14.757676s, valid=True
2026-05-29T01:11:46.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:11:46.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:11:46.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=94.7605s, valid=True
2026-05-29T01:11:46.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:11:46.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:11:27, diff=19.767148s, valid=True
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:11:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:11:46.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=94.770167s, valid=True
2026-05-29T01:11:46.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:11:46.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:11:46.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:11:46.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942548.770842s, valid=True
2026-05-29T01:11:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:11:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:11:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:11:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:11:46.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:11:46.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:11:46.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:11:46.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:11:46.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:11:46.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:11:46.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:11:47.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:11:47.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:11:47.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:11:47.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:11:47.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:11:47.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:11:47.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:11:47.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-29T01:11:47.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-29T01:11:47.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:11:47.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:12:17.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:12:17.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:12:17.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:12:18.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:12:18.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:12:18.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:12:18.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:12:18.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:12:18.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-29T01:12:18.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:12:18.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:12:18.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:12:18.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-29T01:12:20.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-29T01:12:20.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:12:20.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:12:20.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:12:20.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:12:20.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:12:20.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:12:20.619 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:12:20.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:12:20.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:12:20.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:12:20.619 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:12:20.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:12:20.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:12:20.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:12:20.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:12:20.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:12:20.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:12:20.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:12:20.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:12:20.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:12:20.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:12:20.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:12:20.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:12:20.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:12:02
2026-05-29T01:12:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70497, datetime.datetime(2026, 5, 29, 1, 12, 2), datetime.datetime(2026, 5, 29, 1, 12, 2), 'salt', 6.75, 88.55, None, 12.46, 124.92, 1.75, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:12:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:12:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:12:20.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:12:02, diff=18.960508s, valid=True
2026-05-29T01:12:20.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:12:20.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:12:20.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=128.963397s, valid=True
2026-05-29T01:12:20.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:12:20.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:11:57, diff=23.970039s, valid=True
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:12:20.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:12:20.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=128.973761s, valid=True
2026-05-29T01:12:20.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:12:20.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:12:20.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:12:20.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942582.974608s, valid=True
2026-05-29T01:12:20.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:12:20.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:12:20.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:12:20.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:12:20.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:12:21.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:12:21.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:12:21.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:12:21.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:12:21.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:12:21.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:12:21.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:12:21.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:12:21.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:12:21.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:12:21.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:12:22.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:12:22.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:12:22.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-29T01:12:22.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-29T01:12:22.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:12:22.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:12:52.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:12:52.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:12:52.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:12:52.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:12:52.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:12:52.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:12:52.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-29T01:12:52.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:12:52.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-29T01:12:52.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:12:52.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:12:52.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:12:52.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-29T01:12:55.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-29T01:12:55.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:12:55.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:12:55.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:12:55.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:12:55.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:12:55.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:12:55.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:12:55.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:12:55.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:12:55.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:12:55.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:12:55.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:12:55.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:12:55.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:12:55.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:12:55.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:12:55.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:12:55.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:12:55.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:12:55.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:12:55.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:12:55.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:12:55.933 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:12:55.993 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:12:33
2026-05-29T01:12:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70498, datetime.datetime(2026, 5, 29, 1, 12, 33), datetime.datetime(2026, 5, 29, 1, 12, 32), 'salt', 6.59, 88.42, None, 11.08, 124.12, 1.77, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:12:55.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:12:55.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:12:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:12:32, diff=23.999291s, valid=True
2026-05-29T01:12:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:12:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:12:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=164.002153s, valid=True
2026-05-29T01:12:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:12:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:12:56.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:12:28, diff=28.00888s, valid=True
2026-05-29T01:12:56.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:12:56.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:12:56.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:12:56.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:12:56.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:12:56.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:12:56.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=164.011957s, valid=True
2026-05-29T01:12:56.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:12:56.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:12:56.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:12:56.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942618.012614s, valid=True
2026-05-29T01:12:56.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:12:56.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:12:56.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:12:56.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:12:56.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:12:56.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:12:56.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:12:56.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:12:56.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:12:56.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:12:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:12:56.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:12:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:12:56.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:12:56.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:12:56.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:12:56.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:12:56.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:12:56.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-29T01:12:56.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-29T01:12:57.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:12:57.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:13:27.204 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:13:27.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:13:27.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:13:27.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:13:27.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:13:27.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:13:27.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-29T01:13:27.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:13:27.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-29T01:13:27.870 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:13:27.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:13:27.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:13:27.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-29T01:13:30.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-29T01:13:30.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:13:30.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:13:30.394 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:13:30.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:13:30.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:13:30.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:13:30.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:13:30.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:13:30.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:13:30.406 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:13:30.406 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:13:30.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:13:30.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:13:30.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:13:30.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:13:30.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:13:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:13:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:13:30.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:13:30.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:13:30.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:13:30.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:13:30.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:13:30.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:13:03
2026-05-29T01:13:30.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70499, datetime.datetime(2026, 5, 29, 1, 13, 3), datetime.datetime(2026, 5, 29, 1, 13, 2), 'salt', 6.59, 88.35, None, 11.65, 121.4, 1.78, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:13:30.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:13:30.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:13:30.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:13:02, diff=28.766018s, valid=True
2026-05-29T01:13:30.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:13:30.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:13:30.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=198.768904s, valid=True
2026-05-29T01:13:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:13:30.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:12:59, diff=31.775553s, valid=True
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:13:30.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:13:30.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:13:30.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=198.778921s, valid=True
2026-05-29T01:13:30.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:13:30.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:13:30.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:13:30.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942652.779598s, valid=True
2026-05-29T01:13:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:13:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:13:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:13:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:13:30.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:13:30.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:13:30.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:13:30.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:13:30.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:13:30.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:13:30.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:13:31.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:13:31.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:13:31.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:13:31.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:13:31.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:13:31.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:13:31.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:13:31.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-29T01:13:31.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-29T01:13:31.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:13:31.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:14:01.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:14:01.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:14:01.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:14:02.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:14:02.345 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:14:02.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:14:02.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-29T01:14:02.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:14:02.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-29T01:14:02.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:14:02.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:14:02.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:14:02.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-29T01:14:04.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-29T01:14:04.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:14:04.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:14:04.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:14:04.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:14:04.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:14:04.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:14:04.941 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:14:04.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:14:04.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:14:04.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:14:04.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:14:04.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:14:05.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T01:14:05.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:14:05.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T01:14:05.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:14:05.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:14:05.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:14:05.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:14:05.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:14:05.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:14:05.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:14:05.202 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:14:05.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:14:03
2026-05-29T01:14:05.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70501, datetime.datetime(2026, 5, 29, 1, 14, 3), datetime.datetime(2026, 5, 29, 1, 14, 2), 'salt', 6.75, 88.58, None, 12.95, 119.08, 1.74, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:14:05.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:14:05.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T01:14:05.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:14:02, diff=3.266853s, valid=True
2026-05-29T01:14:05.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:14:05.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:14:05.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=233.269739s, valid=True
2026-05-29T01:14:05.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:14:05.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:14:02, diff=3.276364s, valid=True
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:14:05.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:14:05.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=233.27938s, valid=True
2026-05-29T01:14:05.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:14:05.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:14:05.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:14:05.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942687.280046s, valid=True
2026-05-29T01:14:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:14:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:14:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:14:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:14:05.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:14:05.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:14:05.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:14:05.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:14:05.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:14:05.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:14:05.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:14:05.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:14:05.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:14:05.602 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:14:05.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:14:06.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:14:06.298 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:14:06.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:14:06.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-29T01:14:06.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-29T01:14:06.480 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:14:06.480 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:14:36.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:14:36.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:14:36.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:14:36.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:14:36.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:14:37.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:14:37.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-29T01:14:37.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:14:37.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-29T01:14:37.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:14:37.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:14:37.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:14:37.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-29T01:14:39.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-29T01:14:39.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:14:39.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:14:39.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:14:39.515 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:14:39.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:14:39.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:14:39.536 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:14:39.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:14:39.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:14:39.536 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:14:39.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:14:39.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:14:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:14:39.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:14:39.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:14:39.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:14:39.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:14:39.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:14:39.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:14:39.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:14:39.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:14:39.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:14:39.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:14:39.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:14:34
2026-05-29T01:14:39.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70502, datetime.datetime(2026, 5, 29, 1, 14, 34), datetime.datetime(2026, 5, 29, 1, 14, 33), 'salt', 6.72, 88.68, None, 12.77, 123.75, 1.73, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:14:39.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:14:39.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:14:39.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:14:33, diff=6.863811s, valid=True
2026-05-29T01:14:39.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:14:39.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:14:39.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=267.867486s, valid=True
2026-05-29T01:14:39.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:14:39.867 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:14:29, diff=10.875365s, valid=True
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:14:39.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:14:39.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=267.878523s, valid=True
2026-05-29T01:14:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:14:39.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:14:39.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:14:39.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942721.879204s, valid=True
2026-05-29T01:14:39.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:14:39.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:14:39.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:14:39.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:14:39.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:14:39.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:14:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:14:39.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:14:39.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:14:40.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:14:40.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:14:40.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:14:40.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:14:40.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:14:40.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:14:40.780 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:14:40.881 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:14:40.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:14:40.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-29T01:14:40.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-29T01:14:41.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:14:41.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:15:11.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:15:11.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:15:11.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:15:11.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:15:11.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:15:11.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:15:11.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-29T01:15:11.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:15:11.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-29T01:15:11.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:15:11.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:15:11.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:15:11.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-29T01:15:13.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-29T01:15:13.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:15:13.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:15:13.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:15:13.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:15:13.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:15:13.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:15:13.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:15:13.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:15:13.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:15:13.927 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:15:13.927 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:15:13.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:15:14.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:15:14.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:15:14.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:15:14.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:15:14.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:15:14.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:15:14.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:15:14.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:15:14.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:15:14.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:15:14.205 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:15:14.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:15:04
2026-05-29T01:15:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70503, datetime.datetime(2026, 5, 29, 1, 15, 4), datetime.datetime(2026, 5, 29, 1, 15, 3), 'salt', 6.79, 88.75, None, 11.86, 122.34, 1.72, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:15:14.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:15:14.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:15:14.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:15:03, diff=11.271766s, valid=True
2026-05-29T01:15:14.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:15:14.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:15:14.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=302.274602s, valid=True
2026-05-29T01:15:14.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:15:14.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:14:59, diff=15.281336s, valid=True
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:15:14.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:15:14.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:10:12, diff=302.284368s, valid=True
2026-05-29T01:15:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:15:14.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:15:14.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:15:14.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942756.285044s, valid=True
2026-05-29T01:15:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:15:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:15:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:15:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:15:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:15:14.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:15:14.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:15:14.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:15:14.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:15:14.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:15:14.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:15:14.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:15:14.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:15:14.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:15:14.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:15:15.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:15:15.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:15:15.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:15:15.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-29T01:15:15.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-29T01:15:15.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:15:15.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:15:45.579 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:15:45.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:15:45.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:15:45.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:15:45.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:15:46.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:15:46.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-29T01:15:46.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:15:46.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-29T01:15:46.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:15:46.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:15:46.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:15:46.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-29T01:15:48.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-29T01:15:48.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:15:48.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:15:48.458 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:15:48.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:15:48.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:15:48.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:15:48.477 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:15:48.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:15:48.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:15:48.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:15:48.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:15:48.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:15:48.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:15:48.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:15:48.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:15:48.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:15:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:15:48.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:15:48.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:15:48.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:15:48.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:15:48.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:15:48.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:15:48.809 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:15:34
2026-05-29T01:15:48.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70504, datetime.datetime(2026, 5, 29, 1, 15, 34), datetime.datetime(2026, 5, 29, 1, 15, 34), 'salt', 6.79, 88.78, None, 11.19, 125.98, 1.72, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:15:48.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:15:48.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:15:48.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:15:34, diff=14.815539s, valid=True
2026-05-29T01:15:48.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:15:48.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:15:48.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:12, diff=-23.181626s, valid=True
2026-05-29T01:15:48.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:15:48.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:15:48.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:15:29, diff=19.82497s, valid=True
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:15:48.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:15:48.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:12, diff=-23.172047s, valid=True
2026-05-29T01:15:48.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:15:48.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:15:48.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:15:48.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942790.828609s, valid=True
2026-05-29T01:15:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:15:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:15:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:15:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:15:48.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:15:48.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:15:48.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:15:48.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:15:48.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:15:48.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:15:49.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:15:49.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:15:49.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:15:49.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:15:49.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:15:49.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:15:49.850 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:15:49.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:15:49.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-29T01:15:49.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-29T01:15:49.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:15:49.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:16:19.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:16:19.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:16:19.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:16:20.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:16:20.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:16:20.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:16:20.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-29T01:16:20.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:16:20.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-29T01:16:20.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:16:20.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:16:20.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:16:20.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-29T01:16:22.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:16:22.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:16:22.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:16:22.614 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:16:22.614 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:16:22.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:16:22.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:16:22.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:16:22.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:16:22.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:16:22.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:16:22.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:16:22.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:16:22.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:16:22.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:16:22.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:16:22.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:16:22.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:16:22.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:16:22.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:16:22.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:16:22.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:16:22.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:16:22.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:16:22.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:16:04
2026-05-29T01:16:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70505, datetime.datetime(2026, 5, 29, 1, 16, 4), datetime.datetime(2026, 5, 29, 1, 16, 4), 'salt', 6.79, 88.78, None, 9.95, 122.81, 1.72, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:16:22.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:16:22.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:16:22.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:04, diff=18.954153s, valid=True
2026-05-29T01:16:22.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:16:22.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:16:22.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:12, diff=10.956971s, valid=True
2026-05-29T01:16:22.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:16:22.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:00, diff=22.963573s, valid=True
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:16:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:16:22.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:16:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:12, diff=10.966575s, valid=True
2026-05-29T01:16:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:16:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:16:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:16:22.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942824.967232s, valid=True
2026-05-29T01:16:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:16:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:16:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:16:22.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:16:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:16:23.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:16:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:16:23.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:16:23.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:16:23.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:16:23.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:16:23.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:16:23.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:16:23.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:16:23.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:16:23.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:16:24.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:16:24.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:16:24.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-29T01:16:24.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-29T01:16:24.185 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:16:24.185 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:16:54.215 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:16:54.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:16:54.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:16:54.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:16:54.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:16:54.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:16:54.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-29T01:16:54.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:16:54.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-29T01:16:54.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:16:54.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:16:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:16:54.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-29T01:16:57.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:16:57.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:16:57.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:16:57.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:16:57.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:16:57.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:16:57.306 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:16:57.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:16:57.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:16:57.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:16:57.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:16:57.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:16:57.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:16:57.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:16:57.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:16:57.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:16:57.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:16:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:16:57.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:16:57.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:16:57.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:16:57.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:16:57.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:16:57.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:16:57.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:16:34
2026-05-29T01:16:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70506, datetime.datetime(2026, 5, 29, 1, 16, 34), datetime.datetime(2026, 5, 29, 1, 16, 34), 'salt', 6.79, 88.75, None, 10.48, 123.91, 1.72, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:16:57.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:16:57.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:16:57.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:34, diff=23.655643s, valid=True
2026-05-29T01:16:57.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:16:57.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:16:57.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:12, diff=-14.340212s, valid=True
2026-05-29T01:16:57.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:16:57.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:16:57.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:16:30, diff=27.669517s, valid=True
2026-05-29T01:16:57.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:16:57.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:16:57.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:16:57.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:16:57.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:16:57.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:16:57.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:12, diff=-14.326351s, valid=True
2026-05-29T01:16:57.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:16:57.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:16:57.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:16:57.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942859.67432s, valid=True
2026-05-29T01:16:57.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:16:57.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:16:57.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:16:57.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:16:57.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:16:57.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:16:57.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:16:57.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:16:57.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:16:57.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:16:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:16:57.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:16:57.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:16:57.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:16:58.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:16:58.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:16:58.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:16:58.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:16:58.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:16:58.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:16:58.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:16:58.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:17:28.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:17:28.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:17:28.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:17:29.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:17:29.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:17:29.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:17:29.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-29T01:17:29.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:17:29.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-29T01:17:29.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:17:29.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:17:29.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:17: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-29T01:17:31.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-29T01:17:31.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:17:31.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:17:31.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:17:31.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:17:31.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:17:31.738 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:17:31.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:17:31.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:17:31.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:17:31.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:17:31.739 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:17:31.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:17:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:17:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:17:31.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:17:31.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:17:31.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:17:31.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:17:31.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:17:31.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:17:32.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:17:32.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:17:32.003 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:17:32.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:17:05
2026-05-29T01:17:32.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70507, datetime.datetime(2026, 5, 29, 1, 17, 5), datetime.datetime(2026, 5, 29, 1, 17, 4), 'salt', 6.69, 88.68, None, 11.22, 123.23, 1.73, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:17:32.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:17:32.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:17:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:04, diff=28.066121s, valid=True
2026-05-29T01:17:32.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:17:32.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:17:32.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:12, diff=20.069018s, valid=True
2026-05-29T01:17:32.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:17:32.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:01, diff=31.077009s, valid=True
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:17:32.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:17:32.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:17:12, diff=20.080049s, valid=True
2026-05-29T01:17:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:17:32.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:17:32.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:17:32.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942894.080718s, valid=True
2026-05-29T01:17:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:17:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:17:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:17:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:17:32.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:17:32.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:17:32.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:17:32.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:17:32.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:17:32.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:17:32.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:17:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:17:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:17:32.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:17:32.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:17:33.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:17:33.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:17:33.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:17:33.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-29T01:17:33.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-29T01:17:33.358 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:17:33.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:18:03.379 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:18:03.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:18:03.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:18:03.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:18:03.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:18:04.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:18:04.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-29T01:18:04.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:18:04.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-29T01:18:04.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:18:04.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:18:04.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:18:04.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-29T01:18:06.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:18:06.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:18:06.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:18:06.409 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:18:06.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:18:06.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:18:06.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:18:06.431 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:18:06.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:18:06.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:18:06.431 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:18:06.431 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:18:06.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:18:06.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T01:18:06.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:18:06.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:18:06.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:18:06.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:18:06.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:18:06.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:18:06.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:18:06.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:18:06.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:18:06.684 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:18:06.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:18:05
2026-05-29T01:18:06.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70509, datetime.datetime(2026, 5, 29, 1, 18, 5), datetime.datetime(2026, 5, 29, 1, 18, 5), 'salt', 6.69, 88.68, None, 10.09, 123.32, 1.73, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:18:06.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:18:06.741 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T01:18:06.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:05, diff=1.750762s, valid=True
2026-05-29T01:18:06.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:18:06.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:18:06.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:12, diff=-5.245904s, valid=True
2026-05-29T01:18:06.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:18:06.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:18:06.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:04, diff=2.760768s, valid=True
2026-05-29T01:18:06.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:18:06.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:18:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:18:06.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:18:06.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:18:06.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:18:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:12, diff=-5.236283s, valid=True
2026-05-29T01:18:06.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:18:06.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:18:06.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:18:06.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942928.764386s, valid=True
2026-05-29T01:18:06.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:18:06.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:18:06.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:18:06.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:18:06.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:18:06.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:18:06.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:18:06.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:18:06.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:18:06.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:18:06.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:18:07.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:18:07.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:18:07.098 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:18:07.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:18:07.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:18:07.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:18:07.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:18:07.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-29T01:18:07.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-29T01:18:07.972 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:18:07.972 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:18:38.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:18:38.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:18:38.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:18:38.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:18:38.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:18:38.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:18:38.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-29T01:18:38.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:18:38.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-29T01:18:38.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:18:38.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:18:38.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:18:38.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:18:41.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-29T01:18:41.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:18:41.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:18:41.369 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:18:41.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:18:41.379 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:18:41.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:18:41.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:18:41.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:18:41.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:18:41.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:18:41.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:18:41.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:18:41.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:18:41.475 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:18:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:18:41.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:18:41.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:18:41.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:18:41.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:18:41.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:18:41.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:18:41.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:18:41.645 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:18:41.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:18:35
2026-05-29T01:18:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70510, datetime.datetime(2026, 5, 29, 1, 18, 35), datetime.datetime(2026, 5, 29, 1, 18, 35), 'salt', 6.59, 88.72, None, 10.66, 125.63, 1.72, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:18:41.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:18:41.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:18:41.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:35, diff=6.720766s, valid=True
2026-05-29T01:18:41.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:18:41.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:18:41.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:12, diff=-30.276341s, valid=True
2026-05-29T01:18:41.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:18:41.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:18:31, diff=10.730339s, valid=True
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:18:41.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:18:41.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:12, diff=-30.266618s, valid=True
2026-05-29T01:18:41.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:18:41.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:18:41.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:18:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942963.734056s, valid=True
2026-05-29T01:18:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:18:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:18:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:18:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:18:41.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:18:41.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:18:41.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:18:41.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:18:41.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:18:41.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:18:41.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:18:42.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:18:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:18:42.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:18:42.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:18:42.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:18:42.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:18:42.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:18:42.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-29T01:18: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-29T01:18:42.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:18:42.953 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:19:12.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:19:12.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:19:12.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:19:13.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:19:13.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:19:13.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:19:13.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:19:13.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:19:13.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-29T01:19:13.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:19:13.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:19:13.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:19:13.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-29T01:19:15.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-29T01:19:15.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:19:15.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:19:15.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:19:15.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:19:15.724 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:19:15.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:19:15.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:19:15.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:19:15.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:19:15.737 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:19:15.737 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:19:15.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:19:15.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:19:15.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:19:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:19:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:19:15.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:19:15.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:19:15.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:19:15.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:19:15.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:19:15.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:19:15.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:19:16.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:19:05
2026-05-29T01:19:16.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70511, datetime.datetime(2026, 5, 29, 1, 19, 5), datetime.datetime(2026, 5, 29, 1, 19, 5), 'salt', 6.56, 88.65, None, 11.54, 124.43, 1.74, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:19:16.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:19:16.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:19:16.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:05, diff=11.051805s, valid=True
2026-05-29T01:19:16.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:19:16.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:19:16.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:12, diff=4.054637s, valid=True
2026-05-29T01:19:16.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:19:16.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:01, diff=15.061378s, valid=True
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:19:16.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:19:16.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:12, diff=4.064375s, valid=True
2026-05-29T01:19:16.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:19:16.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:19:16.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:19:16.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=942998.065042s, valid=True
2026-05-29T01:19:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:19:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:19:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:19:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:19:16.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:19:16.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:19:16.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:19:16.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:19:16.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:19:16.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:19:16.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:19:16.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:19:16.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:19:16.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:19:16.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:19:16.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:19:17.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:19:17.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:19: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-29T01:19:17.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-29T01:19:17.227 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:19:17.228 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:19:47.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:19:47.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:19:47.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:19:47.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:19:47.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:19:48.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:19:48.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:19:48.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:19:48.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-29T01:19:48.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:19:48.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:19:48.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:19:48.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:19: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-29T01:19:50.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:19:50.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:19:50.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:19:50.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:19:50.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:19:50.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:19:50.546 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:19:50.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:19:50.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:19:50.547 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:19:50.547 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:19:50.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:19:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:19:50.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:19:50.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:19:50.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:19:50.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:19:50.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:19:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:19:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:19:50.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:19:50.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:19:50.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:19:50.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:19:36
2026-05-29T01:19:50.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70512, datetime.datetime(2026, 5, 29, 1, 19, 36), datetime.datetime(2026, 5, 29, 1, 19, 35), 'salt', 6.69, 88.88, None, 10.27, 132.79, 1.7, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:19:50.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:19:50.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:19:50.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:35, diff=15.875958s, valid=True
2026-05-29T01:19:50.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:19:50.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:19:50.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:12, diff=-21.121199s, valid=True
2026-05-29T01:19:50.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:19:50.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:19:31, diff=19.885374s, valid=True
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:19:50.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:19:50.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:12, diff=-21.111646s, valid=True
2026-05-29T01:19:50.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:19:50.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:19:50.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:19:50.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943032.889003s, valid=True
2026-05-29T01:19:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:19:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:19:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:19:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:19:50.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:19:50.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:19:50.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:19:50.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:19:50.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:19:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:19:51.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:19:51.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:19:51.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:19:51.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:19:51.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:19:51.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:19:51.854 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:19:51.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:19:51.854 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:19:51.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-29T01:19:52.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:19:52.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:20:22.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:20:22.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:20:22.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:20:22.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:20:22.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:20:22.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:20:22.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-29T01:20:22.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:20:22.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-29T01:20:22.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:20:22.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:20:22.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:20:22.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-29T01:20:25.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:20:25.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:20:25.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:20:25.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:20:25.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:20:25.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:20:25.695 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:20:25.695 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:20:25.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:20:25.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:20:25.696 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:20:25.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:20:25.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:20:25.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:20:25.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:20:25.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:20:25.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:20:25.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:20:25.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:20:25.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:20:25.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:20:25.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:20:25.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:20:25.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:20:26.010 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:20:06
2026-05-29T01:20:26.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70513, datetime.datetime(2026, 5, 29, 1, 20, 6), datetime.datetime(2026, 5, 29, 1, 20, 6), 'salt', 6.59, 88.81, None, 10.98, 127.06, 1.71, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:20:26.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:20:26.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:20:26.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:06, diff=20.016255s, valid=True
2026-05-29T01:20:26.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:20:26.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:20:26.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:12, diff=14.019038s, valid=True
2026-05-29T01:20:26.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:20:26.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:20:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:02, diff=24.026779s, valid=True
2026-05-29T01:20:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:20:26.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:20:26.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:20:26.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:20:26.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:20:26.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:20:26.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:12, diff=14.029774s, valid=True
2026-05-29T01:20:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:20:26.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:20:26.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:20:26.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943068.030441s, valid=True
2026-05-29T01:20:26.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:20:26.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:20:26.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:20:26.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:20:26.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:20:26.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:20:26.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:20:26.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:20:26.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:20:26.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:20:26.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:20:26.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:20:26.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:20:26.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:20:26.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:20:26.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:20:27.080 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:20:27.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:20:27.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-29T01:20:27.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-29T01:20:27.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:20:27.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:20:57.264 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:20:57.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:20:57.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:20:57.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:20:57.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:20:57.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:20:57.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-29T01:20:57.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:20:57.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-29T01:20:57.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:20:57.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:20:57.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:20:57.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-29T01:21:00.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:21:00.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:21:00.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:21:00.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:21:00.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:21:00.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:21:00.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:21:00.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:21:00.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:21:00.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:21:00.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:21:00.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:21:00.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:21:00.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:21:00.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:21:00.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:21:00.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:21:00.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:21:00.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:21:00.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:21:00.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:21:00.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:21:00.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:21:00.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:21:00.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:20:36
2026-05-29T01:21:00.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70514, datetime.datetime(2026, 5, 29, 1, 20, 36), datetime.datetime(2026, 5, 29, 1, 20, 36), 'salt', 6.52, 88.68, None, 10.73, 131.05, 1.73, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:21:00.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:21:00.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:21:00.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:36, diff=24.994051s, valid=True
2026-05-29T01:21:00.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:21:00.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:21:00.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:12, diff=-11.003109s, valid=True
2026-05-29T01:21:00.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:21:00.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:20:32, diff=29.003482s, valid=True
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:21:01.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:21:01.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:12, diff=-10.993512s, valid=True
2026-05-29T01:21:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:21:01.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:21:01.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:21:01.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943103.007156s, valid=True
2026-05-29T01:21:01.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:21:01.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:21:01.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:21:01.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:21:01.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:21:01.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:21:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:21:01.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:21:01.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:21:01.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:21:01.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:21:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:21:01.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:21:01.341 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:21:01.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:21:01.900 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:21:02.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:21:02.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:21:02.038 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:21:02.038 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:21:02.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:21:02.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:21:32.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:21:32.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:21:32.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:21:32.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:21:32.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:21:32.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:21:32.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-29T01:21:32.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:21:32.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-29T01:21:32.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:21:32.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:21:32.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:21:32.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-29T01:21:34.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-29T01:21:34.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:21:34.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:21:34.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:21:34.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:21:34.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:21:35.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:21:35.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:21:35.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:21:35.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:21:35.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:21:35.007 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:21:35.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:21:35.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:21:35.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:21:35.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:21:35.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:21:35.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:21:35.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:21:35.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:21:35.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:21:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:21:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:21:35.262 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:21:35.319 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:21:06
2026-05-29T01:21:35.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70515, datetime.datetime(2026, 5, 29, 1, 21, 6), datetime.datetime(2026, 5, 29, 1, 21, 6), 'salt', 6.59, 88.88, None, 10.98, 128.02, 1.7, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:21:35.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:21:35.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:21:35.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:06, diff=29.325733s, valid=True
2026-05-29T01:21:35.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:21:35.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:21:35.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:12, diff=23.328557s, valid=True
2026-05-29T01:21:35.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:21:35.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:03, diff=32.335234s, valid=True
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:21:35.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:21:35.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:21:12, diff=23.338218s, valid=True
2026-05-29T01:21:35.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:21:35.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:21:35.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:21:35.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943137.338885s, valid=True
2026-05-29T01:21:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:21:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:21:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:21:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:21:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:21:35.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:21:35.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:21:35.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:21:35.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:21:35.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:21:35.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:21:35.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:21:35.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:21:35.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:21:35.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:21:36.296 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:21:36.395 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:21:36.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:21:36.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:21:36.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:21:36.658 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:21:36.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:22:06.688 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:22:06.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:22:06.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:22:06.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:22:06.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:22:07.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:22:07.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-29T01:22:07.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:22:07.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-29T01:22:07.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:22:07.089 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:22:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:22:07.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:22:09.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:22:09.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:22:09.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:22:09.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:22:09.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:22:09.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:22:09.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:22:09.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:22:09.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:22:09.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:22:09.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:22:09.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:22:09.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:22:09.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:22:09.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:22:09.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:22:09.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:22:09.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:22:09.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:22:09.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:22:09.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:22:09.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:22:09.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:22:09.881 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:22:09.940 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:22:07
2026-05-29T01:22:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70517, datetime.datetime(2026, 5, 29, 1, 22, 7), datetime.datetime(2026, 5, 29, 1, 22, 7), 'salt', 6.62, 88.91, None, 10.55, 125.35, 1.69, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:22:09.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:22:09.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:22:09.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:07, diff=2.946977s, valid=True
2026-05-29T01:22:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:22:09.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:22:09.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:12, diff=-2.050045s, valid=True
2026-05-29T01:22:09.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:22:09.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:22:09.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:06, diff=3.956659s, valid=True
2026-05-29T01:22:09.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:22:09.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:22:09.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:22:09.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:22:09.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:22:09.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:22:09.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:12, diff=-2.039991s, valid=True
2026-05-29T01:22:09.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:22:09.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:22:09.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:22:09.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943171.960864s, valid=True
2026-05-29T01:22:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:22:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:22:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:22:09.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:22:09.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:22:10.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:22:10.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:22:10.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:22:10.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:22:10.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:22:10.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:22:10.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:22:10.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:22:10.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:22:10.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:22:10.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:22:10.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:22:10.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:22:10.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-29T01:22:10.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:22:11.139 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:22:11.139 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:22:41.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:22:41.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:22:41.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:22:41.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:22:41.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:22:41.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:22:41.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-29T01:22:41.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:22:41.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-29T01:22:41.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:22:41.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:22:41.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:22:41.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:22:44.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:22:44.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:22:44.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:22:44.364 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:22:44.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:22:44.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:22:44.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:22:44.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:22:44.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:22:44.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:22:44.390 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:22:44.390 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:22:44.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:22:44.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:22:44.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:22:44.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:22:44.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:22:44.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:22:44.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:22:44.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:22:44.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:22:44.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:22:44.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:22:44.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:22:44.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:22:37
2026-05-29T01:22:44.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70518, datetime.datetime(2026, 5, 29, 1, 22, 37), datetime.datetime(2026, 5, 29, 1, 22, 37), 'salt', 6.55, 88.91, None, 11.93, 128.8, 1.69, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:22:44.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:22:44.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:22:44.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:37, diff=7.793735s, valid=True
2026-05-29T01:22:44.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:22:44.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:22:44.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:12, diff=-27.202885s, valid=True
2026-05-29T01:22:44.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:22:44.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:22:37, diff=7.805031s, valid=True
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:22:44.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:22:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:12, diff=-27.191301s, valid=True
2026-05-29T01:22:44.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:22:44.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:22:44.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:22:44.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943206.809506s, valid=True
2026-05-29T01:22:44.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:22:44.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:22:44.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:22:44.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:22:44.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:22:44.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:22:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:22:44.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:22:44.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:22:44.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:22:45.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:22:45.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:22:45.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:22:45.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:22:45.404 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:22:45.742 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:22:45.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:22:45.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:22: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-29T01:22: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-29T01:22:46.026 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:22:46.026 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:23:16.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:23:16.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:23:16.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:23:16.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:23:16.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:23:16.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:23: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-29T01:23:16.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:23:16.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-29T01:23:16.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:23:16.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:23:16.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:23:16.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-29T01:23:18.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-29T01:23:18.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:23:18.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:23:18.935 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:23:18.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:23:18.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:23:18.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:23:18.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:23:18.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:23:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:23:18.962 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:23:18.962 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:23:18.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:23:19.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:23:19.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:23:19.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:23:19.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:23:19.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:23:19.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:23:19.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:23:19.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:23:19.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:23:19.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:23:19.293 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:23:19.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:23:08
2026-05-29T01:23:19.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70519, datetime.datetime(2026, 5, 29, 1, 23, 8), datetime.datetime(2026, 5, 29, 1, 23, 7), 'salt', 6.65, 88.95, None, 13.59, 127.79, 1.68, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:23:19.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:23:19.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:23:19.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:07, diff=12.360396s, valid=True
2026-05-29T01:23:19.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:23:19.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:23:19.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:12, diff=7.363863s, valid=True
2026-05-29T01:23:19.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:23:19.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:23:19.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:03, diff=16.371939s, valid=True
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:23:19.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:23:19.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:12, diff=7.375608s, valid=True
2026-05-29T01:23:19.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:23:19.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:23:19.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:23:19.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943241.376417s, valid=True
2026-05-29T01:23:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:23:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:23:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:23:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:23:19.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:23:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:23:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:23:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:23:19.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:23:19.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:23:19.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:23:19.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:23:19.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:23:19.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:23:19.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:23:20.264 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:23:20.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:23:20.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:23:20.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-29T01:23:20.364 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:23:20.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:23:20.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:23:50.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:23:50.615 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:23:50.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:23:50.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:23:50.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:23:51.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:23:51.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-29T01:23:51.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:23:51.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-29T01:23:51.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:23:51.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:23:51.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:23:51.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-29T01:23:53.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-29T01:23:53.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:23:53.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:23:53.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:23:53.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:23:53.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:23:53.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:23:53.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:23:53.656 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:23:53.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:23:53.657 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:23:53.657 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:23:53.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:23:53.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:23:53.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:23:53.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:23:53.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:23:53.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:23:53.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:23:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:23:53.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:23:53.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:23:53.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:23:53.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:23:54.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:23:38
2026-05-29T01:23:54.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70520, datetime.datetime(2026, 5, 29, 1, 23, 38), datetime.datetime(2026, 5, 29, 1, 23, 38), 'salt', 6.65, 88.98, None, 11.72, 132.32, 1.68, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:23:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:23:54.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:23:54.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:38, diff=16.044895s, valid=True
2026-05-29T01:23:54.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:23:54.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:23:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:12, diff=-17.951703s, valid=True
2026-05-29T01:23:54.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:23:54.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:23:34, diff=20.056191s, valid=True
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:23:54.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:23:54.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:12, diff=-17.940232s, valid=True
2026-05-29T01:23:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:23:54.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:23:54.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:23:54.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943276.060552s, valid=True
2026-05-29T01:23:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:23:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:23:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:23:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:23:54.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:23:54.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:23:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:23:54.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:23:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:23:54.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:23:54.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:23:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:23:54.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:23:54.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:23:54.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:23:54.988 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:23:55.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:23:55.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:23:55.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-29T01:23:55.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-29T01:23:55.271 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:23:55.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:24:25.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:24:25.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:24:25.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:24:25.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:24:25.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:24:25.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:24: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-29T01:24:25.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:24:25.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-29T01:24:25.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:24:25.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:24:25.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:24:25.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-29T01:24:28.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-29T01:24:28.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:24:28.674 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:24:28.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:24:28.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:24:28.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:24:28.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:24:28.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:24:28.700 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:24:28.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:24:28.700 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:24:28.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:24:28.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:24:28.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:24:28.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:24:28.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:24:28.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:24:28.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:24:28.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:24:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:24:29.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:24:29.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:24:29.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:24:29.018 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:24:29.077 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:24:08
2026-05-29T01:24:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70521, datetime.datetime(2026, 5, 29, 1, 24, 8), datetime.datetime(2026, 5, 29, 1, 24, 8), 'salt', 6.85, 89.11, None, 11.15, 128.26, 1.66, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:24:29.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:24:29.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:24:29.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:08, diff=21.085225s, valid=True
2026-05-29T01:24:29.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:24:29.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:24:29.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:12, diff=17.08869s, valid=True
2026-05-29T01:24:29.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:24:29.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:24:29.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:04, diff=25.096596s, valid=True
2026-05-29T01:24:29.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:24:29.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:24:29.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:24:29.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:24:29.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:24:29.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:24:29.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:12, diff=17.100228s, valid=True
2026-05-29T01:24:29.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:24:29.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:24:29.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:24:29.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943311.101026s, valid=True
2026-05-29T01:24:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:24:29.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:24:29.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:24:29.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:24:29.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:24:29.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:24:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:24:29.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:24:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:24:29.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:24:29.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:24:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:24:29.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:24:29.425 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:24:29.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:24:29.975 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:24:30.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:24:30.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:24:30.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-29T01:24:30.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-29T01:24:30.270 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:24:30.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:25:00.301 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:25:00.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:25:00.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:25:00.764 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:25:00.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:25:00.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:25:00.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-29T01:25:01.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:25:01.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-29T01:25:01.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:25:01.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:25:01.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:25:01.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-29T01:25:03.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:25:03.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:25:03.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:25:03.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:25:03.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:25:03.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:25:03.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:25:03.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:25:03.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:25:03.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:25:03.409 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:25:03.410 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:25:03.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:25:03.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:25:03.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:25:03.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:25:03.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:25:03.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:25:03.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:25:03.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:25:03.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:25:03.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:25:03.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:25:03.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:25:03.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:24:38
2026-05-29T01:25:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70522, datetime.datetime(2026, 5, 29, 1, 24, 38), datetime.datetime(2026, 5, 29, 1, 24, 38), 'salt', 6.75, 89.01, None, 10.91, 121.99, 1.67, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:25:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:25:03.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:25:03.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:38, diff=25.783318s, valid=True
2026-05-29T01:25:03.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:25:03.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:25:03.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:12, diff=-8.213786s, valid=True
2026-05-29T01:25:03.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:25:03.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:25:03.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:24:34, diff=29.792864s, valid=True
2026-05-29T01:25:03.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:25:03.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:25:03.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:25:03.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:25:03.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:25:03.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:25:03.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:12, diff=-8.20407s, valid=True
2026-05-29T01:25:03.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:25:03.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:25:03.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:25:03.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943345.796594s, valid=True
2026-05-29T01:25:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:25:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:25:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:25:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:25:03.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:25:03.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:25:03.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:25:03.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:25:03.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:25:04.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:25:04.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:25:04.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:25:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:25:04.185 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:25:04.396 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:25:04.736 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:25:04.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:25:04.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:25:04.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-29T01:25:04.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-29T01:25:05.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:25:05.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:25:35.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:25:35.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:25:35.047 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:25:35.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:25:35.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:25:35.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:25:35.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-29T01:25:35.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:25:35.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:25:35.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:25:35.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:25:35.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:25:35.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-29T01:25:38.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-29T01:25:38.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:25:38.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:25:38.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:25:38.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:25:38.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:25:38.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:25:38.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:25:38.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:25:38.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:25:38.279 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:25:38.279 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:25:38.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:25:38.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:25:38.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:25:38.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:25:38.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:25:38.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:25:38.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:25:38.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:25:38.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:25:38.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:25:38.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:25:38.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:25:38.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:25:09
2026-05-29T01:25:38.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70523, datetime.datetime(2026, 5, 29, 1, 25, 9), datetime.datetime(2026, 5, 29, 1, 25, 8), 'salt', 6.72, 89.01, None, 11.4, 126.75, 1.68, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:25:38.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:25:38.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:25:38.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:08, diff=30.606293s, valid=True
2026-05-29T01:25:38.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:25:38.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:25:38.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:12, diff=26.609177s, valid=True
2026-05-29T01:25:38.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:25:38.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:25:38.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:04, diff=34.615716s, valid=True
2026-05-29T01:25:38.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:25:38.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:25:38.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:25:38.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:25:38.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:25:38.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:25:38.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:25:12, diff=26.618738s, valid=True
2026-05-29T01:25:38.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:25:38.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:25:38.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:25:38.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943380.619393s, valid=True
2026-05-29T01:25:38.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:25:38.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:25:38.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:25:38.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:25:38.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:25:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:25:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:25:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:25:38.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:25:38.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:25:39.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:25:39.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:25:39.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:25:39.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:25:39.709 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:25:40.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:25:40.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:25:40.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:25:40.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-29T01:25:40.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-29T01:25:40.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:25:40.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:26:10.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:26:10.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:26:10.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:26:10.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:26:10.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:26:11.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:26:11.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-29T01:26:11.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:26:11.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:26:11.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:26:11.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:26:11.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:26:11.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:26:13.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:26:13.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:26:13.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:26:13.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:26:13.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:26:13.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:26:13.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:26:13.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:26:13.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:26:13.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:26:13.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:26:13.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:26:13.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:26:13.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:26:13.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:26:13.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:26:13.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:26:13.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:26:13.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:26:13.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:26:13.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:26:13.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:26:13.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:26:13.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:26:13.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:26:09
2026-05-29T01:26:13.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70525, datetime.datetime(2026, 5, 29, 1, 26, 9), datetime.datetime(2026, 5, 29, 1, 26, 9), 'salt', 6.72, 89.05, None, 11.93, 124.24, 1.67, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:26:13.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:26:13.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:26:13.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:09, diff=4.990499s, valid=True
2026-05-29T01:26:13.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:26:13.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:26:13.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:12, diff=1.993848s, valid=True
2026-05-29T01:26:13.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:26:13.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:26:14.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:07, diff=7.001629s, valid=True
2026-05-29T01:26:14.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:26:14.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:26:14.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:26:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:26:14.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:26:14.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:26:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:12, diff=2.005184s, valid=True
2026-05-29T01:26:14.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:26:14.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:26:14.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:26:14.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943416.005986s, valid=True
2026-05-29T01:26:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:26:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:26:14.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:26:14.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:26:14.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:26:14.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:26:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:26:14.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:26:14.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:26:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:26:14.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:26:14.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:26:14.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:26:14.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:26:14.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:26:14.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:26:14.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:26:14.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:26:14.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-29T01:26:14.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-29T01:26:15.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:26:15.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:26:45.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:26:45.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:26:45.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:26:45.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:26:45.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:26:45.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:26:45.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-29T01:26:45.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:26:45.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-29T01:26:45.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:26:45.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:26:45.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:26:45.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-29T01:26:48.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-29T01:26:48.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:26:48.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:26:48.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:26:48.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:26:48.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:26:48.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:26:48.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:26:48.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:26:48.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:26:48.954 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:26:48.955 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:26:48.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:26:49.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:26:49.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:26:49.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:26:49.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:26:49.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:26:49.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:26:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:26:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:26:49.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:26:49.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:26:49.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:26:49.340 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:26:40
2026-05-29T01:26:49.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70526, datetime.datetime(2026, 5, 29, 1, 26, 40), datetime.datetime(2026, 5, 29, 1, 26, 39), 'salt', 6.65, 89.01, None, 11.33, 123.96, 1.67, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:26:49.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:26:49.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:26:49.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:39, diff=10.347383s, valid=True
2026-05-29T01:26:49.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:26:49.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:26:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:12, diff=-22.649236s, valid=True
2026-05-29T01:26:49.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:26:49.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:26:49.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:26:38, diff=11.358737s, valid=True
2026-05-29T01:26:49.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:26:49.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:26:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:26:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:26:49.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:26:49.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:26:49.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:12, diff=-22.637678s, valid=True
2026-05-29T01:26:49.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:26:49.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:26:49.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:26:49.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943451.363135s, valid=True
2026-05-29T01:26:49.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:26:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:26:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:26:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:26:49.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:26:49.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:26:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:26:49.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:26:49.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:26:49.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:26:49.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:26:49.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:26:49.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:26:49.685 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:26:49.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:26:50.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:26:50.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:26:50.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:26:50.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-29T01:26:50.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-29T01:26:50.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:26:50.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:27:20.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:27:20.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:27:20.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:27:20.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:27:20.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:27:20.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:27:20.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:27:21.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:27:21.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-29T01:27:21.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:27:21.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:27:21.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:27:21.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-29T01:27:23.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-29T01:27:23.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:27:23.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:27:23.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:27:23.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:27:23.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:27:23.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:27:23.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:27:23.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:27:23.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:27:23.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:27:23.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:27:23.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:27:24.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:27:24.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:27:24.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:27:24.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:27:24.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:27:24.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:27:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:27:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:27:24.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:27:24.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:27:24.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:27:24.368 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:27:10
2026-05-29T01:27:24.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70527, datetime.datetime(2026, 5, 29, 1, 27, 10), datetime.datetime(2026, 5, 29, 1, 27, 9), 'salt', 6.62, 89.08, None, 12.14, 123.37, 1.66, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:27:24.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:27:24.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:27:24.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:09, diff=15.375266s, valid=True
2026-05-29T01:27:24.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:27:24.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:27:24.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:12, diff=12.378697s, valid=True
2026-05-29T01:27:24.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:27:24.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:27:24.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:05, diff=19.386632s, valid=True
2026-05-29T01:27:24.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:27:24.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:27:24.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:27:24.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:27:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:27:24.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:27:24.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:12, diff=12.390216s, valid=True
2026-05-29T01:27:24.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:27:24.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:27:24.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:27:24.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943486.391022s, valid=True
2026-05-29T01:27:24.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:27:24.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:27:24.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:27:24.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:27:24.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:27:24.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:27:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:27:24.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:27:24.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:27:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:27:24.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:27:24.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:27:24.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:27:24.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:27:24.918 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:27:25.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:27:25.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:27:25.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:27:25.360 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:27:25.360 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:27:25.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:27:25.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:27:55.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:27:55.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:27:55.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:27:55.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:27:55.943 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:27:56.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:27:56.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-29T01:27:56.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:27:56.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-29T01:27:56.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:27:56.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:27:56.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:27:56.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-29T01:27:58.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:27:58.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:27:58.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:27:58.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:27:58.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:27:58.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:27:58.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:27:58.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:27:58.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:27:58.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:27:58.984 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:27:58.985 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:27:58.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:27:59.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:27:59.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:27:59.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:27:59.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:27:59.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:27:59.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:27:59.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:27:59.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:27:59.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:27:59.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:27:59.259 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:27:59.316 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:27:40
2026-05-29T01:27:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70528, datetime.datetime(2026, 5, 29, 1, 27, 40), datetime.datetime(2026, 5, 29, 1, 27, 40), 'salt', 6.59, 89.01, None, 12.39, 125.06, 1.68, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:27:59.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:27:59.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:27:59.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:40, diff=19.323997s, valid=True
2026-05-29T01:27:59.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:27:59.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:27:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:12, diff=-12.67282s, valid=True
2026-05-29T01:27:59.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:27:59.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:27:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:27:35, diff=24.334566s, valid=True
2026-05-29T01:27:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:27:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:27:59.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:27:59.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:27:59.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:27:59.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:27:59.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:12, diff=-12.662072s, valid=True
2026-05-29T01:27:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:27:59.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:27:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:27:59.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943521.338679s, valid=True
2026-05-29T01:27:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:27:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:27:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:27:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:27:59.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:27:59.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:27:59.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:27:59.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:27:59.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:27:59.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:27:59.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:27:59.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:27:59.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:27:59.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:27:59.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:28:00.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:28:00.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:28:00.400 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:28:00.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-29T01:28:00.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-29T01:28:00.584 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:28:00.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:28:30.589 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:28:30.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:28:30.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:28:30.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:28:30.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:28:31.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:28:31.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-29T01:28:31.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:28:31.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-29T01:28:31.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:28:31.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:28:31.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:28:31.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-29T01:28:34.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-29T01:28:34.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:28:34.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:28:34.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:28:34.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:28:34.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:28:34.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:28:34.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:28:34.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:28:34.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:28:34.284 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:28:34.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:28:34.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:28:34.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:28:34.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:28:34.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:28:34.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:28:34.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:28:34.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:28:34.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T01:28:34.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:28:34.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:28:34.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:28:34.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:28:34.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:28:10
2026-05-29T01:28:34.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70529, datetime.datetime(2026, 5, 29, 1, 28, 10), datetime.datetime(2026, 5, 29, 1, 28, 10), 'salt', 6.49, 88.95, None, 12.53, 120.72, 1.69, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:28:34.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:28:34.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:28:34.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:10, diff=24.667459s, valid=True
2026-05-29T01:28:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:28:34.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:28:34.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:12, diff=22.670878s, valid=True
2026-05-29T01:28:34.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:28:34.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:28:34.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:06, diff=28.678598s, valid=True
2026-05-29T01:28:34.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:28:34.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:28:34.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:28:34.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:28:34.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:28:34.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T01:28:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:12, diff=22.682211s, valid=True
2026-05-29T01:28:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:28:34.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:28:34.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:28:34.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943556.682999s, valid=True
2026-05-29T01:28:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:28:34.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:28:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:28:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:28:34.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:28:34.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:28:34.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:28:34.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:28:34.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:28:34.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:28:34.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:28:34.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:28:34.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:28:35.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:28:35.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:28:35.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:28:35.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:28:35.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:28:35.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-29T01:28:35.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-29T01:28:35.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:28:35.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:29:05.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:29:05.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:29:05.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:29:06.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:29:06.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:29:06.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:29:06.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-29T01:29:06.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:29:06.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-29T01:29:06.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:29:06.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:29:06.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:29:06.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-29T01:29:09.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-29T01:29:09.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:29:09.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:29:09.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:29:09.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:29:09.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:29:09.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:29:09.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:29:09.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:29:09.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:29:09.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:29:09.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:29:09.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:29:09.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:29:09.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:29:09.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:29:09.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:29:09.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:29:09.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:29:09.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T01:29:09.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:29:09.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:29:09.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:29:09.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:29:09.570 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:28:41
2026-05-29T01:29:09.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70530, datetime.datetime(2026, 5, 29, 1, 28, 41), datetime.datetime(2026, 5, 29, 1, 28, 40), 'salt', 6.45, 88.95, None, 12.49, 120.44, 1.68, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:29:09.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:29:09.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:29:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:40, diff=29.577527s, valid=True
2026-05-29T01:29:09.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:29:09.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:29:09.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:29:12, diff=-2.419102s, valid=True
2026-05-29T01:29:09.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:29:09.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:29:09.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:28:36, diff=33.588696s, valid=True
2026-05-29T01:29:09.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:29:09.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:29:09.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:29:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:29:09.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:29:09.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T01:29:09.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:29:12, diff=-2.40771s, valid=True
2026-05-29T01:29:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:29:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:29:09.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:29:09.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943591.593076s, valid=True
2026-05-29T01:29:09.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:29:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:29:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:29:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:29:09.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:29:09.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:29:09.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:29:09.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:29:09.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:29:09.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:29:09.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:29:09.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:29:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:29:09.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:29:10.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:29:10.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:29:10.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:29:10.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:29: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-29T01:29: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-29T01:29:10.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:29:10.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:29:40.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:29:40.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:29:40.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:29:41.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:29:41.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:29:41.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:29:41.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-29T01:29:41.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:29:41.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:29:41.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:29:41.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:29:41.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:29:41.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-29T01:29:43.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:29:43.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:29:43.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:29:43.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:29:43.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:29:43.654 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:29:43.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:29:43.667 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:29:43.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:29:43.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:29:43.668 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:29:43.669 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:29:43.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:29:43.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:29:43.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:29:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:29:43.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:29:43.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:29:43.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:29:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:29:43.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:29:43.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:29:43.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:29:43.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:29:44.053 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:29:41
2026-05-29T01:29:44.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70532, datetime.datetime(2026, 5, 29, 1, 29, 41), datetime.datetime(2026, 5, 29, 1, 29, 41), 'salt', 6.49, 89.15, None, 11.33, 122.25, 1.65, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:29:44.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:29:44.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:29:44.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:29:41, diff=3.060373s, valid=True
2026-05-29T01:29:44.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:29:44.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:29:44.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:12, diff=-27.936178s, valid=True
2026-05-29T01:29:44.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:29:44.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:29:44.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:29:37, diff=7.07167s, valid=True
2026-05-29T01:29:44.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:29:44.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:29:44.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:29:44.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:29:44.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:29:44.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:29:44.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:12, diff=-27.924747s, valid=True
2026-05-29T01:29:44.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:29:44.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:29:44.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:29:44.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943626.076052s, valid=True
2026-05-29T01:29:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:29:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:29:44.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:29:44.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:29:44.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:29:44.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:29:44.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:29:44.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:29:44.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:29:44.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:29:44.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:29:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:29:44.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:29:44.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:29:44.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:29:44.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:29:45.037 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:29:45.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:29:45.038 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:29:45.038 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:29:45.252 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:29:45.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:30:15.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:30:15.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:30:15.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:30:15.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:30:15.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:30:15.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:30:15.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-29T01:30:15.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:30:15.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-29T01:30:15.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:30:15.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:30:15.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:30:15.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-29T01:30:18.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-29T01:30:18.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:30:18.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:30:18.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:30:18.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:30:18.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:30:18.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:30:18.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:30:18.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:30:18.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:30:18.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:30:18.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:30:18.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:30:18.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:30:18.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:30:18.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:30:18.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:30:18.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:30:18.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:30:18.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T01:30:18.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:30:18.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:30:18.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:30:18.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:30:18.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:30:11
2026-05-29T01:30:18.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70533, datetime.datetime(2026, 5, 29, 1, 30, 11), datetime.datetime(2026, 5, 29, 1, 30, 11), 'salt', 6.39, 89.18, None, 12.46, 124.62, 1.65, 832.24, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:30:18.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:30:18.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:30:18.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:11, diff=7.844934s, valid=True
2026-05-29T01:30:18.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:30:18.845 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:30:18.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:12, diff=6.848432s, valid=True
2026-05-29T01:30:18.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:30:18.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:08, diff=10.856463s, valid=True
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:30:18.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:30:18.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T01:30:18.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:12, diff=6.860173s, valid=True
2026-05-29T01:30:18.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:30:18.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:30:18.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:30:18.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943660.860998s, valid=True
2026-05-29T01:30:18.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:30:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:30:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:30:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:30:18.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:30:18.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:30:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:30:18.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:30:18.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:30:19.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:30:19.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:30:19.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:30:19.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:30:19.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:30:19.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:30:19.798 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:30:19.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:30:19.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:30: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-29T01:30: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-29T01:30:20.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:30:20.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:30:50.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:30:50.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:30:50.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:30:50.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:30:50.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:30:50.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:30:50.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-29T01:30:50.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:30:50.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:30:50.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:30:50.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:30:50.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:30:50.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-29T01:30:53.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-29T01:30:53.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:30:53.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:30:53.189 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:30:53.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:30:53.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:30:53.213 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:30:53.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:30:53.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:30:53.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:30:53.215 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:30:53.215 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:30:53.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:30:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:30:53.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:30:53.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:30:53.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:30:53.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:30:53.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:30:53.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:30:53.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:30:53.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:30:53.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:30:53.557 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:30:53.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:30:42
2026-05-29T01:30:53.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70534, datetime.datetime(2026, 5, 29, 1, 30, 42), datetime.datetime(2026, 5, 29, 1, 30, 41), 'salt', 6.42, 89.21, None, 11.89, 122.55, 1.64, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:30:53.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:30:53.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:30:53.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:41, diff=12.661159s, valid=True
2026-05-29T01:30:53.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:30:53.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:30:53.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:12, diff=-18.335328s, valid=True
2026-05-29T01:30:53.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:30:53.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:30:53.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:30:40, diff=13.672763s, valid=True
2026-05-29T01:30:53.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:30:53.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:30:53.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:30:53.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:30:53.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:30:53.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:30:53.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:12, diff=-18.323504s, valid=True
2026-05-29T01:30:53.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:30:53.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:30:53.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:30:53.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943695.677317s, valid=True
2026-05-29T01:30:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:30:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:30:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:30:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:30:53.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:30:53.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:30:53.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:30:53.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:30:53.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:30:53.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:30:53.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:30:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:30:53.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:30:54.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:30:54.210 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:30:54.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:30:54.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:30:54.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:30:54.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-29T01:30:54.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-29T01:30:54.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:30:54.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:31:24.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:31:24.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:31:24.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:31:25.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:31:25.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:31:25.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:31:25.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:31:25.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:31:25.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:31:25.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:31:25.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:31:25.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:31:25.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-29T01:31:28.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-29T01:31:28.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:31:28.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:31:28.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:31:28.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:31:28.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:31:28.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:31:28.115 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:31:28.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:31:28.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:31:28.116 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:31:28.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:31:28.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:31:28.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:31:28.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:31:28.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:31:28.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:31:28.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:31:28.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:31:28.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T01:31:28.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:31:28.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:31:28.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:31:28.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:31:28.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:31:12
2026-05-29T01:31:28.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70535, datetime.datetime(2026, 5, 29, 1, 31, 12), datetime.datetime(2026, 5, 29, 1, 31, 11), 'salt', 6.42, 89.31, None, 12.25, 122.81, 1.62, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:31:28.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:31:28.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:31:28.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:11, diff=17.502788s, valid=True
2026-05-29T01:31:28.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:31:28.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:31:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:12, diff=16.506167s, valid=True
2026-05-29T01:31:28.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:31:28.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:11, diff=17.51402s, valid=True
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:31:28.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T01:31:28.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:12, diff=16.517592s, valid=True
2026-05-29T01:31:28.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:31:28.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:31:28.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:31:28.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943730.518396s, valid=True
2026-05-29T01:31:28.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:31:28.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:31:28.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:31:28.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:31:28.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:31:28.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:31:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:31:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:31:28.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:31:28.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:31:28.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:31:28.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:31:28.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:31:28.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:31:29.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:31:29.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:31:29.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:31:29.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:31: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-29T01:31: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-29T01:31:29.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:31:29.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:31:59.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:31:59.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:31:59.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:32:00.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:32:00.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:32:00.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:32:00.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-29T01:32:00.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:32:00.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-29T01:32:00.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:32:00.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:32:00.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:32:00.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:32:02.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:32:02.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:32:02.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:32:02.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:32:02.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:32:02.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:32:02.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:32:02.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:32:02.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:32:02.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:32:02.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:32:02.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:32:02.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:32:03.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:32:03.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:32:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:32:03.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:32:03.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:32:03.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:32:03.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:32:03.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:32:03.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:32:03.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:32:03.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:32:03.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:31:42
2026-05-29T01:32:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70536, datetime.datetime(2026, 5, 29, 1, 31, 42), datetime.datetime(2026, 5, 29, 1, 31, 41), 'salt', 6.45, 89.41, None, 10.73, 120.11, 1.6, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:32:03.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:32:03.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:32:03.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:41, diff=22.316122s, valid=True
2026-05-29T01:32:03.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:32:03.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:32:03.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:12, diff=-8.68069s, valid=True
2026-05-29T01:32:03.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:32:03.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:32:03.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:31:38, diff=25.326581s, valid=True
2026-05-29T01:32:03.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:32:03.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:32:03.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:32:03.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:32:03.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:32:03.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:32:03.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:12, diff=-8.67005s, valid=True
2026-05-29T01:32:03.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:32:03.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:32:03.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:32:03.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943765.33071s, valid=True
2026-05-29T01:32:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:32:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:32:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:32:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:32:03.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:32:03.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:32:03.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:32:03.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:32:03.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:32:03.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:32:03.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:32:03.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:32:03.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:32:03.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:32:03.862 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:32:04.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:32:04.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:32:04.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:32:04.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-29T01:32:04.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-29T01:32:04.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:32:04.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:32:34.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:32:34.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:32:34.520 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:32:35.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:32:35.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:32:35.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:32:35.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-29T01:32:35.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:32:35.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-29T01:32:35.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:32:35.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:32:35.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:32:35.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-29T01:32:38.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:32:38.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:32:38.652 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:32:38.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:32:38.653 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:32:38.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:32:38.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:32:38.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:32:38.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:32:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:32:38.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:32:38.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:32:38.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:32:38.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:32:38.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:32:38.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:32:38.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:32:38.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:32:38.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:32:39.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:32:39.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:32:39.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:32:39.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:32:39.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:32:39.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:32:12
2026-05-29T01:32:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70537, datetime.datetime(2026, 5, 29, 1, 32, 12), datetime.datetime(2026, 5, 29, 1, 32, 12), 'salt', 6.42, 89.41, None, 11.01, 124.26, 1.61, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:32:39.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:32:39.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:32:39.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:12, diff=27.085911s, valid=True
2026-05-29T01:32:39.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:32:39.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:32:39.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:12, diff=27.089482s, valid=True
2026-05-29T01:32:39.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:32:39.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:32:39.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:08, diff=31.097678s, valid=True
2026-05-29T01:32:39.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:32:39.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:32:39.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:32:39.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:32:39.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:32:39.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:32:39.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:32:12, diff=27.101465s, valid=True
2026-05-29T01:32:39.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:32:39.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:32:39.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:32:39.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943801.102302s, valid=True
2026-05-29T01:32:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:32:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:32:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:32:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:32:39.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:32:39.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:32:39.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:32:39.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:32:39.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:32:39.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:32:39.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:32:39.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:32:39.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:32:39.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:32:39.639 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:32:39.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:32:40.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:32:40.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:32:40.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-29T01:32:40.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-29T01:32:40.319 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:32:40.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:33:10.337 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:33:10.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:33:10.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:33:10.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:33:10.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:33:10.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:33:10.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-29T01:33:10.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:33:10.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:33:10.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:33:10.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:33:10.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:33:10.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-29T01:33:13.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:33:13.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:33:13.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:33:13.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:33:13.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:33:13.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:33:13.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:33:13.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:33:13.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:33:13.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:33:13.196 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:33:13.196 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:33:13.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:33:13.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from salt
2026-05-29T01:33:13.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:33:13.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1431 rows from monet
2026-05-29T01:33:13.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:33:13.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:33:13.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:33:13.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:33:13.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:33:13.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:33:13.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:33:13.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:33:13.574 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:33:13
2026-05-29T01:33:13.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70539, datetime.datetime(2026, 5, 29, 1, 33, 13), datetime.datetime(2026, 5, 29, 1, 33, 13), 'salt', 6.42, 89.51, None, 10.76, 123.32, 1.59, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:33:13.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:33:13.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 10 fields
2026-05-29T01:33:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:13, diff=0.581496s, valid=True
2026-05-29T01:33:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:33:13.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:33:13.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:12, diff=1.58493s, valid=True
2026-05-29T01:33:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:33:13.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1431 rows. Structure expected: 11 fields
2026-05-29T01:33:13.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:08, diff=5.592867s, valid=True
2026-05-29T01:33:13.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:33:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:33:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:33:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:33:13.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:33:13.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:33:13.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:12, diff=1.596475s, valid=True
2026-05-29T01:33:13.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:33:13.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:33:13.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:33:13.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943835.597283s, valid=True
2026-05-29T01:33:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:33:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:33:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:33:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:33:13.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:33:13.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:33:13.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:33:13.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:33:13.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:33:13.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:33:13.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:33:13.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:33:13.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:33:13.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:33:14.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:33:14.474 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:33:14.633 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:33:14.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:33:14.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-29T01:33:14.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-29T01:33:14.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:33:14.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:33:44.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:33:44.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:33:44.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:33:45.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:33:45.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:33:45.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:33:45.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-29T01:33:45.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:33:45.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-29T01:33:45.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:33:45.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:33:45.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:33:45.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:33:48.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-29T01:33:48.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:33:48.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:33:48.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:33:48.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:33:48.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:33:48.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:33:48.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:33:48.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:33:48.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:33:48.240 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:33:48.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:33:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:33:48.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:33:48.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:33:48.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:33:48.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:33:48.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:33:48.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:33:48.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:33:48.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:33:48.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:33:48.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:33:48.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:33:48.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:33:43
2026-05-29T01:33:48.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70540, datetime.datetime(2026, 5, 29, 1, 33, 43), datetime.datetime(2026, 5, 29, 1, 33, 43), 'salt', 6.42, 89.54, None, 10.13, 119.36, 1.59, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:33:48.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:33:48.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:33:48.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:43, diff=5.622475s, valid=True
2026-05-29T01:33:48.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:33:48.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:33:48.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:12, diff=-23.374015s, valid=True
2026-05-29T01:33:48.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:33:48.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:33:48.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:33:39, diff=9.633669s, valid=True
2026-05-29T01:33:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:33:48.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:33:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:33:48.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:33:48.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:33:48.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:33:48.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:12, diff=-23.362689s, valid=True
2026-05-29T01:33:48.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:33:48.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:33:48.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:33:48.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943870.638133s, valid=True
2026-05-29T01:33:48.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:33:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:33:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:33:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:33:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:33:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:33:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:33:48.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:33:48.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:33:48.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:33:48.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:33:48.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:33:48.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:33:48.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:33:49.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:33:49.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:33:49.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:33:49.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:33:49.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:33:49.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:33:49.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:33:49.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:34:19.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:34:19.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:34:19.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:34:20.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:34:20.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:34:20.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:34:20.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-29T01:34:20.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:34:20.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-29T01:34:20.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:34:20.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:34:20.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:34:20.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-29T01:34:22.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-29T01:34:22.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:34:22.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:34:22.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:34:22.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:34:22.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:34:22.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:34:22.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:34:22.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:34:22.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:34:22.800 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:34:22.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:34:22.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:34:22.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:34:22.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:34:23.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:34:23.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:34:23.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:34:23.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:34:23.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:34:23.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:34:23.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:34:23.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:34:23.128 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:34:23.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:34:13
2026-05-29T01:34:23.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70541, datetime.datetime(2026, 5, 29, 1, 34, 13), datetime.datetime(2026, 5, 29, 1, 34, 13), 'salt', 6.42, 89.61, None, 11.12, 114.92, 1.58, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:34:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:34:23.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:34:23.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:13, diff=10.196959s, valid=True
2026-05-29T01:34:23.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:34:23.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:34:23.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:12, diff=11.200412s, valid=True
2026-05-29T01:34:23.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:34:23.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:10, diff=13.208366s, valid=True
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:34:23.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:34:23.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:12, diff=11.211992s, valid=True
2026-05-29T01:34:23.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:34:23.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:34:23.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:34:23.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943905.212792s, valid=True
2026-05-29T01:34:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:34:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:34:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:34:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:34:23.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:34:23.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:34:23.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:34:23.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:34:23.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:34:23.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:34:23.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:34:23.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:34:23.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:34:23.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:34:23.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:34:24.159 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:34:24.259 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:34:24.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:34:24.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-29T01:34:24.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-29T01:34:24.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:34:24.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:34:54.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:34:54.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:34:54.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:34:54.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:34:54.705 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:34:54.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:34:54.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:34:54.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:34:54.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-29T01:34:54.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:34:54.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:34:54.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:34:54.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-29T01:34:57.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-29T01:34:57.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:34:57.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:34:57.624 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:34:57.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:34:57.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:34:57.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:34:57.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:34:57.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:34:57.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:34:57.647 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:34:57.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:34:57.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:34:57.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:34:57.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:34:57.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:34:57.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:34:57.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:34:57.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:34:57.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:34:57.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:34:57.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:34:57.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:34:57.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:34:58.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:34:44
2026-05-29T01:34:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70542, datetime.datetime(2026, 5, 29, 1, 34, 44), datetime.datetime(2026, 5, 29, 1, 34, 44), 'salt', 6.49, 89.74, None, 11.47, 116.89, 1.56, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:34:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:34:58.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:34:58.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:44, diff=14.068883s, valid=True
2026-05-29T01:34:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:34:58.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:34:58.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:12, diff=-13.927547s, valid=True
2026-05-29T01:34:58.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:34:58.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:34:58.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:34:41, diff=17.081668s, valid=True
2026-05-29T01:34:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:34:58.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:34:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:34:58.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:34:58.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:34:58.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:34:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:12, diff=-13.914522s, valid=True
2026-05-29T01:34:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:34:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:34:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:34:58.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943940.086308s, valid=True
2026-05-29T01:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:34:58.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:34:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:34:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:34:58.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:34:58.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:34:58.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:34:58.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:34:58.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:34:58.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:34:58.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:34:58.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:34:58.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:34:59.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:34:59.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:34:59.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-29T01:34:59.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-29T01:34:59.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:34:59.250 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:35:29.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:35:29.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:35:29.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:35:29.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:35:29.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:35:29.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:35:29.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-29T01:35:29.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:35:29.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-29T01:35:29.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:35:29.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:35:29.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:35:29.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:35:32.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-29T01:35:32.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:35:32.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:35:32.277 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:35:32.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:35:32.286 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:35:32.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:35:32.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:35:32.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:35:32.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:35:32.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:35:32.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:35:32.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:35:32.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:35:32.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:35:32.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:35:32.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:35:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:35:32.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:35:32.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:35:32.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:35:32.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:35:32.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:35:32.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:35:32.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:35:14
2026-05-29T01:35:32.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70543, datetime.datetime(2026, 5, 29, 1, 35, 14), datetime.datetime(2026, 5, 29, 1, 35, 14), 'salt', 6.55, 89.71, None, 10.41, 114.12, 1.56, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:35:32.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:35:32.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:35:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:14, diff=18.711353s, valid=True
2026-05-29T01:35:32.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:35:32.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:35:32.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:12, diff=20.714231s, valid=True
2026-05-29T01:35:32.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:35:32.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:35:32.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:13, diff=19.720752s, valid=True
2026-05-29T01:35:32.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:35:32.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:35:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:35:32.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:35:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:35:32.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:35:32.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:12, diff=20.723787s, valid=True
2026-05-29T01:35:32.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:35:32.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:35:32.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:35:32.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=943974.724435s, valid=True
2026-05-29T01:35:32.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:35:32.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:35:32.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:35:32.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:35:32.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:35:32.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:35:32.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:35:32.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:35:32.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:35:32.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:35:32.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:35:32.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:35:33.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:35:33.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:35:33.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:35:33.651 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:35:33.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:35:33.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:35:33.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-29T01:35:33.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-29T01:35:33.840 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:35:33.840 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:36:03.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:36:03.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:36:03.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:36:04.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:36:04.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:36:04.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:36:04.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-29T01:36:04.388 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:36:04.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-29T01:36:04.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:36:04.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:36:04.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:36:04.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-29T01:36:07.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-29T01:36:07.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:36:07.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:36:07.444 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:36:07.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:36:07.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:36:07.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:36:07.467 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:36:07.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:36:07.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:36:07.469 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:36:07.469 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:36:07.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:36:07.612 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:36:07.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:36:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:36:07.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:36:07.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:36:07.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:36:07.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:36:07.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:36:07.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:36:07.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:36:07.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:36:07.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:35:45
2026-05-29T01:36:07.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70544, datetime.datetime(2026, 5, 29, 1, 35, 45), datetime.datetime(2026, 5, 29, 1, 35, 44), 'salt', 6.59, 89.71, None, 11.08, 112.78, 1.57, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:36:07.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:36:07.866 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:36:07.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:44, diff=23.873282s, valid=True
2026-05-29T01:36:07.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:36:07.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:36:07.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:12, diff=-4.123288s, valid=True
2026-05-29T01:36:07.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:36:07.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:36:07.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:35:44, diff=23.884636s, valid=True
2026-05-29T01:36:07.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:36:07.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:36:07.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:36:07.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:36:07.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:36:07.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:36:07.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:12, diff=-4.111771s, valid=True
2026-05-29T01:36:07.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:36:07.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:36:07.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:36:07.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944009.889053s, valid=True
2026-05-29T01:36:07.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:36:07.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:36:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:36:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:36:07.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:36:07.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:36:07.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:36:07.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:36:07.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:36:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:36:08.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:36:08.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:36:08.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:36:08.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:36:08.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:36:08.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:36:08.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:36:08.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:36:08.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-29T01:36:08.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-29T01:36:09.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:36:09.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:36:39.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:36:39.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:36:39.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:36:39.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:36:39.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:36:39.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:36:39.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-29T01:36:39.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:36:39.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-29T01:36:39.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:36:39.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:36:39.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:36:39.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-29T01:36:42.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-29T01:36:42.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:36:42.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:36:42.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:36:42.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:36:42.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:36:42.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:36:42.349 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:36:42.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:36:42.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:36:42.350 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:36:42.350 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:36:42.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:36:42.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:36:42.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:36:42.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:36:42.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:36:42.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:36:42.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:36:42.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:36:42.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:36:42.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:36:42.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:36:42.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:36:42.747 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:36:15
2026-05-29T01:36:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70545, datetime.datetime(2026, 5, 29, 1, 36, 15), datetime.datetime(2026, 5, 29, 1, 36, 14), 'salt', 6.65, 89.74, None, 11.5, 115.55, 1.55, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:36:42.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:36:42.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:36:42.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:14, diff=28.755189s, valid=True
2026-05-29T01:36:42.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:36:42.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:36:42.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:12, diff=30.758769s, valid=True
2026-05-29T01:36:42.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:36:42.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:36:42.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:10, diff=32.766947s, valid=True
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:36:42.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:36:42.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:36:12, diff=30.770682s, valid=True
2026-05-29T01:36:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:36:42.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:36:42.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:36:42.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944044.771482s, valid=True
2026-05-29T01:36:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:36:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:36:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:36:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:36:42.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:36:42.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:36:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:36:42.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:36:42.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:36:42.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:36:43.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:36:43.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:36:43.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:36:43.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:36:43.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:36:43.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:36:43.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:36:43.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:36:43.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-29T01:36:43.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-29T01:36:43.981 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:36:43.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:37:14.011 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:37:14.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:37:14.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:37:14.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:37:14.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:37:14.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:37:14.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-29T01:37:14.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:37:14.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-29T01:37:14.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:37:14.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:37:14.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:37:14.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-29T01:37:17.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:37:17.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:37:17.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:37:17.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:37:17.280 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:37:17.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:37:17.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:37:17.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:37:17.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:37:17.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:37:17.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:37:17.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:37:17.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:37:17.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:37:17.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:37:17.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:37:17.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:37:17.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:37:17.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:37:17.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:37:17.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:37:17.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:37:17.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:37:17.579 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:37:17.636 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:37:15
2026-05-29T01:37:17.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70547, datetime.datetime(2026, 5, 29, 1, 37, 15), datetime.datetime(2026, 5, 29, 1, 37, 15), 'salt', 6.59, 89.71, None, 11.47, 114.21, 1.57, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:37:17.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:37:17.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:37:17.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:15, diff=2.643291s, valid=True
2026-05-29T01:37:17.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:37:17.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:37:17.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:12, diff=5.646359s, valid=True
2026-05-29T01:37:17.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:37:17.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:37:17.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:11, diff=6.653585s, valid=True
2026-05-29T01:37:17.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:37:17.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:37:17.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:37:17.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:37:17.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:37:17.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:37:17.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:12, diff=5.656871s, valid=True
2026-05-29T01:37:17.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:37:17.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:37:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:37:17.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944079.657585s, valid=True
2026-05-29T01:37:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:37:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:37:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:37:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:37:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:37:17.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:37:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:37:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:37:17.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:37:17.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:37:17.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:37:17.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:37:17.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:37:17.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:37:18.177 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:37:18.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:37:18.607 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:37:18.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:37:18.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-29T01:37:18.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-29T01:37:18.859 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:37:18.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:37:48.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:37:48.885 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:37:48.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:37:49.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:37:49.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:37:49.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:37:49.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:37:49.340 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:37:49.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-29T01:37:49.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:37:49.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:37:49.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:37:49.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-29T01:37:51.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:37:51.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:37:51.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:37:51.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:37:51.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:37:51.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:37:51.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:37:51.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:37:51.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:37:51.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:37:51.704 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:37:51.704 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:37:51.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:37:51.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:37:51.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:37:51.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:37:51.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:37:52.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:37:52.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:37:52.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:37:52.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:37:52.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:37:52.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:37:52.119 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:37:52.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:37:46
2026-05-29T01:37:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70548, datetime.datetime(2026, 5, 29, 1, 37, 46), datetime.datetime(2026, 5, 29, 1, 37, 45), 'salt', 6.55, 89.58, None, 11.47, 114.59, 1.58, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:37:52.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:37:52.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:37:52.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:45, diff=7.193119s, valid=True
2026-05-29T01:37:52.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:37:52.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:37:52.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:12, diff=-19.803952s, valid=True
2026-05-29T01:37:52.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:37:52.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:37:52.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:37:41, diff=11.202609s, valid=True
2026-05-29T01:37:52.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:37:52.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:37:52.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:37:52.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:37:52.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:37:52.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:37:52.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:12, diff=-19.794351s, valid=True
2026-05-29T01:37:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:37:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:37:52.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:37:52.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944114.206304s, valid=True
2026-05-29T01:37:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:37:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:37:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:37:52.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:37:52.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:37:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:37:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:37:52.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:37:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:37:52.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:37:52.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:37:52.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:37:52.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:37:52.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:37:52.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:37:53.055 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:37:53.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:37:53.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:37:53.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-29T01:37:53.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:37:53.369 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:37:53.369 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:38:23.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:38:23.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:38:23.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:38:23.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:38:23.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:38:23.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:38:23.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-29T01:38:23.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:38:23.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-29T01:38:23.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:38:23.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:38:23.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:38:23.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-29T01:38:26.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-29T01:38:26.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:38:26.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:38:26.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:38:26.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:38:26.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:38:26.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:38:26.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:38:26.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:38:26.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:38:26.292 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:38:26.293 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:38:26.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:38:26.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:38:26.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:38:26.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:38:26.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:38:26.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:38:26.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:38:26.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:38:26.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:38:26.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:38:26.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:38:26.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:38:26.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:38:16
2026-05-29T01:38:26.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70549, datetime.datetime(2026, 5, 29, 1, 38, 16), datetime.datetime(2026, 5, 29, 1, 38, 15), 'salt', 6.55, 89.64, None, 11.58, 114.5, 1.57, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:38:26.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:38:26.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:38:26.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:15, diff=11.677208s, valid=True
2026-05-29T01:38:26.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:38:26.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:38:26.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:12, diff=14.680627s, valid=True
2026-05-29T01:38:26.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:38:26.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:11, diff=15.688348s, valid=True
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:38:26.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:38:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:12, diff=14.691988s, valid=True
2026-05-29T01:38:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:38:26.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:38:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:38:26.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944148.692798s, valid=True
2026-05-29T01:38:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:38:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:38:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:38:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:38:26.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:38:26.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:38:26.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:38:26.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:38:26.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:38:26.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:38:26.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:38:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:38:26.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:38:27.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:38:27.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:38:27.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:38:27.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:38:27.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:38:27.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:38:27.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:38:27.795 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:38:27.795 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:38:57.825 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:38:57.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:38:57.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:38:58.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:38:58.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:38:58.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:38:58.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-29T01:38:58.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:38:58.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:38:58.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:38:58.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:38:58.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:38:58.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-29T01:39:01.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-29T01:39:01.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:39:01.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:39:01.097 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:39:01.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:39:01.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:39:01.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:39:01.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:39:01.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:39:01.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:39:01.123 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:39:01.123 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:39:01.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:39:01.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:39:01.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:39:01.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:39:01.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:39:01.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:39:01.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:39:01.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:39:01.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:39:01.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:39:01.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:39:01.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:39:01.503 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:38:46
2026-05-29T01:39:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70550, datetime.datetime(2026, 5, 29, 1, 38, 46), datetime.datetime(2026, 5, 29, 1, 38, 46), 'salt', 6.65, 89.78, None, 11.72, 115.48, 1.55, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:39:01.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:39:01.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:39:01.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:46, diff=15.51292s, valid=True
2026-05-29T01:39:01.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:39:01.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:39:01.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:12, diff=-10.484059s, valid=True
2026-05-29T01:39:01.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:39:01.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:39:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:38:43, diff=18.522601s, valid=True
2026-05-29T01:39:01.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:39:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:39:01.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:39:01.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:39:01.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:39:01.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:39:01.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:12, diff=-10.474267s, valid=True
2026-05-29T01:39:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:39:01.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:39:01.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:39:01.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944183.526392s, valid=True
2026-05-29T01:39:01.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:39:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:39:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:39:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:39:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:39:01.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:39:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:39:01.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:39:01.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:39:01.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:39:01.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:39:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:39:01.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:39:01.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:39:02.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:39:02.365 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:39:02.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:39:02.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:39:02.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-29T01:39: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-29T01:39:02.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:39:02.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:39:32.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:39:32.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:39:32.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:39:32.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:39:32.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:39:33.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:39:33.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-29T01:39:33.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:39:33.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-29T01:39:33.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:39:33.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:39:33.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:39:33.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-29T01:39:35.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:39:35.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:39:35.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:39:35.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:39:35.686 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:39:35.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:39:35.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:39:35.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:39:35.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:39:35.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:39:35.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:39:35.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:39:35.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:39:35.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:39:35.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:39:35.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:39:35.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:39:35.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:39:35.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:39:36.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:39:36.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:39:36.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:39:36.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:39:36.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:39:36.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:39:16
2026-05-29T01:39:36.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70551, datetime.datetime(2026, 5, 29, 1, 39, 16), datetime.datetime(2026, 5, 29, 1, 39, 16), 'salt', 6.59, 89.68, None, 11.96, 115.25, 1.57, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:39:36.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:39:36.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:39:36.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:16, diff=20.100156s, valid=True
2026-05-29T01:39:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:39:36.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:39:36.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:12, diff=24.103718s, valid=True
2026-05-29T01:39:36.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:39:36.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:39:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:14, diff=22.111825s, valid=True
2026-05-29T01:39:36.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:39:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:39:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:39:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:39:36.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:39:36.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:39:36.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:12, diff=24.115638s, valid=True
2026-05-29T01:39:36.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:39:36.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:39:36.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:39:36.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944218.116453s, valid=True
2026-05-29T01:39:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:39:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:39:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:39:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:39:36.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:39:36.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:39:36.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:39:36.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:39:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:39:36.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:39:36.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:39:36.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:39:36.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:39:36.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:39:36.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:39:36.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:39:37.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:39:37.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:39:37.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-29T01:39:37.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-29T01:39:37.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:39:37.332 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:40:07.362 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:40:07.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:40:07.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:40:07.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:40:07.831 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:40:08.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:40:08.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-29T01:40:08.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:40:08.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-29T01:40:08.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:40:08.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:40:08.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:40:08.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-29T01:40:10.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-29T01:40:10.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:40:10.622 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:40:10.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:40:10.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:40:10.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:40:10.648 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:40:10.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:40:10.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:40:10.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:40:10.650 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:40:10.650 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:40:10.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:40:10.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:40:10.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:40:10.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:40:10.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:40:10.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:40:10.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:40:10.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:40:10.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:40:10.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:40:10.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:40:10.970 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:40:11.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:39:47
2026-05-29T01:40:11.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70552, datetime.datetime(2026, 5, 29, 1, 39, 47), datetime.datetime(2026, 5, 29, 1, 39, 46), 'salt', 6.62, 89.68, None, 12.07, 115.69, 1.57, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:40:11.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:40:11.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:40:11.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:46, diff=25.039014s, valid=True
2026-05-29T01:40:11.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:40:11.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:40:11.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:12, diff=-0.958043s, valid=True
2026-05-29T01:40:11.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:40:11.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:40:11.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:39:46, diff=25.049768s, valid=True
2026-05-29T01:40:11.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:40:11.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:40:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:40:11.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:40:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:40:11.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:40:11.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:12, diff=-0.94654s, valid=True
2026-05-29T01:40:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:40:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:40:11.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:40:11.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944253.054262s, valid=True
2026-05-29T01:40:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:40:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:40:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:40:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:40:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:40:11.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:40:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:40:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:40:11.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:40:11.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:40:11.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:40:11.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:40:11.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:40:11.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:40:11.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:40:11.897 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:40:11.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:40:11.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:40:11.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-29T01:40:11.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-29T01:40:12.156 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:40:12.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:40:42.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:40:42.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:40:42.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:40:42.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:40:42.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:40:42.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:40:42.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-29T01:40:42.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:40:42.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-29T01:40:42.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:40:42.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:40:42.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:40:42.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-29T01:40:45.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-29T01:40:45.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:40:45.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:40:45.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:40:45.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:40:45.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:40:45.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:40:45.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:40:45.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:40:45.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:40:45.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:40:45.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:40:45.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:40:45.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:40:45.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:40:45.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:40:45.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:40:45.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:40:45.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:40:45.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:40:45.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:40:45.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:40:45.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:40:45.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:40:45.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:40:17
2026-05-29T01:40:45.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70553, datetime.datetime(2026, 5, 29, 1, 40, 17), datetime.datetime(2026, 5, 29, 1, 40, 17), 'salt', 6.69, 89.68, None, 11.22, 116.05, 1.57, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:40:45.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:40:45.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:40:45.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:17, diff=28.674701s, valid=True
2026-05-29T01:40:45.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:40:45.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:40:45.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:12, diff=33.678043s, valid=True
2026-05-29T01:40:45.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:40:45.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:40:45.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:12, diff=33.685833s, valid=True
2026-05-29T01:40:45.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:40:45.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:40:45.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:40:45.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:40:45.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:40:45.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:40:45.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:40:12, diff=33.689323s, valid=True
2026-05-29T01:40:45.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:40:45.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:40:45.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:40:45.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944287.690092s, valid=True
2026-05-29T01:40:45.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:40:45.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:40:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:40:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:40:45.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:40:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:40:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:40:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:40:45.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:40:45.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:40:45.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:40:45.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:40:45.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:40:46.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:40:46.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:40:46.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:40:46.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:40:46.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:40:46.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-29T01:40:46.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-29T01:40:46.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:40:46.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:41:16.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:41:16.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:41: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-29T01:41:17.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:41:17.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:41:17.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:41:17.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-29T01:41:17.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:41:17.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-29T01:41:17.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:41:17.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:41:17.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:41:17.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-29T01:41:19.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-29T01:41:19.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:41:19.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:41:19.874 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:41:19.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:41:19.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:41:19.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:41:19.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:41:19.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:41:19.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:41:19.904 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:41:19.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:41:19.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:41:19.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:41:19.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:41:20.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:41:20.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:41:20.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:41:20.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:41:20.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:41:20.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:41:20.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:41:20.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:41:20.182 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:41:20.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:41:18
2026-05-29T01:41:20.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70555, datetime.datetime(2026, 5, 29, 1, 41, 18), datetime.datetime(2026, 5, 29, 1, 41, 17), 'salt', 6.79, 89.68, None, 12.0, 117.48, 1.57, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:41:20.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:41:20.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:41:20.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:17, diff=3.247698s, valid=True
2026-05-29T01:41:20.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:41:20.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:41:20.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:12, diff=8.250818s, valid=True
2026-05-29T01:41:20.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:41:20.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:12, diff=8.257992s, valid=True
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:41:20.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:41:20.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:12, diff=8.261213s, valid=True
2026-05-29T01:41:20.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:41:20.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:41:20.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:41:20.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944322.261928s, valid=True
2026-05-29T01:41:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:41:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:41:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:41:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:41:20.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:41:20.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:41:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:41:20.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:41:20.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:41:20.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:41:20.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:41:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:41:20.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:41:20.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:41:20.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:41:21.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:41:21.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:41:21.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:41:21.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-29T01:41:21.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-29T01:41:21.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:41:21.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:41:51.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:41:51.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:41:51.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:41:52.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:41:52.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:41:52.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:41:52.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-29T01:41:52.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:41:52.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-29T01:41:52.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:41:52.323 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:41:52.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:41:52.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-29T01:41:54.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-29T01:41:54.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:41:54.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:41:54.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:41:54.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:41:54.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:41:54.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:41:54.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:41:54.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:41:54.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:41:54.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:41:54.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:41:54.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:41:54.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:41:54.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:41:55.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:41:55.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:41:55.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:41:55.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:41:55.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:41:55.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:41:55.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:41:55.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:41:55.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:41:55.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:41:48
2026-05-29T01:41:55.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70556, datetime.datetime(2026, 5, 29, 1, 41, 48), datetime.datetime(2026, 5, 29, 1, 41, 47), 'salt', 6.79, 89.58, None, 11.36, 115.83, 1.59, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:41:55.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:41:55.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:41:55.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:47, diff=8.236045s, valid=True
2026-05-29T01:41:55.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:41:55.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:41:55.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:12, diff=-16.760612s, valid=True
2026-05-29T01:41:55.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:41:55.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:41:43, diff=12.247333s, valid=True
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:41:55.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:41:55.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:12, diff=-16.749081s, valid=True
2026-05-29T01:41:55.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:41:55.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:41:55.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:41:55.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944357.251714s, valid=True
2026-05-29T01:41:55.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:41:55.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:41:55.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:41:55.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:41:55.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:41:55.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:41:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:41:55.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:41:55.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:41:55.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:41:55.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:41:55.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:41:55.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:41:55.646 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:41:55.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:41:56.167 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:41:56.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:41:56.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:41:56.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-29T01:41:56.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-29T01:41:56.506 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:41:56.506 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:42:26.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:42:26.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:42:26.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:42:26.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:42:26.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:42:26.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:42:26.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-29T01:42:26.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:42:26.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-29T01:42:26.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:42:26.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:42:26.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:42:26.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-29T01:42:29.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-29T01:42:29.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:42:29.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:42:29.301 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:42:29.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:42:29.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:42:29.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:42:29.325 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:42:29.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:42:29.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:42:29.327 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:42:29.327 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:42:29.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:42:29.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:42:29.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:42:29.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:42:29.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:42:29.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:42:29.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:42:29.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:42:29.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:42:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:42:29.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:42:29.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:42:29.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:42:18
2026-05-29T01:42:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70557, datetime.datetime(2026, 5, 29, 1, 42, 18), datetime.datetime(2026, 5, 29, 1, 42, 18), 'salt', 6.82, 89.61, None, 11.93, 116.61, 1.58, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:42:29.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:42:29.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:42:29.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:18, diff=11.71271s, valid=True
2026-05-29T01:42:29.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:42:29.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:42:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:12, diff=17.715684s, valid=True
2026-05-29T01:42:29.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:42:29.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:42:29.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:13, diff=16.722601s, valid=True
2026-05-29T01:42:29.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:42:29.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:42:29.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:42:29.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:42:29.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:42:29.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:42:29.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:12, diff=17.725793s, valid=True
2026-05-29T01:42:29.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:42:29.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:42:29.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:42:29.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944391.726446s, valid=True
2026-05-29T01:42:29.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:42:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:42:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:42:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:42:29.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:42:29.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:42:29.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:42:29.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:42:29.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:42:29.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:42:29.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:42:29.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:42:30.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:42:30.154 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:42:30.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:42:30.690 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:42:30.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:42:30.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:42:30.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-29T01:42:30.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-29T01:42:31.053 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:42:31.053 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:43:01.062 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:43:01.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:43:01.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:43:01.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:43:01.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:43:01.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:43:01.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-29T01:43:01.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:43:01.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:43:01.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:43:01.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:43:01.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:43:01.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-29T01:43:03.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-29T01:43:03.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:43:03.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:43:03.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:43:03.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:43:03.974 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:43:03.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:43:03.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:43:03.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:43:03.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:43:03.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:43:03.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:43:03.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:43:04.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:43:04.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:43:04.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:43:04.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:43:04.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:43:04.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:43:04.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:43:04.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:43:04.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:43:04.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:43:04.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:43:04.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:42:48
2026-05-29T01:43:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70558, datetime.datetime(2026, 5, 29, 1, 42, 48), datetime.datetime(2026, 5, 29, 1, 42, 48), 'salt', 6.79, 89.44, None, 11.58, 111.23, 1.61, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:43:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:43:04.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:43:04.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:48, diff=16.355112s, valid=True
2026-05-29T01:43:04.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:43:04.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:43:04.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:12, diff=-7.641549s, valid=True
2026-05-29T01:43:04.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:43:04.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:42:44, diff=20.366087s, valid=True
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:43:04.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:43:04.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:12, diff=-7.630403s, valid=True
2026-05-29T01:43:04.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:43:04.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:43:04.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:43:04.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944426.370383s, valid=True
2026-05-29T01:43:04.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:43:04.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:43:04.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:43:04.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:43:04.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:43:04.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:43:04.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:43:04.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:43:04.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:43:04.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:43:04.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:43:04.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:43:04.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:43:04.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:43:04.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:43:05.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:43:05.385 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:43:05.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:43:05.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-29T01:43:05.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-29T01:43:05.606 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:43:05.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:43:35.609 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:43:35.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:43:35.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:43:35.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:43:35.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:43:36.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:43:36.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-29T01:43:36.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:43:36.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:43:36.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:43:36.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:43:36.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:43:36.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:43:39.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-29T01:43:39.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:43:39.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:43:39.064 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:43:39.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:43:39.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:43:39.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:43:39.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:43:39.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:43:39.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:43:39.088 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:43:39.088 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:43:39.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:43:39.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:43:39.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:43:39.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:43:39.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:43:39.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:43:39.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:43:39.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:43:39.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:43:39.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:43:39.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:43:39.422 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:43:39.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:43:19
2026-05-29T01:43:39.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70559, datetime.datetime(2026, 5, 29, 1, 43, 19), datetime.datetime(2026, 5, 29, 1, 43, 18), 'salt', 6.79, 89.38, None, 10.94, 115.04, 1.62, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:43:39.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:43:39.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:43:39.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:18, diff=21.489224s, valid=True
2026-05-29T01:43:39.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:43:39.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:43:39.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:12, diff=27.4926s, valid=True
2026-05-29T01:43:39.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:43:39.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:43:39.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:15, diff=24.50055s, valid=True
2026-05-29T01:43:39.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:43:39.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:43:39.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:43:39.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:43:39.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:43:39.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:43:39.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:12, diff=27.504184s, valid=True
2026-05-29T01:43:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:43:39.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:43:39.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:43:39.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944461.504985s, valid=True
2026-05-29T01:43:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:43:39.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:43:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:43:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:43:39.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:43:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:43:39.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:43:39.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:43:39.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:43:39.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:43:39.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:43:39.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:43:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:43:39.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:43:40.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:43:40.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:43:40.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:43:40.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:43:40.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-29T01:43:40.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-29T01:43:40.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:43:40.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:44:10.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:44:10.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:44:10.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:44:10.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:44:10.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:44:11.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:44:11.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-29T01:44:11.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:44:11.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-29T01:44:11.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:44:11.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:44:11.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:44:11.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-29T01:44:13.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-29T01:44:13.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:44:13.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:44:13.657 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:44:13.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:44:13.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:44:13.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:44:13.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:44:13.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:44:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:44:13.683 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:44:13.683 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:44:13.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:44:13.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:44:13.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:44:13.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:44:13.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:44:13.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:44:13.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:44:13.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:44:13.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:44:13.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:44:13.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:44:13.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:44:14.056 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:43:49
2026-05-29T01:44:14.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70560, datetime.datetime(2026, 5, 29, 1, 43, 49), datetime.datetime(2026, 5, 29, 1, 43, 48), 'salt', 6.69, 89.24, None, 11.96, 118.23, 1.64, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:44:14.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:44:14.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:44:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:48, diff=26.063368s, valid=True
2026-05-29T01:44:14.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:44:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:44:14.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:12, diff=2.06677s, valid=True
2026-05-29T01:44:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:44:14.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:44:14.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:43:47, diff=27.074677s, valid=True
2026-05-29T01:44:14.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:44:14.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:44:14.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:44:14.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:44:14.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:44:14.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:44:14.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:12, diff=2.078287s, valid=True
2026-05-29T01:44:14.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:44:14.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:44:14.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:44:14.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944496.079081s, valid=True
2026-05-29T01:44:14.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:44:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:44:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:44:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:44:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:44:14.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:44:14.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:44:14.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:44:14.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:44:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:44:14.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:44:14.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:44:15.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:44:15.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:44:15.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:44:15.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-29T01:44:15.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-29T01:44:15.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:44:15.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:44:45.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:44:45.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:44:45.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:44:45.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:44:45.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:44:45.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:44:45.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:44:45.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:44:45.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-29T01:44:45.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:44:45.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:44:45.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:44:45.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:44:48.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-29T01:44:48.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:44:48.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:44:48.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:44:48.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:44:48.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:44:48.596 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:44:48.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:44:48.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:44:48.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:44:48.598 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:44:48.598 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:44:48.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:44:48.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T01:44:48.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:44:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T01:44:48.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:44:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:44:48.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:44:48.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:44:48.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:44:48.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:44:48.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:44:48.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:44:48.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:44:19
2026-05-29T01:44:48.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70561, datetime.datetime(2026, 5, 29, 1, 44, 19), datetime.datetime(2026, 5, 29, 1, 44, 19), 'salt', 6.82, 89.31, None, 11.89, 119.19, 1.63, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:44:48.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:44:48.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T01:44:48.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:19, diff=29.98831s, valid=True
2026-05-29T01:44:48.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:44:48.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:44:48.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:12, diff=36.991726s, valid=True
2026-05-29T01:44:48.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:44:48.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T01:44:48.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:18, diff=30.999549s, valid=True
2026-05-29T01:44:48.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:44:48.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:44:48.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:44:48.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:44:49.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:44:49.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:44:49.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:44:12, diff=37.003185s, valid=True
2026-05-29T01:44:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:44:49.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:44:49.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:44:49.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944531.004008s, valid=True
2026-05-29T01:44:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:44:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:44:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:44:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:44:49.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:44:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:44:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:44:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:44:49.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:44:49.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:44:49.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:44:49.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:44:49.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:44:49.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:44:49.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:44:49.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:44:49.966 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:44:49.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:44: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-29T01:44: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-29T01:44:50.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:44:50.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:45:20.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:45:20.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:45:20.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:45:20.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:45:20.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:45:20.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:45:20.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:45:20.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:45:20.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-29T01:45:20.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:45:20.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:45:20.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:45:20.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-29T01:45:23.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:45:23.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:45:23.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:45:23.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:45:23.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:45:23.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:45:23.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:45:23.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:45:23.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:45:23.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:45:23.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:45:23.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:45:23.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:45:23.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:45:23.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:45:23.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:45:23.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:45:24.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:45:24.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:45:24.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:45:24.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:45:24.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:45:24.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:45:24.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:45:24.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:45:20
2026-05-29T01:45:24.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70563, datetime.datetime(2026, 5, 29, 1, 45, 20), datetime.datetime(2026, 5, 29, 1, 45, 19), 'salt', 6.89, 89.18, None, 11.65, 121.94, 1.66, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:45:24.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:45:24.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:45:24.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:19, diff=5.140345s, valid=True
2026-05-29T01:45:24.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:45:24.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:45:24.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:12, diff=12.143582s, valid=True
2026-05-29T01:45:24.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:45:24.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:14, diff=10.150989s, valid=True
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:45:24.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:45:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:12, diff=12.154324s, valid=True
2026-05-29T01:45:24.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:45:24.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:45:24.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:45:24.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944566.155053s, valid=True
2026-05-29T01:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:45:24.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:45:24.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:45:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:45:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:45:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:45:24.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:45:24.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:45:24.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:45:24.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:45:24.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:45:24.475 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:45:24.669 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:45:24.995 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:45:25.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:45:25.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:45:25.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-29T01:45:25.095 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:45:25.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:45:25.181 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:45:55.211 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:45:55.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:45:55.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:45:55.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:45:55.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:45:55.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:45:55.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-29T01:45:55.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:45:55.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:45:55.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:45:55.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:45:55.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:45:55.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-29T01:45:58.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-29T01:45:58.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:45:58.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:45:58.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:45:58.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:45:58.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:45:58.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:45:58.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:45:58.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:45:58.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:45:58.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:45:58.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:45:58.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:45:58.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:45:58.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:45:58.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:45:58.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:45:58.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:45:58.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:45:58.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:45:58.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:45:58.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:45:58.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:45:58.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:45:58.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:45:50
2026-05-29T01:45:58.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70564, datetime.datetime(2026, 5, 29, 1, 45, 50), datetime.datetime(2026, 5, 29, 1, 45, 49), 'salt', 6.82, 89.15, None, 12.07, 122.67, 1.66, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:45:58.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:45:58.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:45:58.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:49, diff=9.654676s, valid=True
2026-05-29T01:45:58.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:45:58.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:45:58.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:12, diff=-13.342025s, valid=True
2026-05-29T01:45:58.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:45:58.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:45:45, diff=13.665448s, valid=True
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:45:58.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:45:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:12, diff=-13.331012s, valid=True
2026-05-29T01:45:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:45:58.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:45:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:45:58.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944600.669752s, valid=True
2026-05-29T01:45:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:45:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:45:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:45:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:45:58.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:45:58.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:45:58.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:45:58.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:45:58.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:45:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:45:58.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:45:58.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:45:58.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:45:58.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:45:59.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:45:59.511 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:45:59.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:45:59.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:45: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-29T01:45: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-29T01:45:59.827 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:45:59.827 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:46:29.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:46:29.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:46:29.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:46:30.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:46:30.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:46:30.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:46:30.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-29T01:46:30.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:46:30.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-29T01:46:30.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:46:30.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:46:30.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:46:30.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-29T01:46:33.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-29T01:46:33.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:46:33.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:46:33.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:46:33.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:46:33.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:46:33.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:46:33.197 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:46:33.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:46:33.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:46:33.198 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:46:33.198 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:46:33.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:46:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:46:33.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:46:33.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:46:33.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:46:33.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:46:33.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:46:33.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:46:33.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:46:33.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:46:33.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:46:33.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:46:33.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:46:20
2026-05-29T01:46:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70565, datetime.datetime(2026, 5, 29, 1, 46, 20), datetime.datetime(2026, 5, 29, 1, 46, 20), 'salt', 6.79, 88.98, None, 11.29, 122.01, 1.69, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:46:33.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:46:33.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:46:33.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:20, diff=13.597335s, valid=True
2026-05-29T01:46:33.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:46:33.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:46:33.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:12, diff=21.600742s, valid=True
2026-05-29T01:46:33.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:46:33.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:15, diff=18.608525s, valid=True
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:46:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:46:33.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:46:33.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:12, diff=21.612163s, valid=True
2026-05-29T01:46:33.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:46:33.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:46:33.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:46:33.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944635.612962s, valid=True
2026-05-29T01:46:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:46:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:46:33.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:46:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:46:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:46:33.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:46:33.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:46:33.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:46:33.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:46:33.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:46:33.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:46:33.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:46:33.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:46:33.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:46:34.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:46:34.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:46:34.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:46:34.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:46:34.559 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:46:34.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-29T01:46:34.711 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:46:34.711 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:47:04.737 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:47:04.737 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:47:04.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:47:05.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:47:05.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:47:05.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:47:05.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-29T01:47:05.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:47:05.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:47:05.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:47:05.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:47:05.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:47:05.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-29T01:47:07.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-29T01:47:07.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:47:07.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:47:07.841 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:47:07.841 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:47:07.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:47:07.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:47:07.864 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:47:07.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:47:07.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:47:07.865 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:47:07.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:47:07.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:47:08.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:47:08.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:47:08.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:47:08.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:47:08.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:47:08.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:47:08.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:47:08.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:47:08.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:47:08.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:47:08.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:47:08.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:46:50
2026-05-29T01:47:08.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70566, datetime.datetime(2026, 5, 29, 1, 46, 50), datetime.datetime(2026, 5, 29, 1, 46, 50), 'salt', 6.79, 88.85, None, 11.19, 124.36, 1.71, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:47:08.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:47:08.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:47:08.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:50, diff=18.259121s, valid=True
2026-05-29T01:47:08.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:47:08.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:47:08.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:12, diff=-3.737299s, valid=True
2026-05-29T01:47:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:47:08.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:47:08.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:46:45, diff=23.270895s, valid=True
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:47:08.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:47:08.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:12, diff=-3.725329s, valid=True
2026-05-29T01:47:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:47:08.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:47:08.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:47:08.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944670.275493s, valid=True
2026-05-29T01:47:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:47:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:47:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:47:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:47:08.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:47:08.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:47:08.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:47:08.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:47:08.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:47:08.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:47:08.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:47:08.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:47:08.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:47:08.621 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:47:08.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:47:09.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:47:09.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:47:09.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:47:09.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-29T01:47:09.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-29T01:47:09.856 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:47:09.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:47:39.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:47:39.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:47:39.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:47:40.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:47:40.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:47:40.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:47:40.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-29T01:47:40.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:47:40.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-29T01:47:40.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:47:40.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:47:40.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:47:40.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-29T01:47:42.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-29T01:47:42.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:47:42.740 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:47:42.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:47:42.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:47:42.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:47:42.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:47:42.765 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:47:42.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:47:42.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:47:42.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:47:42.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:47:42.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:47:42.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:47:42.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:47:43.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:47:43.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:47:43.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:47:43.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:47:43.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:47:43.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:47:43.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:47:43.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:47:43.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:47:43.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:47:21
2026-05-29T01:47:43.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70567, datetime.datetime(2026, 5, 29, 1, 47, 21), datetime.datetime(2026, 5, 29, 1, 47, 20), 'salt', 6.69, 88.78, None, 10.98, 123.09, 1.72, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:47:43.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:47:43.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:47:43.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:20, diff=23.164996s, valid=True
2026-05-29T01:47:43.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:47:43.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:47:43.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:12, diff=31.168477s, valid=True
2026-05-29T01:47:43.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:47:43.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:47:43.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:16, diff=27.176678s, valid=True
2026-05-29T01:47:43.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:47:43.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:47:43.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:47:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:47:43.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:47:43.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:47:43.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:12, diff=31.180352s, valid=True
2026-05-29T01:47:43.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:47:43.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:47:43.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:47:43.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944705.181157s, valid=True
2026-05-29T01:47:43.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:47:43.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:47:43.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:47:43.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:47:43.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:47:43.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:47:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:47:43.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:47:43.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:47:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:47:43.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:47:43.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:47:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:47:43.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:47:43.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:47:44.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:47:44.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:47:44.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:47:44.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-29T01:47:44.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-29T01:47:44.222 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:47:44.223 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:48:14.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:48:14.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:48:14.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:48:14.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:48:14.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:48:14.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:48:14.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-29T01:48:14.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:48:14.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-29T01:48:14.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:48:14.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:48:14.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:48:14.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-29T01:48:17.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-29T01:48:17.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:48:17.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:48:17.303 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:48:17.303 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:48:17.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:48:17.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:48:17.328 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:48:17.328 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:48:17.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:48:17.329 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:48:17.329 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:48:17.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:48:17.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:48:17.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:48:17.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:48:17.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:48:17.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:48:17.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:48:17.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:48:17.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:48:17.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:48:17.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:48:17.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:48:17.711 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:47:51
2026-05-29T01:48:17.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70568, datetime.datetime(2026, 5, 29, 1, 47, 51), datetime.datetime(2026, 5, 29, 1, 47, 50), 'salt', 6.75, 88.85, None, 10.73, 126.33, 1.7, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:48:17.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:48:17.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:48:17.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:50, diff=27.718458s, valid=True
2026-05-29T01:48:17.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:48:17.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:48:17.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:48:12, diff=5.721898s, valid=True
2026-05-29T01:48:17.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:48:17.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:48:17.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:47:48, diff=29.729781s, valid=True
2026-05-29T01:48:17.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:48:17.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:48:17.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:48:17.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:48:17.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:48:17.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:48:17.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:48:12, diff=5.733434s, valid=True
2026-05-29T01:48:17.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:48:17.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:48:17.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:48:17.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944739.734245s, valid=True
2026-05-29T01:48:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:48:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:48:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:48:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:48:17.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:48:17.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:48:17.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:48:17.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:48:17.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:48:17.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:48:17.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:48:17.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:48:18.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:48:18.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:48:18.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:48:18.652 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:48:18.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:48:18.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:48:18.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-29T01:48:18.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-29T01:48:18.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:48:18.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:48:48.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:48:48.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:48:48.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:48:49.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:48:49.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:48:49.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:48:49.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-29T01:48:49.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:48:49.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-29T01:48:49.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:48:49.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:48:49.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:48: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-29T01:48:51.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-29T01:48:51.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:48:52.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:48:52.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:48:52.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:48:52.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:48:52.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:48:52.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:48:52.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:48:52.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:48:52.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:48:52.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:48:52.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:48:52.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:48:52.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:48:52.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:48:52.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:48:52.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:48:52.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:48:52.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:48:52.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:48:52.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:48:52.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:48:52.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:48:52.426 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:48:51
2026-05-29T01:48:52.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70570, datetime.datetime(2026, 5, 29, 1, 48, 51), datetime.datetime(2026, 5, 29, 1, 48, 51), 'salt', 6.72, 88.62, None, 11.19, 122.48, 1.74, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:48:52.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:48:52.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:48:52.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:48:51, diff=1.434266s, valid=True
2026-05-29T01:48:52.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:48:52.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:48:52.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:12, diff=-19.562292s, valid=True
2026-05-29T01:48:52.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:48:52.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:48:50, diff=2.445426s, valid=True
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:48:52.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:48:52.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:12, diff=-19.550957s, valid=True
2026-05-29T01:48:52.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:48:52.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:48:52.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:48:52.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944774.449848s, valid=True
2026-05-29T01:48:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:48:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:48:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:48:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:48:52.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:48:52.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:48:52.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:48:52.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:48:52.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:48:52.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:48:52.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:48:52.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:48:52.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:48:52.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:48:52.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:48:53.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:48:53.389 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:48:53.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:48:53.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-29T01:48:53.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-29T01:48:53.541 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:48:53.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:49:23.563 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:49:23.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:49:23.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:49:23.880 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:49:23.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:49:24.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:49:24.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-29T01:49:24.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:49:24.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-29T01:49:24.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:49:24.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:49:24.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:49:24.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-29T01:49:26.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:49:26.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:49:26.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:49:26.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:49:26.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:49:26.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:49:26.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:49:26.631 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:49:26.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:49:26.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:49:26.632 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:49:26.632 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:49:26.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:49:26.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:49:26.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:49:26.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:49:26.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:49:26.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:49:26.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:49:26.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:49:26.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:49:26.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:49:26.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:49:26.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:49:27.023 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:49:21
2026-05-29T01:49:27.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70571, datetime.datetime(2026, 5, 29, 1, 49, 21), datetime.datetime(2026, 5, 29, 1, 49, 21), 'salt', 6.75, 88.65, None, 11.29, 122.64, 1.73, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:49:27.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:49:27.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:49:27.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:21, diff=6.030605s, valid=True
2026-05-29T01:49:27.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:49:27.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:49:27.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:12, diff=15.034004s, valid=True
2026-05-29T01:49:27.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:49:27.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:11, diff=16.041997s, valid=True
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:49:27.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:49:27.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:12, diff=15.045638s, valid=True
2026-05-29T01:49:27.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:49:27.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:49:27.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:49:27.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944809.04644s, valid=True
2026-05-29T01:49:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:49:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:49:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:49:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:49:27.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:49:27.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:49:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:49:27.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:49:27.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:49:27.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:49:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:49:27.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:49:27.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:49:27.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:49:27.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:49:27.962 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:49:28.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:49:28.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:49:28.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-29T01:49:28.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-29T01:49:28.151 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:49:28.151 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:49:58.171 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:49:58.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:49:58.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:49:58.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:49:58.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:49:58.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:49:58.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-29T01:49:58.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:49:58.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-29T01:49:58.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:49:58.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:49:58.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:49:58.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:50:01.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-29T01:50:01.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:50:01.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:50:01.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:50:01.311 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:50:01.322 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:50:01.334 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:50:01.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:50:01.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:50:01.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:50:01.336 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:50:01.336 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:50:01.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:50:01.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:50:01.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:50:01.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:50:01.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:50:01.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:50:01.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:50:01.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:50:01.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:50:01.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:50:01.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:50:01.664 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:50:01.725 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:49:52
2026-05-29T01:50:01.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70572, datetime.datetime(2026, 5, 29, 1, 49, 52), datetime.datetime(2026, 5, 29, 1, 49, 51), 'salt', 6.62, 88.52, None, 11.5, 122.43, 1.75, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:50:01.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:50:01.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:50:01.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:51, diff=10.733582s, valid=True
2026-05-29T01:50:01.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:50:01.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:50:01.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:12, diff=-10.263398s, valid=True
2026-05-29T01:50:01.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:50:01.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:49:47, diff=14.743436s, valid=True
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:50:01.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:50:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:12, diff=-10.253489s, valid=True
2026-05-29T01:50:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:50:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:50:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:50:01.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944843.747194s, valid=True
2026-05-29T01:50:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:50:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:50:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:50:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:50:01.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:50:01.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:50:01.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:50:01.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:50:01.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:50:01.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:50:01.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:50:02.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:50:02.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:50:02.104 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:50:02.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:50:02.644 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:50:02.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:50:02.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:50:02.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-29T01:50:02.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-29T01:50:02.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:50:02.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:50:32.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:50:32.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:50:32.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:50:33.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:50:33.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:50:33.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:50:33.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-29T01:50:33.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:50:33.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-29T01:50:33.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:50:33.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:50:33.380 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:50:33.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:50:36.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-29T01:50:36.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:50:36.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:50:36.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:50:36.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:50:36.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:50:36.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:50:36.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:50:36.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:50:36.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:50:36.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:50:36.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:50:36.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:50:36.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:50:36.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:50:36.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:50:36.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:50:36.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:50:36.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:50:36.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:50:36.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:50:36.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:50:36.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:50:36.485 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:50:36.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:50:22
2026-05-29T01:50:36.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70573, datetime.datetime(2026, 5, 29, 1, 50, 22), datetime.datetime(2026, 5, 29, 1, 50, 22), 'salt', 6.55, 88.45, None, 11.54, 124.9, 1.76, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:50:36.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:50:36.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:50:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:22, diff=14.563146s, valid=True
2026-05-29T01:50:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:50:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:50:36.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:12, diff=24.566657s, valid=True
2026-05-29T01:50:36.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:50:36.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:50:36.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:17, diff=19.574744s, valid=True
2026-05-29T01:50:36.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:50:36.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:50:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:50:36.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:50:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:50:36.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:50:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:12, diff=24.578494s, valid=True
2026-05-29T01:50:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:50:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:50:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:50:36.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944878.579318s, valid=True
2026-05-29T01:50:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:50:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:50:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:50:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:50:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:50:36.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:50:36.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:50:36.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:50:36.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:50:36.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:50:36.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:50:36.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:50:36.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:50:36.969 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:50:37.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:50:37.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:50:37.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:50:37.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:50:37.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-29T01:50:37.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-29T01:50:37.684 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:50:37.684 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:51:07.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:51:07.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:51:07.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:51:08.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:51:08.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:51:08.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:51:08.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-29T01:51:08.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:51:08.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-29T01:51:08.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:51:08.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:51:08.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:51:08.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-29T01:51:10.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-29T01:51:10.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:51:10.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:51:10.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:51:10.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:51:10.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:51:10.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:51:10.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:51:10.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:51:10.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:51:10.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:51:10.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:51:10.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:51:10.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:51:10.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:51:10.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:51:10.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:51:10.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:51:10.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:51:10.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:51:10.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:51:10.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:51:10.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:51:10.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:51:10.956 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:50:52
2026-05-29T01:51:10.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70574, datetime.datetime(2026, 5, 29, 1, 50, 52), datetime.datetime(2026, 5, 29, 1, 50, 51), 'salt', 6.52, 88.52, None, 12.14, 121.84, 1.75, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:51:10.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:51:10.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:51:10.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:51, diff=19.963639s, valid=True
2026-05-29T01:51:10.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:51:10.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:51:10.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:12, diff=-1.032927s, valid=True
2026-05-29T01:51:10.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:51:10.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:51:10.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:50:48, diff=22.974914s, valid=True
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:51:10.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:51:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:12, diff=-1.021433s, valid=True
2026-05-29T01:51:10.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:51:10.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:51:10.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:51:10.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944912.979358s, valid=True
2026-05-29T01:51:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:51:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:51:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:51:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:51:10.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:51:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:51:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:51:11.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:51:11.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:51:11.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:51:11.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:51:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:51:11.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:51:11.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:51:11.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:51:11.840 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:51:11.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:51:11.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:51:11.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-29T01:51:11.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-29T01:51:12.411 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:51:12.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:51:42.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:51:42.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:51:42.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:51:42.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:51:42.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:51:42.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:51:42.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-29T01:51:42.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:51:42.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-29T01:51:42.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:51:42.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:51:42.839 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:51:42.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-29T01:51:45.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:51:45.264 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:51:45.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:51:45.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:51:45.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:51:45.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:51:45.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:51:45.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:51:45.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:51:45.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:51:45.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:51:45.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:51:45.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:51:45.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:51:45.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:51:45.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:51:45.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:51:45.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:51:45.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:51:45.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:51:45.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:51:45.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:51:45.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:51:45.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:51:45.717 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:51:23
2026-05-29T01:51:45.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70575, datetime.datetime(2026, 5, 29, 1, 51, 23), datetime.datetime(2026, 5, 29, 1, 51, 22), 'salt', 6.59, 88.58, None, 11.68, 123.25, 1.75, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:51:45.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:51:45.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:51:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:22, diff=23.724455s, valid=True
2026-05-29T01:51:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:51:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:51:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:12, diff=33.72788s, valid=True
2026-05-29T01:51:45.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:51:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:51:45.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:18, diff=27.735767s, valid=True
2026-05-29T01:51:45.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:51:45.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:51:45.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:51:45.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:51:45.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:51:45.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:51:45.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:12, diff=33.73934s, valid=True
2026-05-29T01:51:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:51:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:51:45.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:51:45.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944947.740158s, valid=True
2026-05-29T01:51:45.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:51:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:51:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:51:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:51:45.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:51:45.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:51:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:51:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:51:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:51:45.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:51:46.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:51:46.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:51:46.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:51:46.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:51:46.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:51:46.662 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:51:46.763 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:51:46.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:51:46.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-29T01:51:46.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-29T01:51:46.992 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:51:46.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:52:17.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:52:17.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:52:17.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:52:17.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:52:17.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:52:17.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:52: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-29T01:52:17.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:52:17.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-29T01:52:17.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:52:17.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:52:17.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:52:17.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-29T01:52:20.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-29T01:52:20.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:52:20.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:52:20.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:52:20.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:52:20.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:52:20.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:52:20.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:52:20.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:52:20.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:52:20.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:52:20.747 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:52:20.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:52:20.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:52:20.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:52:20.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:52:20.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:52:21.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:52:21.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:52:21.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:52:21.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:52:21.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:52:21.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:52:21.066 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:52:21.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:51:53
2026-05-29T01:52:21.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70576, datetime.datetime(2026, 5, 29, 1, 51, 53), datetime.datetime(2026, 5, 29, 1, 51, 52), 'salt', 6.59, 88.48, None, 11.08, 124.17, 1.76, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:52:21.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:52:21.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:52:21.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:52, diff=29.14779s, valid=True
2026-05-29T01:52:21.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:52:21.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:52:21.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:52:12, diff=9.151212s, valid=True
2026-05-29T01:52:21.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:52:21.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:51:49, diff=32.159101s, valid=True
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:52:21.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:52:21.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:52:12, diff=9.162716s, valid=True
2026-05-29T01:52:21.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:52:21.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:52:21.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:52:21.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=944983.163498s, valid=True
2026-05-29T01:52:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:52:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:52:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:52:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:52:21.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:52:21.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:52:21.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:52:21.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:52:21.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:52:21.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:52:21.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:52:21.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:52:21.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:52:21.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:52:21.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:52:22.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:52:22.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:52:22.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:52:22.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-29T01:52:22.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-29T01:52:22.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:52:22.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:52:52.312 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:52:52.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:52:52.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:52:52.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:52:52.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:52:52.947 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:52:52.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-29T01:52:52.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:52:52.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:52:52.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:52:52.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:52:52.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:52:52.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-29T01:52:55.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-29T01:52:55.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:52:55.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:52:55.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:52:55.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:52:55.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:52:55.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:52:55.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:52:55.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:52:55.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:52:55.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:52:55.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:52:55.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:52:55.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:52:55.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:52:56.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:52:56.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:52:56.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:52:56.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:52:56.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:52:56.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:52:56.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:52:56.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:52:56.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:52:56.186 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:52:54
2026-05-29T01:52:56.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70578, datetime.datetime(2026, 5, 29, 1, 52, 54), datetime.datetime(2026, 5, 29, 1, 52, 53), 'salt', 6.59, 88.48, None, 11.19, 121.26, 1.76, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:52:56.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:52:56.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:52:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:52:53, diff=3.194591s, valid=True
2026-05-29T01:52:56.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:52:56.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:52:56.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:12, diff=-15.801877s, valid=True
2026-05-29T01:52:56.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:52:56.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:52:52, diff=4.206154s, valid=True
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:52:56.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:52:56.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:12, diff=-15.790126s, valid=True
2026-05-29T01:52:56.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:52:56.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:52:56.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:52:56.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945018.210687s, valid=True
2026-05-29T01:52:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:52:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:52:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:52:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:52:56.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:52:56.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:52:56.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:52:56.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:52:56.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:52:56.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:52:56.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:52:56.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:52:56.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:52:56.533 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:52:56.737 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:52:57.074 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:52:57.174 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:52:57.174 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:52:57.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-29T01:52:57.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-29T01:52:57.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:52:57.345 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:53:27.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:53:27.349 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:53:27.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:53:27.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:53:27.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:53:27.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:53:27.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:53:27.912 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:53:27.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-29T01:53:27.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:53:27.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:53:27.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:53:27.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-29T01:53:30.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-29T01:53:30.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:53:30.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:53:30.452 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:53:30.452 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:53:30.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:53:30.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:53:30.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:53:30.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:53:30.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:53:30.474 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:53:30.474 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:53:30.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:53:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:53:30.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:53:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:53:30.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:53:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:53:30.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:53:30.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:53:30.750 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:53:30.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:53:30.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:53:30.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:53:30.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:53:24
2026-05-29T01:53:30.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70579, datetime.datetime(2026, 5, 29, 1, 53, 24), datetime.datetime(2026, 5, 29, 1, 53, 23), 'salt', 6.72, 88.58, None, 10.59, 118.82, 1.75, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:53:30.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:53:30.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:53:30.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:23, diff=7.824336s, valid=True
2026-05-29T01:53:30.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:53:30.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:53:30.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:12, diff=18.827408s, valid=True
2026-05-29T01:53:30.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:53:30.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:24, diff=6.834107s, valid=True
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:53:30.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:53:30.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:12, diff=18.837191s, valid=True
2026-05-29T01:53:30.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:53:30.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:53:30.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:53:30.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945052.837864s, valid=True
2026-05-29T01:53:30.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:53:30.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:53:30.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:53:30.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:53:30.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:53:30.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:53:30.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:53:30.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:53:30.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:53:30.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:53:31.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:53:31.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:53:31.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:53:31.556 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:53:31.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:53:32.178 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:53:32.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:53:32.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:53:32.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-29T01:53:32.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-29T01:53:33.047 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:53:33.047 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:54:03.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:54:03.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:54:03.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:54:03.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:54:03.370 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:54:03.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:54:03.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:54:03.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:54:03.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-29T01:54:03.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:54:03.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:54:03.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:54:03.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-29T01:54:06.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-29T01:54:06.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:54:06.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:54:06.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:54:06.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:54:06.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:54:06.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:54:06.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:54:06.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:54:06.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:54:06.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:54:06.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:54:06.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:54:07.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:54:07.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:54:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:54:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:54:07.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:54:07.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:54:07.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:54:07.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:54:07.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:54:07.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:54:07.279 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:54:07.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:53:54
2026-05-29T01:54:07.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70580, datetime.datetime(2026, 5, 29, 1, 53, 54), datetime.datetime(2026, 5, 29, 1, 53, 54), 'salt', 6.79, 88.52, None, 11.75, 124.43, 1.76, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:54:07.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:54:07.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:54:07.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:54, diff=13.356904s, valid=True
2026-05-29T01:54:07.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:54:07.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:54:07.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:12, diff=-4.639573s, valid=True
2026-05-29T01:54:07.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:54:07.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:54:07.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:53:49, diff=18.368508s, valid=True
2026-05-29T01:54:07.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:54:07.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:54:07.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:54:07.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:54:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:54:07.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:54:07.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:12, diff=-4.62772s, valid=True
2026-05-29T01:54:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:54:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:54:07.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:54:07.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945089.373101s, valid=True
2026-05-29T01:54:07.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:54:07.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:54:07.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:54:07.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:54:07.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:54:07.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:54:07.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:54:07.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:54:07.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:54:07.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:54:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:54:07.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:54:07.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:54:07.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:54:07.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:54:08.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:54:08.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:54:08.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:54:08.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-29T01:54:08.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-29T01:54:08.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:54:08.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:54:38.548 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:54:38.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:54:38.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:54:39.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:54:39.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:54:39.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:54:39.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-29T01:54:39.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:54:39.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-29T01:54:39.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:54:39.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:54:39.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:54:39.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-29T01:54:42.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:54:42.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:54:42.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:54:42.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:54:42.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:54:42.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:54:42.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:54:42.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:54:42.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:54:42.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:54:42.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:54:42.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:54:42.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:54:42.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:54:42.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:54:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:54:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:54:42.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:54:42.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:54:42.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:54:42.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:54:42.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:54:42.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:54:42.575 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:54:42.643 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:54:24
2026-05-29T01:54:42.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70581, datetime.datetime(2026, 5, 29, 1, 54, 24), datetime.datetime(2026, 5, 29, 1, 54, 24), 'salt', 6.79, 88.38, None, 11.26, 126.89, 1.78, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:54:42.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:54:42.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:54:42.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:24, diff=18.650326s, valid=True
2026-05-29T01:54:42.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:54:42.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:54:42.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:12, diff=30.653829s, valid=True
2026-05-29T01:54:42.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:54:42.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:54:42.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:16, diff=26.661627s, valid=True
2026-05-29T01:54:42.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:54:42.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:54:42.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:54:42.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:54:42.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:54:42.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:54:42.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:12, diff=30.665248s, valid=True
2026-05-29T01:54:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:54:42.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:54:42.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:54:42.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945124.666055s, valid=True
2026-05-29T01:54:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:54:42.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:54:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:54:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:54:42.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:54:42.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:54:42.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:54:42.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:54:42.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:54:42.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:54:42.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:54:42.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:54:42.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:54:42.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:54:43.263 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:54:43.597 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:54:43.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:54:43.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:54:43.694 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:54:43.694 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:54:43.900 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:54:43.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:55:13.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:55:13.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:55:13.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:55:14.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:55:14.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:55:14.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:55:14.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-29T01:55:14.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:55:14.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-29T01:55:14.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:55:14.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:55:14.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:55:14.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-29T01:55:16.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T01:55:16.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:55:16.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:55:16.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:55:16.960 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:55:16.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:55:16.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:55:16.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:55:16.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:55:16.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:55:16.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:55:16.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:55:16.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:55:17.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:55:17.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:55:17.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:55:17.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:55:17.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:55:17.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:55:17.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:55:17.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:55:17.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:55:17.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:55:17.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:55:17.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:54:55
2026-05-29T01:55:17.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70582, datetime.datetime(2026, 5, 29, 1, 54, 55), datetime.datetime(2026, 5, 29, 1, 54, 54), 'salt', 6.62, 88.02, None, 11.96, 123.68, 1.84, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:55:17.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:55:17.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:55:17.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:54, diff=23.406957s, valid=True
2026-05-29T01:55:17.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:55:17.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:55:17.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:12, diff=5.410348s, valid=True
2026-05-29T01:55:17.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:55:17.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:54:50, diff=27.418261s, valid=True
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:55:17.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:55:17.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:12, diff=5.42184s, valid=True
2026-05-29T01:55:17.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:55:17.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:55:17.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:55:17.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945159.422629s, valid=True
2026-05-29T01:55:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:55:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:55:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:55:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:55:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:55:17.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:55:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:55:17.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:55:17.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:55:17.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:55:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:55:17.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:55:17.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:55:17.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:55:17.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:55:18.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:55:18.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:55:18.403 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:55:18.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-29T01:55:18.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-29T01:55:18.595 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:55:18.595 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:55:48.625 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:55:48.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:55:48.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:55:48.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:55:48.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:55:49.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:55:49.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-29T01:55:49.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:55:49.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:55:49.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:55:49.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:55:49.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:55:49.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-29T01:55: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-29T01:55:51.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:55:51.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:55:51.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:55:51.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:55:51.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:55:51.480 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:55:51.480 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:55:51.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:55:51.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:55:51.481 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:55:51.481 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:55:51.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:55:51.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:55:51.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:55:51.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:55:51.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:55:51.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:55:51.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:55:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:55:51.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:55:51.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:55:51.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:55:51.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:55:51.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:55:25
2026-05-29T01:55:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70583, datetime.datetime(2026, 5, 29, 1, 55, 25), datetime.datetime(2026, 5, 29, 1, 55, 24), 'salt', 6.72, 88.15, None, 11.33, 125.81, 1.82, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:55:51.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:55:51.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:55:51.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:24, diff=27.881646s, valid=True
2026-05-29T01:55:51.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:55:51.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:55:51.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:12, diff=39.885036s, valid=True
2026-05-29T01:55:51.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:55:51.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:55:51.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:20, diff=31.892867s, valid=True
2026-05-29T01:55:51.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:55:51.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:55:51.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:55:51.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:55:51.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:55:51.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:55:51.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:55:12, diff=39.896428s, valid=True
2026-05-29T01:55:51.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:55:51.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:55:51.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:55:51.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945193.897229s, valid=True
2026-05-29T01:55:51.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:55:51.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:55:51.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:55:51.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:55:51.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:55:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:55:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:55:51.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:55:51.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:55:52.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:55:52.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:55:52.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:55:52.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:55:52.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:55:52.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:55:52.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:55:52.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:55:52.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:55:52.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-29T01:55:52.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-29T01:55:53.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:55:53.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:56:23.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:56:23.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:56:23.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:56:23.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:56:23.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:56:23.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:56: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-29T01:56:23.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:56:23.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-29T01:56:23.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:56:23.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:56:23.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:56:23.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-29T01:56:26.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-29T01:56:26.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:56:26.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:56:26.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:56:26.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:56:26.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:56:26.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:56:26.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:56:26.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:56:26.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:56:26.470 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:56:26.470 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:56:26.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:56:26.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:56:26.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:56:26.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:56:26.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:56:26.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:56:26.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:56:26.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:56:26.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:56:26.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:56:26.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:56:26.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:56:26.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:56:25
2026-05-29T01:56:26.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70585, datetime.datetime(2026, 5, 29, 1, 56, 25), datetime.datetime(2026, 5, 29, 1, 56, 25), 'salt', 6.72, 87.98, None, 11.82, 126.94, 1.84, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:56:26.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:56:26.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:56:26.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:25, diff=1.859546s, valid=True
2026-05-29T01:56:26.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:56:26.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:56:26.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:12, diff=14.863019s, valid=True
2026-05-29T01:56:26.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:56:26.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:22, diff=4.870979s, valid=True
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:56:26.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:56:26.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:12, diff=14.874651s, valid=True
2026-05-29T01:56:26.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:56:26.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:56:26.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:56:26.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945228.875446s, valid=True
2026-05-29T01:56:26.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:56:26.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:56:26.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:56:26.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:56:26.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:56:26.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:56:26.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:56:26.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:56:26.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:56:27.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:56:27.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:56:27.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:56:27.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:56:27.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:56:27.418 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:56:27.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:56:27.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:56:27.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:56:27.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-29T01:56:27.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-29T01:56:28.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:56:28.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:56:58.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:56:58.113 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:56:58.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:56:58.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:56:58.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:56:58.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:56: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-29T01:56:58.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:56:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T01:56:58.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:56:58.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:56:58.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:56:58.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T01:57:01.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-29T01:57:01.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:57:01.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:57:01.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:57:01.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:57:01.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:57:01.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:57:01.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:57:01.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:57:01.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:57:01.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:57:01.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:57:01.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:57:01.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:57:01.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:57:02.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:57:02.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:57:02.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:57:02.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:57:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:57:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:57:02.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:57:02.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:57:02.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:57:02.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:56:56
2026-05-29T01:57:02.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70586, datetime.datetime(2026, 5, 29, 1, 56, 56), datetime.datetime(2026, 5, 29, 1, 56, 55), 'salt', 6.65, 87.82, None, 11.72, 126.35, 1.87, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:57:02.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:57:02.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:57:02.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:55, diff=7.243995s, valid=True
2026-05-29T01:57:02.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:57:02.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:57:02.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:12, diff=-9.75257s, valid=True
2026-05-29T01:57:02.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:57:02.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:56:54, diff=8.255288s, valid=True
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:57:02.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:57:02.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:12, diff=-9.741097s, valid=True
2026-05-29T01:57:02.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:57:02.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:57:02.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:57:02.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945264.25985s, valid=True
2026-05-29T01:57:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:57:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:57:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:57:02.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:57:02.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:57:02.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:57:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:57:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:57:02.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:57:02.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:57:02.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:57:02.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:57:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:57:02.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:57:02.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:57:03.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:57:03.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:57:03.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:57:03.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-29T01:57:03.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-29T01:57:03.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:57:03.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:57:33.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:57:33.592 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:57:33.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:57:33.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:57:33.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:57:34.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:57:34.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-29T01:57:34.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:57:34.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-29T01:57:34.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:57:34.181 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:57:34.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:57:34.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-29T01:57:36.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-29T01:57:36.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:57:36.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:57:36.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:57:36.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:57:36.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:57:36.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:57:36.812 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:57:36.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:57:36.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:57:36.813 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:57:36.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:57:36.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:57:36.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:57:36.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:57:37.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:57:37.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:57:37.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:57:37.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:57:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:57:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:57:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:57:37.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:57:37.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:57:37.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:57:26
2026-05-29T01:57:37.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70587, datetime.datetime(2026, 5, 29, 1, 57, 26), datetime.datetime(2026, 5, 29, 1, 57, 25), 'salt', 6.59, 87.75, None, 12.0, 126.4, 1.88, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:57:37.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:57:37.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:57:37.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:25, diff=12.201968s, valid=True
2026-05-29T01:57:37.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:57:37.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:57:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:12, diff=25.20546s, valid=True
2026-05-29T01:57:37.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:57:37.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:57:37.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:25, diff=12.21354s, valid=True
2026-05-29T01:57:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:57:37.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:57:37.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:57:37.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:57:37.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:57:37.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:57:37.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:12, diff=25.217287s, valid=True
2026-05-29T01:57:37.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:57:37.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:57:37.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:57:37.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945299.218098s, valid=True
2026-05-29T01:57:37.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:57:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:57:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:57:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:57:37.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:57:37.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:57:37.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:57:37.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:57:37.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:57:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:57:37.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:57:37.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:57:37.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:57:37.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:57:37.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:57:38.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:57:38.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:57:38.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:57:38.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-29T01:57:38.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-29T01:57:38.277 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:57:38.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:58:08.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:58:08.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:58:08.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:58:08.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:58:08.630 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:58:08.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:58:08.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:58:08.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:58:08.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-29T01:58:08.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:58:08.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:58:08.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:58:08.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-29T01:58:11.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-29T01:58:11.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:58:11.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:58:11.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:58:11.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:58:11.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:58:11.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:58:11.561 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:58:11.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:58:11.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:58:11.562 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:58:11.563 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:58:11.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:58:11.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:58:11.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:58:11.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:58:11.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:58:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:58:11.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:58:11.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:58:11.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:58:11.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:58:11.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:58:11.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:58:11.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:57:56
2026-05-29T01:58:11.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70588, datetime.datetime(2026, 5, 29, 1, 57, 56), datetime.datetime(2026, 5, 29, 1, 57, 56), 'salt', 6.59, 87.78, None, 12.07, 125.04, 1.88, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:58:11.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:58:11.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:58:11.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:56, diff=15.956359s, valid=True
2026-05-29T01:58:11.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:58:11.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:58:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:12, diff=-0.040079s, valid=True
2026-05-29T01:58:11.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:58:11.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:57:51, diff=20.968026s, valid=True
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:58:11.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:58:11.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:12, diff=-0.028169s, valid=True
2026-05-29T01:58:11.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:58:11.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:58:11.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:58:11.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945333.972662s, valid=True
2026-05-29T01:58:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:58:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:58:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:58:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:58:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:58:12.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:58:12.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:58:12.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:58:12.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:58:12.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:58:12.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:58:12.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:58:12.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:58:12.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:58:12.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:58:12.908 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:58:13.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:58:13.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:58:13.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:58:13.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:58:13.244 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:58:13.244 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:58:43.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:58:43.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:58:43.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:58:43.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:58:43.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:58:44.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:58:44.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T01:58:44.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:58:44.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-29T01:58:44.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:58:44.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:58:44.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:58:44.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-29T01:58:46.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-29T01:58:46.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:58:46.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:58:46.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:58:46.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:58:46.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:58:46.749 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:58:46.749 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:58:46.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:58:46.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:58:46.750 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:58:46.751 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:58:46.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:58:46.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:58:46.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:58:46.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:58:46.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:58:47.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:58:47.018 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:58:47.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:58:47.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:58:47.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:58:47.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:58:47.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:58:47.124 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:58:26
2026-05-29T01:58:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70589, datetime.datetime(2026, 5, 29, 1, 58, 26), datetime.datetime(2026, 5, 29, 1, 58, 26), 'salt', 6.69, 87.72, None, 11.68, 122.97, 1.89, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:58:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:58:47.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:58:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:26, diff=21.13155s, valid=True
2026-05-29T01:58:47.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:58:47.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:58:47.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:12, diff=35.134956s, valid=True
2026-05-29T01:58:47.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:58:47.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:58:47.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:22, diff=25.142842s, valid=True
2026-05-29T01:58:47.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:58:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:58:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:58:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:58:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:58:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:58:47.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:12, diff=35.146427s, valid=True
2026-05-29T01:58:47.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:58:47.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:58:47.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:58:47.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945369.147232s, valid=True
2026-05-29T01:58:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:58:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:58:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:58:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:58:47.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:58:47.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:58:47.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:58:47.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:58:47.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:58:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:58:47.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:58:47.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:58:47.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:58:47.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:58:47.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:58:48.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:58:48.116 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:58:48.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:58:48.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-29T01:58:48.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-29T01:58:48.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:58:48.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:59:18.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:59:18.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:59:18.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:59:18.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:59:18.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:59:18.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:59:18.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-29T01:59:18.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:59:18.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-29T01:59:18.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:59:18.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:59:18.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:59:18.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-29T01:59: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-29T01:59:20.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:59:20.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:59:20.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:59:20.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:59:20.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:59:20.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:59:20.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:59:20.959 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:59:20.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:59:20.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:59:20.960 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:59:20.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:59:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T01:59:21.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:59:21.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T01:59:21.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:59:21.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:59:21.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:59:21.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T01:59:21.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:59:21.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:59:21.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:59:21.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:59:21.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:58:57
2026-05-29T01:59:21.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70590, datetime.datetime(2026, 5, 29, 1, 58, 57), datetime.datetime(2026, 5, 29, 1, 58, 56), 'salt', 6.65, 87.62, None, 12.0, 122.74, 1.9, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:59:21.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:59:21.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T01:59:21.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:56, diff=25.356941s, valid=True
2026-05-29T01:59:21.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:59:21.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:59:21.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:12, diff=9.360293s, valid=True
2026-05-29T01:59:21.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:59:21.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:58:52, diff=29.368051s, valid=True
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:59:21.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T01:59:21.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:12, diff=9.371666s, valid=True
2026-05-29T01:59:21.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:59:21.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:59:21.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:59:21.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945403.372459s, valid=True
2026-05-29T01:59:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:59:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:59:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:59:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:59:21.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:59:21.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:59:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:59:21.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:59:21.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:59:21.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:59:21.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:59:21.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:59:21.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:59:21.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:59:21.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:59:22.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:59:22.343 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:59:22.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:59:22.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T01:59:22.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T01:59:22.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:59:22.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T01:59:52.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T01:59:52.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T01:59:52.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T01:59:53.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T01:59:53.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T01:59:53.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T01:59:53.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-29T01:59:53.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T01:59:53.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-29T01:59:53.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T01:59:53.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T01:59:53.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T01:59:53.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-29T01:59:56.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-29T01:59:56.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T01:59:56.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T01:59:56.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T01:59:56.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T01:59:56.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T01:59:56.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T01:59:56.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T01:59:56.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T01:59:56.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T01:59:56.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T01:59:56.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T01:59:56.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T01:59:56.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T01:59:56.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T01:59:56.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T01:59:56.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:59:56.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:59:56.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T01:59:56.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T01:59:56.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T01:59:56.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T01:59:56.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T01:59:56.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T01:59:56.466 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 01:59:27
2026-05-29T01:59:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70591, datetime.datetime(2026, 5, 29, 1, 59, 27), datetime.datetime(2026, 5, 29, 1, 59, 26), 'salt', 6.72, 87.55, None, 11.96, 125.2, 1.91, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T01:59:56.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T01:59:56.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T01:59:56.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:26, diff=30.474112s, valid=True
2026-05-29T01:59:56.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T01:59:56.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:59:56.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:12, diff=44.477592s, valid=True
2026-05-29T01:59:56.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T01:59:56.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T01:59:56.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:22, diff=34.485808s, valid=True
2026-05-29T01:59:56.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T01:59:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:59:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T01:59:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T01:59:56.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T01:59:56.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T01:59:56.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 01:59:12, diff=44.489545s, valid=True
2026-05-29T01:59:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T01:59:56.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T01:59:56.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T01:59:56.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945438.490379s, valid=True
2026-05-29T01:59:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T01:59:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T01:59:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T01:59:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T01:59:56.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T01:59:56.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T01:59:56.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T01:59:56.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T01:59:56.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T01:59:56.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T01:59:56.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T01:59:56.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T01:59:56.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T01:59:56.814 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T01:59:57.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:59:57.441 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T01:59:57.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T01:59:57.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T01:59:57.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-29T01:59:57.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-29T01:59:57.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T01:59:57.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:00:27.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:00:27.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:00:27.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:00:27.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:00:27.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:00:28.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:00: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-29T02:00:28.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:00:28.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-29T02:00:28.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:00:28.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:00:28.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:00:28.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-29T02:00:30.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-29T02:00:30.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:00:30.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:00:30.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:00:30.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:00:30.716 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:00:30.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:00:30.730 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:00:30.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:00:30.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:00:30.730 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:00:30.731 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:00:30.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:00:30.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:00:30.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:00:30.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:00:30.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:00:30.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:00:30.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:00:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:00:31.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:00:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:00:31.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:00:31.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:00:31.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:00:27
2026-05-29T02:00:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70593, datetime.datetime(2026, 5, 29, 2, 0, 27), datetime.datetime(2026, 5, 29, 2, 0, 27), 'salt', 6.52, 87.35, None, 11.82, 125.58, 1.94, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:00:31.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:00:31.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:00:31.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:27, diff=4.11249s, valid=True
2026-05-29T02:00:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:00:31.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:00:31.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:12, diff=19.115534s, valid=True
2026-05-29T02:00:31.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:00:31.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:00:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:23, diff=8.122715s, valid=True
2026-05-29T02:00:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:00:31.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:00:31.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:00:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:00:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:00:31.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:00:31.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:12, diff=19.125975s, valid=True
2026-05-29T02:00:31.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:00:31.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:00:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:00:31.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945473.126729s, valid=True
2026-05-29T02:00:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:00:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:00:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:00:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:00:31.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:00:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:00:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:00:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:00:31.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:00:31.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:00:31.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:00:31.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:00:31.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:00:31.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:00:31.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:00:32.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:00:32.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:00:32.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:00:32.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-29T02:00:32.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-29T02:00:32.339 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:00:32.340 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:01:02.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:01:02.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:01:02.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:01:02.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:01:02.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:01:02.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:01:02.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-29T02:01:02.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:01:02.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:01:02.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:01:02.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:01:02.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:01:02.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-29T02:01:05.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-29T02:01:05.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:01:05.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:01:05.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:01:05.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:01:05.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:01:05.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:01:05.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:01:05.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:01:05.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:01:05.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:01:05.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:01:05.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:01:05.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:01:05.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:01:05.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:01:05.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:01:05.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:01:05.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:01:05.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:01:05.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:01:05.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:01:05.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:01:05.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:01:05.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:00:58
2026-05-29T02:01:05.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70594, datetime.datetime(2026, 5, 29, 2, 0, 58), datetime.datetime(2026, 5, 29, 2, 0, 58), 'salt', 6.72, 87.62, None, 10.66, 125.65, 1.9, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:01:05.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:01:05.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:01:05.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:58, diff=7.584452s, valid=True
2026-05-29T02:01:05.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:01:05.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:01:05.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:12, diff=-6.412089s, valid=True
2026-05-29T02:01:05.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:01:05.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:00:55, diff=10.596142s, valid=True
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:01:05.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:01:05.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:12, diff=-6.400133s, valid=True
2026-05-29T02:01:05.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:01:05.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:01:05.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:01:05.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945507.600688s, valid=True
2026-05-29T02:01:05.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:01:05.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:01:05.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:01:05.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:01:05.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:01:05.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:01:05.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:01:05.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:01:05.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:01:05.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:01:05.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:01:05.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:01:05.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:01:05.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:01:06.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:01:06.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:01:06.635 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:01:06.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:01:06.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-29T02:01:06.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-29T02:01:06.819 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:01:06.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:01:36.829 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:01:36.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:01:36.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:01:37.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:01:37.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:01:37.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:01:37.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-29T02:01:37.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:01:37.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-29T02:01:37.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:01:37.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:01:37.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:01:37.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-29T02:01:40.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-29T02:01:40.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:01:40.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:01:40.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:01:40.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:01:40.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:01:40.922 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:01:40.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:01:40.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:01:40.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:01:40.924 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:01:40.924 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:01:40.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:01:41.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:01:41.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:01:41.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:01:41.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:01:41.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:01:41.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:01:41.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:01:41.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:01:41.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:01:41.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:01:41.249 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:01:41.308 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:01:29
2026-05-29T02:01:41.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70595, datetime.datetime(2026, 5, 29, 2, 1, 29), datetime.datetime(2026, 5, 29, 2, 1, 28), 'salt', 6.75, 87.45, None, 11.61, 124.38, 1.93, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:01:41.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:01:41.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:01:41.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:28, diff=13.314905s, valid=True
2026-05-29T02:01:41.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:01:41.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:01:41.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:12, diff=29.317786s, valid=True
2026-05-29T02:01:41.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:01:41.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:26, diff=15.324422s, valid=True
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:01:41.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:01:41.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:12, diff=29.327482s, valid=True
2026-05-29T02:01:41.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:01:41.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:01:41.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:01:41.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945543.328148s, valid=True
2026-05-29T02:01:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:01:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:01:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:01:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:01:41.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:01:41.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:01:41.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:01:41.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:01:41.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:01:41.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:01:41.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:01:41.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:01:41.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:01:41.653 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:01:41.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:01:42.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:01:42.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:01:42.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:01:42.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-29T02:01:42.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-29T02:01:42.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:01:42.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:02:12.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:02:12.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:02:12.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:02:12.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:02:12.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:02:13.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:02:13.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-29T02:02:13.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:02:13.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-29T02:02:13.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:02:13.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:02:13.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:02:13.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-29T02:02: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-29T02:02:15.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:02:15.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:02:15.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:02:15.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:02:15.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:02:15.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:02:15.610 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:02:15.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:02:15.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:02:15.612 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:02:15.612 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:02:15.619 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:02:15.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:02:15.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:02:15.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:02:15.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:02:15.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:02:15.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:02:15.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:02:15.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:02:15.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:02:15.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:02:15.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:02:15.936 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:01:59
2026-05-29T02:02:15.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70596, datetime.datetime(2026, 5, 29, 2, 1, 59), datetime.datetime(2026, 5, 29, 2, 1, 59), 'salt', 6.82, 87.45, None, 11.5, 126.26, 1.93, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:02:15.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:02:15.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:02:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:59, diff=16.943427s, valid=True
2026-05-29T02:02:15.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:02:15.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:02:15.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:12, diff=3.946677s, valid=True
2026-05-29T02:02:15.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:02:15.946 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:01:58, diff=17.954094s, valid=True
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:02:15.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:02:15.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:12, diff=3.957476s, valid=True
2026-05-29T02:02:15.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:02:15.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:02:15.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:02:15.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945577.958222s, valid=True
2026-05-29T02:02:15.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:02:15.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:02:15.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:02:15.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:02:15.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:02:16.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:02:16.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:02:16.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:02:16.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:02:16.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:02:16.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:02:16.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:02:16.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:02:16.280 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:02:16.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:02:16.896 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:02:16.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:02:16.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:02:16.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-29T02:02:16.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-29T02:02:17.189 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:02:17.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:02:47.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:02:47.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:02:47.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:02:47.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:02:47.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:02:47.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:02:47.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-29T02:02:47.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:02:47.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-29T02:02:47.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:02:47.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:02:47.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:02:47.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:02:50.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-29T02:02:50.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:02:50.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:02:50.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:02:50.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:02:50.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:02:50.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:02:50.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:02:50.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:02:50.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:02:50.232 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:02:50.232 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:02:50.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:02:50.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:02:50.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:02:50.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:02:50.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:02:50.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:02:50.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:02:50.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:02:50.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:02:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:02:50.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:02:50.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:02:50.609 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:02:29
2026-05-29T02:02:50.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70597, datetime.datetime(2026, 5, 29, 2, 2, 29), datetime.datetime(2026, 5, 29, 2, 2, 29), 'salt', 6.72, 87.22, None, 13.27, 122.97, 1.97, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:02:50.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:02:50.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:02:50.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:29, diff=21.616813s, valid=True
2026-05-29T02:02:50.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:02:50.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:02:50.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:12, diff=38.620226s, valid=True
2026-05-29T02:02:50.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:02:50.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:19, diff=31.62818s, valid=True
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:02:50.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:02:50.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:12, diff=38.631783s, valid=True
2026-05-29T02:02:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:02:50.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:02:50.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:02:50.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945612.632578s, valid=True
2026-05-29T02:02:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:02:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:02:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:02:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:02:50.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:02:50.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:02:50.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:02:50.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:02:50.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:02:50.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:02:50.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:02:50.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:02:50.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:02:50.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:02:51.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:02:51.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:02:51.606 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:02:51.606 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:02:51.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-29T02:02:51.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-29T02:02:51.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:02:51.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:03:21.821 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:03:21.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:03:21.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:03:21.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:03:21.992 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:03:22.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:03: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-29T02:03:22.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:03:22.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-29T02:03:22.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:03:22.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:03:22.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:03:22.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:03:24.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-29T02:03:24.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:03:24.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:03:24.775 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:03:24.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:03:24.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:03:24.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:03:24.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:03:24.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:03:24.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:03:24.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:03:24.800 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:03:24.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:03:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:03:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:03:25.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:03:25.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:03:25.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:03:25.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:03:25.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:03:25.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:03:25.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:03:25.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:03:25.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:03:25.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:02:59
2026-05-29T02:03:25.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70598, datetime.datetime(2026, 5, 29, 2, 2, 59), datetime.datetime(2026, 5, 29, 2, 2, 59), 'salt', 6.69, 87.15, None, 13.45, 123.23, 1.98, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:03:25.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:03:25.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:03:25.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:59, diff=26.18268s, valid=True
2026-05-29T02:03:25.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:03:25.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:03:25.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:12, diff=13.186175s, valid=True
2026-05-29T02:03:25.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:03:25.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:02:54, diff=31.194205s, valid=True
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:03:25.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:03:25.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:12, diff=13.197945s, valid=True
2026-05-29T02:03:25.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:03:25.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:03:25.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:03:25.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945647.198758s, valid=True
2026-05-29T02:03:25.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:03:25.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:03:25.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:03:25.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:03:25.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:03:25.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:03:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:03:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:03:25.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:03:25.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:03:25.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:03:25.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:03:25.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:03:25.589 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:03:25.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:03:26.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:03:26.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:03:26.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:03:26.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-29T02:03:26.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-29T02:03:26.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:03:26.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:03:56.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:03:56.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:03:56.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:03:57.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:03:57.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:03:57.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:03:57.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-29T02:03:57.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:03:57.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-29T02:03:57.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:03:57.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:03:57.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:03:57.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-29T02:03:59.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-29T02:03:59.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:03:59.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:03:59.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:03:59.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:03:59.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:03:59.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:03:59.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:03:59.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:03:59.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:03:59.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:03:59.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:03:59.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:03:59.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:03:59.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:03:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:03:59.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:03:59.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:03:59.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:03:59.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:03:59.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:03:59.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:03:59.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:03:59.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:03:59.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:03:30
2026-05-29T02:03:59.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70599, datetime.datetime(2026, 5, 29, 2, 3, 30), datetime.datetime(2026, 5, 29, 2, 3, 29), 'salt', 6.72, 87.12, None, 13.66, 123.37, 1.98, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:03:59.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:03:59.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:03:59.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:29, diff=30.992271s, valid=True
2026-05-29T02:03:59.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:03:59.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:03:59.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:12, diff=47.996008s, valid=True
2026-05-29T02:03:59.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:03:59.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:04:00.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:25, diff=35.002927s, valid=True
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:04:00.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:04:00.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:03:12, diff=48.006024s, valid=True
2026-05-29T02:04:00.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:04:00.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:04:00.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:04:00.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945682.006701s, valid=True
2026-05-29T02:04:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:04:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:04:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:04:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:04:00.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:04:00.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:04:00.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:04:00.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:04:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:04:00.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:04:00.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:04:00.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:04:00.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:04:00.335 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:04:00.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:04:00.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:04:00.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:04:00.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:04:00.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-29T02:04:00.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-29T02:04:01.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:04:01.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:04:31.260 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:04:31.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:04:31.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:04:31.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:04:31.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:04:31.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:04:31.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:04:31.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:04:31.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-29T02:04:31.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:04:31.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:04:31.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:04:31.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-29T02:04:35.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-29T02:04:35.480 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:04:35.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:04:35.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:04:35.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:04:35.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:04:35.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:04:35.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:04:35.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:04:35.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:04:35.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:04:35.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:04:35.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:04:35.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:04:35.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:04:35.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:04:35.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:04:35.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:04:35.784 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:04:35.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:04:35.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:04:35.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:04:35.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:04:35.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:04:35.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:04:30
2026-05-29T02:04:35.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70601, datetime.datetime(2026, 5, 29, 2, 4, 30), datetime.datetime(2026, 5, 29, 2, 4, 30), 'salt', 6.69, 86.99, None, 13.23, 119.94, 2.01, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:04:35.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:04:35.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:04:35.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:04:30, diff=5.898753s, valid=True
2026-05-29T02:04:35.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:04:35.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:04:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:04:12, diff=23.902165s, valid=True
2026-05-29T02:04:35.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:04:35.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:04:35.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:04:25, diff=10.909953s, valid=True
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:04:35.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:04:35.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:04:12, diff=23.913616s, valid=True
2026-05-29T02:04:35.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:04:35.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:04:35.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:04:35.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945717.914409s, valid=True
2026-05-29T02:04:35.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:04:35.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:04:35.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:04:35.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:04:35.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:04:35.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:04:35.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:04:35.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:04:36.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:04:36.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:04:36.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:04:36.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:04:36.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:04:36.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:04:36.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:04:36.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:04:36.943 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:04:36.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:04:36.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-29T02:04:36.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-29T02:04:37.134 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:04:37.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:05:07.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:05:07.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:05:07.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:05:07.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:05:07.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:05:07.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:05:07.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:05:07.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:05:07.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-29T02:05:07.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:05:07.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:05:07.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:05:07.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-29T02:05:10.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-29T02:05:10.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:05:10.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:05:10.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:05:10.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:05:10.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:05:10.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:05:10.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:05:10.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:05:10.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:05:10.636 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:05:10.636 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:05:10.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:05:10.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:05:10.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:05:10.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:05:10.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:05:10.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:05:10.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:05:10.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:05:10.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:05:10.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:05:10.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:05:10.965 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:05:11.028 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:05:00
2026-05-29T02:05:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70602, datetime.datetime(2026, 5, 29, 2, 5), datetime.datetime(2026, 5, 29, 2, 5), 'salt', 6.62, 87.09, None, 11.93, 124.59, 1.99, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:05:11.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:05:11.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:05:11.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:00, diff=11.035859s, valid=True
2026-05-29T02:05:11.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:05:11.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:05:11.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:12, diff=-0.960783s, valid=True
2026-05-29T02:05:11.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:05:11.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:04:57, diff=14.047083s, valid=True
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:05:11.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:05:11.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:12, diff=-0.949357s, valid=True
2026-05-29T02:05:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:05:11.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:05:11.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:05:11.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945753.051435s, valid=True
2026-05-29T02:05:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:05:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:05:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:05:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:05:11.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:05:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:05:11.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:05:11.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:05:11.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:05:11.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:05:11.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:05:11.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:05:11.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:05:11.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:05:11.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:05:11.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:05:12.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:05:12.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:05:12.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-29T02:05:12.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-29T02:05:12.199 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:05:12.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:05:42.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:05:42.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:05:42.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:05:42.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:05:42.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:05:42.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:05:42.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-29T02:05:42.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:05:42.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-29T02:05:42.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:05:42.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:05:42.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:05:42.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-29T02:05:45.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-29T02:05:45.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:05:45.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:05:45.263 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:05:45.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:05:45.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:05:45.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:05:45.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:05:45.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:05:45.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:05:45.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:05:45.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:05:45.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:05:45.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:05:45.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:05:45.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:05:45.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:05:45.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:05:45.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:05:45.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:05:45.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:05:45.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:05:45.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:05:45.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:05:45.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:05:31
2026-05-29T02:05:45.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70603, datetime.datetime(2026, 5, 29, 2, 5, 31), datetime.datetime(2026, 5, 29, 2, 5, 30), 'salt', 6.72, 87.05, None, 12.0, 126.64, 2.0, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:05:45.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:05:45.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:05:45.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:30, diff=15.659188s, valid=True
2026-05-29T02:05:45.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:05:45.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:05:45.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:12, diff=33.66252s, valid=True
2026-05-29T02:05:45.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:05:45.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:28, diff=17.670216s, valid=True
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:05:45.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:05:45.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:05:12, diff=33.673708s, valid=True
2026-05-29T02:05:45.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:05:45.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:05:45.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:05:45.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945787.674463s, valid=True
2026-05-29T02:05:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:05:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:05:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:05:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:05:45.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:05:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:05:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:05:45.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:05:45.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:05:45.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:05:45.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:05:45.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:05:45.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:05:45.995 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:05:46.198 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:05:46.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:05:46.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:05:46.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:05:46.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-29T02:05:46.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-29T02:05:46.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:05:46.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:06:16.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:06:16.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:06:16.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:06:17.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:06:17.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:06:17.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:06:17.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-29T02:06:17.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:06:17.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-29T02:06:17.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:06:17.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:06:17.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:06:17.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-29T02:06:20.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-29T02:06:20.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:06:20.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:06:20.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:06:20.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:06:20.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:06:20.313 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:06:20.313 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:06:20.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:06:20.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:06:20.314 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:06:20.314 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:06:20.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:06:20.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:06:20.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:06:20.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:06:20.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:06:20.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:06:20.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:06:20.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:06:20.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:06:20.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:06:20.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:06:20.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:06:20.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:06:01
2026-05-29T02:06:20.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70604, datetime.datetime(2026, 5, 29, 2, 6, 1), datetime.datetime(2026, 5, 29, 2, 6, 1), 'salt', 6.75, 86.99, None, 11.4, 123.51, 2.0, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:06:20.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:06:20.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:06:20.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:01, diff=19.714506s, valid=True
2026-05-29T02:06:20.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:06:20.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:06:20.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:12, diff=8.717935s, valid=True
2026-05-29T02:06:20.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:06:20.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:06:20.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:00, diff=20.725647s, valid=True
2026-05-29T02:06:20.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:06:20.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:06:20.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:06:20.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:06:20.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:06:20.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:06:20.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:12, diff=8.729222s, valid=True
2026-05-29T02:06:20.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:06:20.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:06:20.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:06:20.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945822.730005s, valid=True
2026-05-29T02:06:20.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:06:20.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:06:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:06:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:06:20.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:06:20.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:06:20.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:06:20.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:06:20.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:06:20.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:06:20.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:06:20.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:06:21.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:06:21.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:06:21.260 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:06:21.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:06:21.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:06:21.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:06:21.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-29T02:06:21.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-29T02:06:21.936 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:06:21.937 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:06:51.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:06:51.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:06:51.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:06:52.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:06:52.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:06:52.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:06:52.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-29T02:06:52.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:06:52.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:06:52.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:06:52.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:06:52.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:06:52.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-29T02:06:55.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-29T02:06:55.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:06:55.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:06:55.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:06:55.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:06:55.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:06:55.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:06:55.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:06:55.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:06:55.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:06:55.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:06:55.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:06:55.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:06:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:06:55.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:06:55.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:06:55.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:06:55.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:06:55.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:06:55.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:06:55.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:06:55.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:06:55.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:06:55.920 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:06:55.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:06:31
2026-05-29T02:06:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70605, datetime.datetime(2026, 5, 29, 2, 6, 31), datetime.datetime(2026, 5, 29, 2, 6, 31), 'salt', 6.69, 86.82, None, 15.21, 123.72, 2.04, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:06:55.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:06:55.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:06:55.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:31, diff=24.987336s, valid=True
2026-05-29T02:06:55.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:06:55.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:06:55.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:12, diff=43.991021s, valid=True
2026-05-29T02:06:55.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:06:55.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:31, diff=24.999241s, valid=True
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:06:55.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:06:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:12, diff=44.002719s, valid=True
2026-05-29T02:06:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:06:56.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:06:56.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:06:56.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945858.00346s, valid=True
2026-05-29T02:06:56.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:06:56.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:06:56.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:06:56.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:06:56.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:06:56.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:06:56.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:06:56.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:06:56.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:06:56.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:06:56.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:06:56.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:06:56.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:06:56.350 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:06:56.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:06:56.924 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:06:57.024 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:06:57.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:06:57.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-29T02:06:57.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-29T02:06:57.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:06:57.257 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:07:27.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:07:27.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:07:27.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:07:27.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:07:27.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:07:27.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:07:27.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-29T02:07:27.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:07:27.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-29T02:07:27.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:07:27.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:07:27.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:07:27.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-29T02:07:30.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-29T02:07:30.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:07:30.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:07:30.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:07:30.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:07:30.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:07:30.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:07:30.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:07:30.254 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:07:30.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:07:30.254 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:07:30.254 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:07:30.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:07:30.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:07:30.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:07:30.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:07:30.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:07:30.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:07:30.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:07:30.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:07:30.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:07:30.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:07:30.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:07:30.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:07:30.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:07:01
2026-05-29T02:07:30.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70606, datetime.datetime(2026, 5, 29, 2, 7, 1), datetime.datetime(2026, 5, 29, 2, 7, 1), 'salt', 6.69, 86.99, None, 15.17, 122.88, 2.01, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:07:30.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:07:30.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:07:30.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:01, diff=29.609332s, valid=True
2026-05-29T02:07:30.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:07:30.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:07:30.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=18.612626s, valid=True
2026-05-29T02:07:30.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:07:30.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:06:57, diff=33.62024s, valid=True
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:07:30.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:07:30.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=18.623783s, valid=True
2026-05-29T02:07:30.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:07:30.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:07:30.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:07:30.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945892.624558s, valid=True
2026-05-29T02:07:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:07:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:07:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:07:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:07:30.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:07:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:07:30.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:07:30.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:07:30.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:07:30.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:07:30.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:07:30.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:07:30.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:07:30.959 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:07:31.161 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:07:31.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:07:31.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:07:31.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:07:31.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-29T02:07:31.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-29T02:07:31.929 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:07:31.929 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:08:01.956 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:08:01.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:08:01.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:08:02.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:08:02.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:08:02.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:08:02.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-29T02:08:02.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:08:02.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:08:02.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:08:02.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:08:02.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:08:02.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-29T02:08:04.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-29T02:08:04.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:08:04.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:08:04.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:08:04.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:08:04.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:08:04.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:08:04.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:08:04.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:08:04.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:08:04.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:08:04.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:08:04.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:08:05.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:08:05.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:08:05.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:08:05.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:08:05.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:08:05.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:08:05.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:08:05.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:08:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:08:05.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:08:05.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:08:05.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:08:02
2026-05-29T02:08:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70608, datetime.datetime(2026, 5, 29, 2, 8, 2), datetime.datetime(2026, 5, 29, 2, 8, 1), 'salt', 6.98, 87.22, None, 11.72, 126.75, 1.97, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:08:05.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:08:05.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:08:05.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:08:01, diff=4.340202s, valid=True
2026-05-29T02:08:05.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:08:05.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:08:05.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=53.343599s, valid=True
2026-05-29T02:08:05.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:08:05.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:57, diff=8.351533s, valid=True
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:08:05.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:08:05.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:08:05.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=53.355227s, valid=True
2026-05-29T02:08:05.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:08:05.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:08:05.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:08:05.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945927.356018s, valid=True
2026-05-29T02:08:05.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:08:05.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:08:05.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:08:05.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:08:05.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:08:05.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:08:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:08:05.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:08:05.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:08:05.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:08:05.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:08:05.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:08:05.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:08:05.677 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:08:05.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:08:06.216 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:08:06.318 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:08:06.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:08:06.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-29T02:08:06.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-29T02:08:06.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:08:06.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:08:36.540 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:08:36.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:08:36.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:08:36.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:08:36.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:08:37.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:08:37.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-29T02:08:37.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:08:37.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-29T02:08:37.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:08:37.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:08:37.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:08:37.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-29T02:08:39.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-29T02:08:39.536 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:08:39.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:08:39.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:08:39.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:08:39.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:08:39.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:08:39.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:08:39.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:08:39.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:08:39.560 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:08:39.560 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:08:39.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:08:39.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:08:39.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:08:39.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:08:39.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:08:39.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:08:39.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:08:39.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:08:39.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:08:39.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:08:39.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:08:39.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:08:39.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:08:32
2026-05-29T02:08:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70609, datetime.datetime(2026, 5, 29, 2, 8, 32), datetime.datetime(2026, 5, 29, 2, 8, 32), 'salt', 7.02, 86.85, None, 13.3, 123.21, 2.04, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:08:39.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:08:39.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:08:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:08:32, diff=7.88556s, valid=True
2026-05-29T02:08:39.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:08:39.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:08:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=87.888757s, valid=True
2026-05-29T02:08:39.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:08:39.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:08:27, diff=12.89549s, valid=True
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:08:39.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:08:39.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=87.898572s, valid=True
2026-05-29T02:08:39.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:08:39.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:08:39.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:08:39.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945961.899264s, valid=True
2026-05-29T02:08:39.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:08:39.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:08:39.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:08:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:08:39.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:08:39.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:08:39.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:08:39.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:08:39.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:08:40.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:08:40.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:08:40.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:08:40.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:08:40.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:08:40.505 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:08:40.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:08:40.939 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:08:40.939 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:08:40.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-29T02:08:40.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-29T02:08:41.088 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:08:41.089 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:09:11.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:09:11.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:09:11.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:09:11.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:09:11.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:09:11.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:09:11.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-29T02:09:11.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:09:11.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-29T02:09:11.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:09:11.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:09:11.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:09:11.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-29T02:09:14.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-29T02:09:14.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:09:14.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:09:14.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:09:14.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:09:14.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:09:14.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:09:14.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:09:14.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:09:14.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:09:14.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:09:14.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:09:14.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:09:14.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:09:14.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:09:14.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:09:14.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:09:14.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:09:14.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:09:14.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:09:14.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:09:14.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:09:14.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:09:14.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:09:14.667 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:09:02
2026-05-29T02:09:14.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70610, datetime.datetime(2026, 5, 29, 2, 9, 2), datetime.datetime(2026, 5, 29, 2, 9, 2), 'salt', 6.95, 86.62, None, 11.61, 130.53, 2.07, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:09:14.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:09:14.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:09:14.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:09:02, diff=12.674798s, valid=True
2026-05-29T02:09:14.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:09:14.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:09:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=122.678006s, valid=True
2026-05-29T02:09:14.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:09:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:08:58, diff=16.685417s, valid=True
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:09:14.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:09:14.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=122.688825s, valid=True
2026-05-29T02:09:14.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:09:14.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:09:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:09:14.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=945996.689566s, valid=True
2026-05-29T02:09:14.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:09:14.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:09:14.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:09:14.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:09:14.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:09:14.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:09:14.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:09:14.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:09:14.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:09:14.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:09:14.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:09:14.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:09:14.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:09:15.013 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:09:15.218 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:09:15.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:09:15.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:09:15.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:09:15.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-29T02:09:15.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-29T02:09:15.848 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:09:15.848 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:09:45.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:09:45.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:09:45.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:09:46.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:09:46.142 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:09:46.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:09:46.339 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:09:46.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:09:46.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-29T02:09:46.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:09:46.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:09:46.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:09:46.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-29T02:09:48.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-29T02:09:48.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:09:48.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:09:48.807 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:09:48.807 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:09:48.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:09:48.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:09:48.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:09:48.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:09:48.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:09:48.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:09:48.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:09:48.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:09:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:09:48.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:09:49.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:09:49.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:09:49.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:09:49.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:09:49.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:09:49.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:09:49.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:09:49.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:09:49.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:09:49.209 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:09:33
2026-05-29T02:09:49.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70611, datetime.datetime(2026, 5, 29, 2, 9, 33), datetime.datetime(2026, 5, 29, 2, 9, 32), 'salt', 7.05, 86.62, None, 11.89, 130.72, 2.07, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:09:49.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:09:49.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:09:49.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:09:32, diff=17.216633s, valid=True
2026-05-29T02:09:49.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:09:49.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:09:49.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=157.220589s, valid=True
2026-05-29T02:09:49.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:09:49.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:09:29, diff=20.228415s, valid=True
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:09:49.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:09:49.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=157.232041s, valid=True
2026-05-29T02:09:49.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:09:49.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:09:49.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:09:49.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946031.232842s, valid=True
2026-05-29T02:09:49.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:09:49.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:09:49.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:09:49.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:09:49.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:09:49.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:09:49.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:09:49.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:09:49.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:09:49.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:09:49.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:09:49.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:09:49.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:09:49.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:09:49.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:09:50.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:09:50.290 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:09:50.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:09:50.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-29T02:09:50.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-29T02:09:50.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:09:50.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:10:20.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:10:20.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:10:20.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:10:20.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:10:20.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:10:21.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:10:21.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-29T02:10:21.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:10:21.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:10:21.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:10:21.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:10:21.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:10:21.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:10:23.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-29T02:10:23.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:10:23.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:10:23.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:10:23.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:10:23.587 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:10:23.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:10:23.601 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:10:23.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:10:23.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:10:23.602 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:10:23.602 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:10:23.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:10:23.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:10:23.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:10:23.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:10:23.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:10:23.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:10:23.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:10:23.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:10:23.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:10:23.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:10:23.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:10:23.922 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:10:23.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:10:03
2026-05-29T02:10:23.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70612, datetime.datetime(2026, 5, 29, 2, 10, 3), datetime.datetime(2026, 5, 29, 2, 10, 3), 'salt', 6.95, 86.46, None, 12.85, 120.18, 2.1, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:10:23.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:10:23.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:10:23.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:10:03, diff=20.987959s, valid=True
2026-05-29T02:10:23.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:10:23.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:10:23.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=191.991432s, valid=True
2026-05-29T02:10:23.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:10:23.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:10:23.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:10:01, diff=22.999558s, valid=True
2026-05-29T02:10:23.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:10:23.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:10:23.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:10:23.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:10:24.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:10:24.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:10:24.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=192.003288s, valid=True
2026-05-29T02:10:24.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:10:24.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:10:24.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:10:24.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946066.00411s, valid=True
2026-05-29T02:10:24.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:10:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:10:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:10:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:10:24.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:10:24.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:10:24.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:10:24.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:10:24.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:10:24.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:10:24.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:10:24.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:10:24.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:10:24.328 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:10:24.532 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:10:24.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:10:24.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:10:24.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:10:24.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-29T02:10:24.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-29T02:10:25.189 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:10:25.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:10:55.219 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:10:55.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:10:55.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:10:55.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:10:55.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:10:56.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:10:56.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-29T02:10:56.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:10:56.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-29T02:10:56.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:10:56.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:10:56.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:10:56.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-29T02:10:58.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-29T02:10:58.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:10:58.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:10:58.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:10:58.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:10:58.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:10:58.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:10:58.509 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:10:58.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:10:58.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:10:58.510 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:10:58.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:10:58.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:10:58.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:10:58.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:10:58.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:10:58.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:10:58.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:10:58.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:10:58.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:10:58.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:10:58.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:10:58.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:10:58.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:10:58.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:10:33
2026-05-29T02:10:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70613, datetime.datetime(2026, 5, 29, 2, 10, 33), datetime.datetime(2026, 5, 29, 2, 10, 33), 'salt', 7.02, 86.56, None, 11.4, 119.59, 2.08, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:10:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:10:58.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:10:58.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:10:33, diff=25.895441s, valid=True
2026-05-29T02:10:58.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:10:58.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:10:58.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=226.898857s, valid=True
2026-05-29T02:10:58.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:10:58.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:10:58.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:10:33, diff=25.906741s, valid=True
2026-05-29T02:10:58.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:10:58.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:10:58.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:10:58.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:10:58.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:10:58.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:10:58.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=226.910381s, valid=True
2026-05-29T02:10:58.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:10:58.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:10:58.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:10:58.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946100.911188s, valid=True
2026-05-29T02:10:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:10:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:10:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:10:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:10:58.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:10:58.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:10:58.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:10:58.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:10:59.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:10:59.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:10:59.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:10:59.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:10:59.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:10:59.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:10:59.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:10:59.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:10:59.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:10:59.975 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:10:59.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-29T02:10:59.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-29T02:11:00.239 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:11:00.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:11:30.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:11:30.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:11:30.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:11:30.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:11:30.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:11:30.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:11:30.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-29T02:11:30.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:11:30.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-29T02:11:30.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:11:30.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:11:30.614 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:11:30.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:11:33.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-29T02:11:33.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:11:33.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:11:33.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:11:33.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:11:33.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:11:33.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:11:33.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:11:33.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:11:33.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:11:33.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:11:33.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:11:33.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:11:33.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:11:33.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:11:33.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:11:33.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:11:33.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:11:33.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:11:33.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:11:33.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:11:33.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:11:33.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:11:33.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:11:33.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:11:04
2026-05-29T02:11:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70614, datetime.datetime(2026, 5, 29, 2, 11, 4), datetime.datetime(2026, 5, 29, 2, 11, 3), 'salt', 7.08, 86.52, None, 12.14, 123.09, 2.08, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:11:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:11:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:11:33.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:11:03, diff=30.460172s, valid=True
2026-05-29T02:11:33.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:11:33.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:11:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=261.463583s, valid=True
2026-05-29T02:11:33.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:11:33.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:10:58, diff=35.471313s, valid=True
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:11:33.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:11:33.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:07:12, diff=261.474965s, valid=True
2026-05-29T02:11:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:11:33.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:11:33.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:11:33.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946135.475756s, valid=True
2026-05-29T02:11:33.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:11:33.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:11:33.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:11:33.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:11:33.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:11:33.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:11:33.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:11:33.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:11:33.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:11:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:11:33.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:11:33.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:11:33.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:11:33.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:11:34.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:11:34.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:11:34.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:11:34.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:11:34.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:11:34.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:11:34.543 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:11:34.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:12:04.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:12:04.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:12:04.545 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:12:04.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:12:04.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:12:05.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:12:05.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:12:05.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:12:05.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-29T02:12:05.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:12:05.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:12:05.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:12:05.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:12:07.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-29T02:12:07.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:12:07.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:12:07.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:12:07.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:12:07.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:12:07.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:12:07.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:12:07.846 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:12:07.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:12:07.846 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:12:07.846 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:12:07.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:12:07.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:12:07.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:12:08.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:12:08.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:12:08.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:12:08.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:12:08.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:12:08.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:12:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:12:08.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:12:08.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:12:08.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:12:04
2026-05-29T02:12:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70616, datetime.datetime(2026, 5, 29, 2, 12, 4), datetime.datetime(2026, 5, 29, 2, 12, 4), 'salt', 7.02, 86.42, None, 11.93, 121.75, 2.11, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:12:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:12:08.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:12:08.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:12:04, diff=4.244674s, valid=True
2026-05-29T02:12:08.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:12:08.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:12:08.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:12:12, diff=-3.751881s, valid=True
2026-05-29T02:12:08.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:12:08.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:11:59, diff=9.256182s, valid=True
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:12:08.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:12:08.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:12:12, diff=-3.740099s, valid=True
2026-05-29T02:12:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:12:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:12:08.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:12:08.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946170.260718s, valid=True
2026-05-29T02:12:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:12:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:12:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:12:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:12:08.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:12:08.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:12:08.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:12:08.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:12:08.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:12:08.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:12:08.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:12:08.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:12:08.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:12:08.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:12:08.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:12:09.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:12:09.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:12:09.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:12:09.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-29T02:12:09.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-29T02:12:09.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:12:09.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:12:39.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:12:39.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:12:39.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:12:39.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:12:39.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:12:40.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:12:40.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-29T02:12:40.015 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:12:40.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-29T02:12:40.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:12:40.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:12:40.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:12:40.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-29T02:12:42.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-29T02:12:42.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:12:42.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:12:42.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:12:42.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:12:42.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:12:42.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:12:42.783 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:12:42.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:12:42.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:12:42.784 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:12:42.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:12:42.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:12:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:12:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:12:43.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:12:43.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:12:43.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:12:43.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:12:43.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:12:43.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:12:43.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:12:43.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:12:43.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:12:43.171 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:12:34
2026-05-29T02:12:43.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70617, datetime.datetime(2026, 5, 29, 2, 12, 34), datetime.datetime(2026, 5, 29, 2, 12, 34), 'salt', 6.95, 86.46, None, 11.86, 116.07, 2.1, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:12:43.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:12:43.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:12:43.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:12:34, diff=9.179442s, valid=True
2026-05-29T02:12:43.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:12:43.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:12:43.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:12, diff=-28.817112s, valid=True
2026-05-29T02:12:43.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:12:43.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:12:43.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:12:29, diff=14.190973s, valid=True
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:12:43.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:12:43.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:12, diff=-28.805388s, valid=True
2026-05-29T02:12:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:12:43.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:12:43.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:12:43.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946205.195402s, valid=True
2026-05-29T02:12:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:12:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:12:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:12:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:12:43.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:12:43.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:12:43.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:12:43.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:12:43.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:12:43.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:12:43.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:12:43.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:12:43.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:12:43.517 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:12:43.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:12:44.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:12:44.210 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:12:44.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:12:44.211 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:12:44.211 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:12:44.430 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:12:44.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:13:14.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:13:14.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:13:14.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:13:14.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:13:14.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:13:14.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:13:14.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-29T02:13:14.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:13: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-29T02:13:14.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:13:14.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:13:14.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:13:14.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:13:17.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-29T02:13:17.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:13:17.835 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:13:17.836 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:13:17.837 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:13:17.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:13:17.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:13:17.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:13:17.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:13:17.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:13:17.863 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:13:17.864 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:13:17.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:13:17.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:13:17.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:13:18.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:13:18.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:13:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:13:18.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:13:18.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:13:18.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:13:18.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:13:18.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:13:18.189 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:13:18.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:13:04
2026-05-29T02:13:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70618, datetime.datetime(2026, 5, 29, 2, 13, 4), datetime.datetime(2026, 5, 29, 2, 13, 4), 'salt', 6.99, 86.46, None, 13.27, 118.7, 2.1, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:13:18.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:13:18.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:13:18.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:04, diff=14.257803s, valid=True
2026-05-29T02:13:18.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:13:18.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:13:18.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:12, diff=6.26125s, valid=True
2026-05-29T02:13:18.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:13:18.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:00, diff=18.269316s, valid=True
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:13:18.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:13:18.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:12, diff=6.272978s, valid=True
2026-05-29T02:13:18.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:13:18.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:13:18.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:13:18.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946240.273784s, valid=True
2026-05-29T02:13:18.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:13:18.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:13:18.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:13:18.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:13:18.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:13:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:13:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:13:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:13:18.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:13:18.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:13:18.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:13:18.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:13:18.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:13:18.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:13:18.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:13:19.144 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:13:19.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:13:19.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:13:19.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-29T02:13:19.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-29T02:13:19.461 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:13:19.462 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:13:49.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:13:49.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:13:49.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:13:49.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:13:49.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:13:50.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:13:50.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:13:50.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:13:50.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-29T02:13:50.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:13:50.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:13:50.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:13:50.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-29T02:13:52.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-29T02:13:52.542 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:13:52.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:13:52.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:13:52.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:13:52.562 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:13:52.574 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:13:52.575 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:13:52.575 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:13:52.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:13:52.576 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:13:52.576 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:13:52.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:13:52.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:13:52.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:13:52.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:13:52.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:13:52.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:13:52.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:13:52.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:13:52.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:13:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:13:52.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:13:52.899 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:13:52.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:13:35
2026-05-29T02:13:52.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70619, datetime.datetime(2026, 5, 29, 2, 13, 35), datetime.datetime(2026, 5, 29, 2, 13, 34), 'salt', 6.99, 86.42, None, 11.58, 120.51, 2.11, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:13:52.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:13:52.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:13:52.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:34, diff=18.965797s, valid=True
2026-05-29T02:13:52.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:13:52.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:13:52.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:12, diff=-19.030804s, valid=True
2026-05-29T02:13:52.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:13:52.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:13:31, diff=21.977098s, valid=True
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:13:52.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:13:52.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:12, diff=-19.019305s, valid=True
2026-05-29T02:13:52.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:13:52.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:13:52.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:13:52.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946274.981479s, valid=True
2026-05-29T02:13:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:13:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:13:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:13:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:13:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:13:53.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:13:53.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:13:53.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:13:53.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:13:53.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:13:53.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:13:53.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:13:53.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:13:53.305 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:13:53.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:13:53.923 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:13:54.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:13:54.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:13:54.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-29T02:13:54.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-29T02:13:54.203 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:13:54.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:14:24.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:14:24.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:14:24.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:14:24.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:14:24.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:14:24.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:14:24.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-29T02:14:24.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:14:24.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-29T02:14:24.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:14:24.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:14:24.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:14:24.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:14:27.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:14:27.312 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:14:27.320 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:14:27.321 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:14:27.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:14:27.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:14:27.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:14:27.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:14:27.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:14:27.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:14:27.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:14:27.347 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:14:27.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:14:27.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:14:27.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:14:27.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:14:27.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:14:27.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:14:27.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:14:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:14:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:14:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:14:27.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:14:27.673 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:14:27.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:14:05
2026-05-29T02:14:27.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70620, datetime.datetime(2026, 5, 29, 2, 14, 5), datetime.datetime(2026, 5, 29, 2, 14, 5), 'salt', 6.82, 86.42, None, 12.92, 118.09, 2.1, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:14:27.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:14:27.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:14:27.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:05, diff=22.751232s, valid=True
2026-05-29T02:14:27.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:14:27.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:14:27.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:12, diff=15.754636s, valid=True
2026-05-29T02:14:27.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:14:27.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:02, diff=25.762412s, valid=True
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:14:27.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:14:27.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:12, diff=15.765981s, valid=True
2026-05-29T02:14:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:14:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:14:27.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:14:27.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946309.766777s, valid=True
2026-05-29T02:14:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:14:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:14:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:14:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:14:27.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:14:27.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:14:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:14:27.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:14:27.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:14:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:14:27.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:14:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:14:28.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:14:28.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:14:28.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:14:28.643 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:14:28.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:14:28.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:14:28.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-29T02:14:28.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-29T02:14:28.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:14:28.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:14:58.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:14:58.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:14:58.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:14:59.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:14:59.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:14:59.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:14:59.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-29T02:14:59.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:14:59.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-29T02:14:59.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:14:59.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:14:59.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:14:59.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-29T02:15:02.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-29T02:15:02.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:15:02.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:15:02.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:15:02.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:15:02.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:15:02.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:15:02.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:15:02.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:15:02.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:15:02.366 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:15:02.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:15:02.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:15:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:15:02.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:15:02.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:15:02.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:15:02.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:15:02.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:15:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:15:02.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:15:02.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:15:02.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:15:02.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:15:02.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:14:35
2026-05-29T02:15:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70621, datetime.datetime(2026, 5, 29, 2, 14, 35), datetime.datetime(2026, 5, 29, 2, 14, 35), 'salt', 6.62, 86.49, None, 12.56, 123.89, 2.09, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:15:02.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:15:02.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:15:02.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:35, diff=27.774299s, valid=True
2026-05-29T02:15:02.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:15:02.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:15:02.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:15:12, diff=-9.222187s, valid=True
2026-05-29T02:15:02.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:15:02.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:14:34, diff=28.786393s, valid=True
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:15:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:15:02.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:15:02.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:15:12, diff=-9.209527s, valid=True
2026-05-29T02:15:02.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:15:02.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:15:02.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:15:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946344.791487s, valid=True
2026-05-29T02:15:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:15:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:15:02.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:15:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:15:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:15:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:15:02.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:15:02.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:15:02.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:15:02.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:15:03.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:15:03.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:15:03.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:15:03.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:15:03.456 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:15:03.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:15:03.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:15:03.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:15:03.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-29T02:15:03.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-29T02:15:05.011 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:15:05.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:15:35.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:15:35.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:15:35.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:15:35.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:15:35.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:15:35.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:15:35.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-29T02:15:35.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:15:35.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-29T02:15:35.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:15:35.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:15:35.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:15:35.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-29T02:15:38.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-29T02:15:38.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:15:38.014 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:15:38.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:15:38.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:15:38.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:15:38.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:15:38.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:15:38.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:15:38.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:15:38.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:15:38.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:15:38.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:15:38.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:15:38.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:15:38.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:15:38.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:15:38.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:15:38.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:15:38.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:15:38.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:15:38.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:15:38.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:15:38.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:15:38.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:15:36
2026-05-29T02:15:38.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70623, datetime.datetime(2026, 5, 29, 2, 15, 36), datetime.datetime(2026, 5, 29, 2, 15, 35), 'salt', 6.62, 86.72, None, 12.28, 123.21, 2.05, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:15:38.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:15:38.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:15:38.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:15:35, diff=3.470762s, valid=True
2026-05-29T02:15:38.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:15:38.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:15:38.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:12, diff=-33.525576s, valid=True
2026-05-29T02:15:38.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:15:38.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:15:38.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:15:30, diff=8.482862s, valid=True
2026-05-29T02:15:38.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:15:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:15:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:15:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:15:38.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:15:38.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:15:38.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:12, diff=-33.513261s, valid=True
2026-05-29T02:15:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:15:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:15:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:15:38.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946380.487582s, valid=True
2026-05-29T02:15:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:15:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:15:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:15:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:15:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:15:38.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:15:38.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:15:38.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:15:38.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:15:38.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:15:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:15:38.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:15:38.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:15:38.812 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:15:39.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:15:39.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:15:39.449 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:15:39.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:15:39.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-29T02:15:39.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-29T02:15:39.682 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:15:39.682 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:16:09.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:16:09.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:16:09.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:16:09.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:16:09.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:16:10.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:16:10.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:16:10.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:16:10.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-29T02:16:10.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:16:10.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:16:10.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:16:10.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-29T02:16:12.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:16:12.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:16:12.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:16:12.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:16:12.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:16:12.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:16:12.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:16:12.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:16:12.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:16:12.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:16:12.566 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:16:12.566 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:16:12.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:16:12.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:16:12.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:16:12.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:16:12.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:16:12.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:16:12.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:16:12.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:16:12.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:16:12.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:16:12.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:16:12.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:16:12.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:16:06
2026-05-29T02:16:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70624, datetime.datetime(2026, 5, 29, 2, 16, 6), datetime.datetime(2026, 5, 29, 2, 16, 6), 'salt', 6.62, 86.85, None, 14.64, 118.63, 2.03, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:16:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:16:12.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:16:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:06, diff=6.987238s, valid=True
2026-05-29T02:16:12.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:16:12.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:16:12.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:12, diff=0.990687s, valid=True
2026-05-29T02:16:12.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:16:12.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:16:12.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:01, diff=11.998658s, valid=True
2026-05-29T02:16:12.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:16:12.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:16:12.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:16:12.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:16:12.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:16:12.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:16:13.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:12, diff=1.002339s, valid=True
2026-05-29T02:16:13.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:16:13.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:16:13.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:16:13.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946415.00314s, valid=True
2026-05-29T02:16:13.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:16:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:16:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:16:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:16:13.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:16:13.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:16:13.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:16:13.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:16:13.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:16:13.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:16:13.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:16:13.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:16:13.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:16:13.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:16:13.592 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:16:13.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:16:14.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:16:14.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:16:14.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-29T02:16:14.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-29T02:16:14.209 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:16:14.209 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:16:44.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:16:44.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:16:44.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:16:44.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:16:44.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:16:44.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:16:44.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:16:44.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:16:44.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-29T02:16:44.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:16:44.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:16:44.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:16:44.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-29T02:16:47.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-29T02:16:47.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:16:47.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:16:47.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:16:47.327 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:16:47.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:16:47.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:16:47.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:16:47.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:16:47.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:16:47.352 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:16:47.352 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:16:47.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:16:47.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:16:47.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:16:47.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:16:47.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:16:47.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:16:47.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:16:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:16:47.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:16:47.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:16:47.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:16:47.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:16:47.752 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:16:36
2026-05-29T02:16:47.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70625, datetime.datetime(2026, 5, 29, 2, 16, 36), datetime.datetime(2026, 5, 29, 2, 16, 36), 'salt', 6.55, 86.95, None, 12.99, 125.77, 2.01, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:16:47.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:16:47.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:16:47.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:36, diff=11.759304s, valid=True
2026-05-29T02:16:47.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:16:47.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:16:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:12, diff=-24.237369s, valid=True
2026-05-29T02:16:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:16:47.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:16:31, diff=16.770338s, valid=True
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:16:47.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:16:47.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:12, diff=-24.22611s, valid=True
2026-05-29T02:16:47.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:16:47.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:16:47.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:16:47.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946449.774701s, valid=True
2026-05-29T02:16:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:16:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:16:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:16:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:16:47.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:16:47.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:16:47.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:16:47.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:16:47.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:16:47.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:16:47.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:16:48.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:16:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:16:48.099 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:16:48.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:16:48.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:16:48.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:16:48.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:16:48.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-29T02:16:48.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-29T02:16:48.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:16:48.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:17:18.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:17:18.898 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:17:18.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:17:19.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:17:19.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:17:19.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:17:19.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-29T02:17:19.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:17:19.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-29T02:17:19.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:17:19.475 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:17:19.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:17:19.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-29T02:17:21.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-29T02:17:21.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:17:21.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:17:21.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:17:21.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:17:21.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:17:21.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:17:21.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:17:21.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:17:21.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:17:21.950 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:17:21.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:17:21.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:17:22.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:17:22.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:17:22.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:17:22.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:17:22.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:17:22.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:17:22.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:17:22.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:17:22.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:17:22.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:17:22.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:17:22.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:17:06
2026-05-29T02:17:22.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70626, datetime.datetime(2026, 5, 29, 2, 17, 6), datetime.datetime(2026, 5, 29, 2, 17, 6), 'salt', 6.65, 87.22, None, 13.2, 121.42, 1.96, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:17:22.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:17:22.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:17:22.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:06, diff=16.340025s, valid=True
2026-05-29T02:17:22.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:17:22.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:17:22.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:12, diff=10.343397s, valid=True
2026-05-29T02:17:22.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:17:22.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:01, diff=21.351267s, valid=True
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:17:22.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:17:22.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:12, diff=10.354871s, valid=True
2026-05-29T02:17:22.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:17:22.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:17:22.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:17:22.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946484.35568s, valid=True
2026-05-29T02:17:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:17:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:17:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:17:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:17:22.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:17:22.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:17:22.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:17:22.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:17:22.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:17:22.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:17:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:17:22.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:17:22.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:17:22.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:17:22.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:17:23.294 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:17:23.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:17:23.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:17:23.396 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:17:23.396 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:17:23.576 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:17:23.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:17:53.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:17:53.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:17:53.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:17:53.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:17:53.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:17:54.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:17:54.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-29T02:17:54.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:17:54.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-29T02:17:54.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:17:54.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:17:54.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:17:54.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-29T02:17:56.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-29T02:17:56.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:17:56.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:17:56.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:17:56.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:17:56.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:17:56.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:17:56.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:17:56.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:17:56.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:17:56.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:17:56.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:17:56.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:17:56.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:17:56.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:17:56.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:17:56.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:17:56.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:17:56.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:17:56.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:17:56.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:17:56.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:17:56.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:17:56.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:17:57.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:17:37
2026-05-29T02:17:57.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70627, datetime.datetime(2026, 5, 29, 2, 17, 37), datetime.datetime(2026, 5, 29, 2, 17, 36), 'salt', 6.75, 87.35, None, 13.52, 125.67, 1.94, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:17:57.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:17:57.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:17:57.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:36, diff=21.008506s, valid=True
2026-05-29T02:17:57.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:17:57.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:17:57.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:12, diff=-14.987997s, valid=True
2026-05-29T02:17:57.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:17:57.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:17:32, diff=25.020125s, valid=True
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:17:57.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:17:57.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:12, diff=-14.976147s, valid=True
2026-05-29T02:17:57.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:17:57.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:17:57.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:17:57.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946519.024674s, valid=True
2026-05-29T02:17:57.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:17:57.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:17:57.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:17:57.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:17:57.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:17:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:17:57.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:17:57.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:17:57.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:17:57.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:17:57.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:17:57.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:17:57.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:17:57.346 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:17:57.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:17:57.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:17:57.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:17:57.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:17:57.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-29T02:17:57.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-29T02:17:58.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:17:58.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:18:28.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:18:28.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:18:28.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:18:28.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:18:28.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:18:28.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:18:28.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-29T02:18:28.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:18: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-29T02:18:28.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:18:28.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:18:28.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:18:28.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-29T02:18:31.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-29T02:18:31.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:18:31.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:18:31.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:18:31.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:18:31.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:18:31.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:18:31.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:18:31.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:18:31.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:18:31.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:18:31.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:18:31.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:18:31.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:18:31.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:18:31.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:18:31.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:18:31.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:18:31.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:18:31.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:18:31.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:18:31.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:18:31.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:18:31.438 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:18:31.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:18:07
2026-05-29T02:18:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70628, datetime.datetime(2026, 5, 29, 2, 18, 7), datetime.datetime(2026, 5, 29, 2, 18, 7), 'salt', 6.65, 87.35, None, 13.87, 126.73, 1.94, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:18:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:18:31.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:18:31.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:07, diff=24.506509s, valid=True
2026-05-29T02:18:31.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:18:31.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:18:31.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:12, diff=19.509882s, valid=True
2026-05-29T02:18:31.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:18:31.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:18:31.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:04, diff=27.517871s, valid=True
2026-05-29T02:18:31.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:18:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:18:31.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:18:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:18:31.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:18:31.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:18:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:12, diff=19.521438s, valid=True
2026-05-29T02:18:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:18:31.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:18:31.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:18:31.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946553.522236s, valid=True
2026-05-29T02:18:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:18:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:18:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:18:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:18:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:18:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:18:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:18:31.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:18:31.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:18:31.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:18:31.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:18:31.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:18:31.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:18:31.847 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:18:32.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:18:32.387 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:18:32.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:18:32.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:18:32.487 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:18:32.487 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:18:32.739 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:18:32.739 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:19:02.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:19:02.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:19:02.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:19:03.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:19:03.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:19:03.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:19:03.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-29T02:19:03.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:19:03.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-29T02:19:03.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:19:03.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:19:03.460 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:19:03.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-29T02:19:05.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-29T02:19:05.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:19:05.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:19:05.762 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:19:05.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:19:05.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:19:05.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:19:05.785 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:19:05.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:19:05.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:19:05.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:19:05.787 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:19:05.794 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:19:05.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:19:05.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:19:06.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:19:06.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:19:06.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:19:06.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:19:06.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:19:06.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:19:06.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:19:06.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:19:06.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:19:06.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:18:38
2026-05-29T02:19:06.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70629, datetime.datetime(2026, 5, 29, 2, 18, 38), datetime.datetime(2026, 5, 29, 2, 18, 37), 'salt', 6.62, 87.25, None, 13.94, 127.57, 1.96, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:19:06.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:19:06.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:19:06.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:37, diff=29.171404s, valid=True
2026-05-29T02:19:06.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:19:06.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:19:06.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:19:12, diff=-5.825146s, valid=True
2026-05-29T02:19:06.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:19:06.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:19:06.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:18:35, diff=31.18275s, valid=True
2026-05-29T02:19:06.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:19:06.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:19:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:19:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:19:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:19:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:19:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:19:12, diff=-5.813674s, valid=True
2026-05-29T02:19:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:19:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:19:06.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:19:06.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946588.187122s, valid=True
2026-05-29T02:19:06.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:19:06.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:19:06.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:19:06.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:19:06.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:19:06.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:19:06.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:19:06.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:19:06.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:19:06.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:19:06.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:19:06.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:19:06.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:19:06.510 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:19:06.712 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:19:07.106 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:19:07.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:19:07.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:19:07.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-29T02:19:07.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-29T02:19:07.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:19:07.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:19:37.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:19:37.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:19:37.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:19:37.708 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:19:37.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:19:37.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:19:37.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-29T02:19:37.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:19:37.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-29T02:19:37.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:19:37.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:19:37.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:19:37.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-29T02:19:40.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-29T02:19:40.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:19:40.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:19:40.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:19:40.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:19:40.491 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:19:40.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:19:40.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:19:40.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:19:40.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:19:40.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:19:40.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:19:40.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:19:40.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:19:40.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:19:40.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:19:40.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:19:40.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:19:40.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:19:40.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:19:40.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:19:40.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:19:40.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:19:40.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:19:40.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:19:38
2026-05-29T02:19:40.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70631, datetime.datetime(2026, 5, 29, 2, 19, 38), datetime.datetime(2026, 5, 29, 2, 19, 38), 'salt', 6.55, 87.42, None, 13.69, 119.99, 1.93, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:19:40.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:19:40.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:19:40.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:19:38, diff=2.876971s, valid=True
2026-05-29T02:19:40.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:19:40.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:19:40.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:12, diff=-31.119745s, valid=True
2026-05-29T02:19:40.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:19:40.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:19:38, diff=2.887999s, valid=True
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:19:40.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:19:40.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:12, diff=-31.108467s, valid=True
2026-05-29T02:19:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:19:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:19:40.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:19:40.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946622.892332s, valid=True
2026-05-29T02:19:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:19:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:19:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:19:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:19:40.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:19:40.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:19:40.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:19:40.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:19:40.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:19:41.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:19:41.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:19:41.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:19:41.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:19:41.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:19:41.422 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:19:41.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:19:41.867 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:19:41.867 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:19:41.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-29T02:19:41.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-29T02:19:42.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:19:42.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:20:12.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:20:12.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:20:12.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:20:12.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:20:12.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:20:12.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:20:12.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-29T02:20:12.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:20:12.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-29T02:20:12.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:20:12.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:20:12.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:20:12.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-29T02:20:15.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:20:15.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:20:15.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:20:15.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:20:15.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:20:15.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:20:15.534 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:20:15.535 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:20:15.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:20:15.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:20:15.536 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:20:15.536 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:20:15.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:20:15.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:20:15.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:20:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:20:15.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:20:15.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:20:15.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:20:15.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:20:15.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:20:15.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:20:15.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:20:15.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:20:15.921 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:20:09
2026-05-29T02:20:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70632, datetime.datetime(2026, 5, 29, 2, 20, 9), datetime.datetime(2026, 5, 29, 2, 20, 8), 'salt', 6.45, 87.45, None, 13.9, 122.83, 1.92, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:20:15.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:20:15.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:20:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:08, diff=7.929369s, valid=True
2026-05-29T02:20:15.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:20:15.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:20:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:12, diff=3.93278s, valid=True
2026-05-29T02:20:15.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:20:15.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:20:15.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:03, diff=12.940745s, valid=True
2026-05-29T02:20:15.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:20:15.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:20:15.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:20:15.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:20:15.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:20:15.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:20:15.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:12, diff=3.94435s, valid=True
2026-05-29T02:20:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:20:15.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:20:15.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:20:15.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946657.945148s, valid=True
2026-05-29T02:20:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:20:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:20:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:20:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:20:15.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:20:16.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:20:16.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:20:16.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:20:16.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:20:16.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:20:16.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:20:16.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:20:16.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:20:16.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:20:16.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:20:16.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:20:16.976 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:20:16.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:20:16.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:20:16.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:20:17.222 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:20:17.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:20:47.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:20:47.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:20:47.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:20:47.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:20:47.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:20:47.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:20:47.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-29T02:20:47.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:20:47.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-29T02:20:47.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:20:47.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:20:47.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:20:47.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-29T02:20:50.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-29T02:20:50.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:20:50.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:20:50.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:20:50.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:20:50.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:20:50.847 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:20:50.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:20:50.849 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:20:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:20:50.849 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:20:50.849 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:20:50.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:20:50.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:20:50.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:20:51.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:20:51.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:20:51.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:20:51.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:20:51.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:20:51.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:20:51.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:20:51.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:20:51.183 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:20:51.247 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:20:39
2026-05-29T02:20:51.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70633, datetime.datetime(2026, 5, 29, 2, 20, 39), datetime.datetime(2026, 5, 29, 2, 20, 39), 'salt', 6.59, 87.59, None, 14.33, 117.22, 1.91, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:20:51.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:20:51.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:20:51.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:39, diff=12.254501s, valid=True
2026-05-29T02:20:51.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:20:51.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:20:51.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:12, diff=-20.742138s, valid=True
2026-05-29T02:20:51.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:20:51.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:20:51.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:20:33, diff=18.265772s, valid=True
2026-05-29T02:20:51.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:20:51.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:20:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:20:51.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:20:51.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:20:51.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:20:51.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:12, diff=-20.730616s, valid=True
2026-05-29T02:20:51.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:20:51.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:20:51.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:20:51.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946693.27021s, valid=True
2026-05-29T02:20:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:20:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:20:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:20:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:20:51.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:20:51.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:20:51.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:20:51.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:20:51.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:20:51.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:20:51.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:20:51.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:20:51.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:20:51.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:20:51.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:20:52.132 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:20:52.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:20:52.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:20: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-29T02:20:52.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-29T02:20:52.388 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:20:52.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:21:22.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:21:22.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:21:22.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:21:23.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:21:23.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:21:23.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:21:23.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:21:23.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:21:23.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:21:23.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:21:23.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:21:23.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:21:23.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-29T02:21:26.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-29T02:21:26.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:21:26.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:21:26.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:21:26.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:21:26.278 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:21:26.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:21:26.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:21:26.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:21:26.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:21:26.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:21:26.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:21:26.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:21:26.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:21:26.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:21:26.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:21:26.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:21:26.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:21:26.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:21:26.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:21:26.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:21:26.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:21:26.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:21:26.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:21:26.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:21:09
2026-05-29T02:21:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70634, datetime.datetime(2026, 5, 29, 2, 21, 9), datetime.datetime(2026, 5, 29, 2, 21, 9), 'salt', 6.55, 87.62, None, 13.02, 122.81, 1.9, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:21:26.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:21:26.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:21:26.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:09, diff=17.644856s, valid=True
2026-05-29T02:21:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:21:26.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:21:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:12, diff=14.647747s, valid=True
2026-05-29T02:21:26.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:21:26.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:03, diff=23.654434s, valid=True
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:21:26.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:21:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:12, diff=14.657503s, valid=True
2026-05-29T02:21:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:21:26.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:21:26.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:21:26.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946728.658179s, valid=True
2026-05-29T02:21:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:21:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:21:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:21:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:21:26.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:21:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:21:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:21:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:21:26.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:21:26.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:21:26.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:21:26.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:21:26.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:21:26.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:21:27.258 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:21:27.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:21:27.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:21:27.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:21:27.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-29T02:21:27.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-29T02:21:27.964 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:21:27.964 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:21:57.967 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:21:57.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:21:57.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:21:58.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:21:58.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:21:58.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:21:58.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:21:58.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:21:58.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:21:58.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:21:58.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:21:58.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:21:58.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:22:01.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-29T02:22:01.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:22:01.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:22:01.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:22:01.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:22:01.331 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:22:01.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:22:01.345 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:22:01.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:22:01.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:22:01.346 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:22:01.346 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:22:01.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:22:01.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:22:01.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:22:01.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:22:01.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:22:01.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:22:01.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:22:01.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:22:01.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:22:01.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:22:01.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:22:01.674 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:22:01.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:21:40
2026-05-29T02:22:01.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70635, datetime.datetime(2026, 5, 29, 2, 21, 40), datetime.datetime(2026, 5, 29, 2, 21, 39), 'salt', 6.59, 87.52, None, 14.36, 123.23, 1.92, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:22:01.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:22:01.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:22:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:39, diff=22.746172s, valid=True
2026-05-29T02:22:01.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:22:01.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:22:01.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:12, diff=-10.250728s, valid=True
2026-05-29T02:22:01.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:22:01.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:21:34, diff=27.756527s, valid=True
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:22:01.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:22:01.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:22:01.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:12, diff=-10.240156s, valid=True
2026-05-29T02:22:01.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:22:01.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:22:01.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:22:01.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946763.760562s, valid=True
2026-05-29T02:22:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:22:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:22:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:22:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:22:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:22:01.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:22:01.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:22:01.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:22:01.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:22:01.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:22:01.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:22:01.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:22:02.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:22:02.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:22:02.285 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:22:02.623 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:22:02.729 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:22:02.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:22:02.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-29T02:22:02.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-29T02:22:02.903 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:22:02.903 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:22:32.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:22:32.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:22:32.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:22:33.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:22:33.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:22:33.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:22:33.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-29T02:22:33.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:22:33.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-29T02:22:33.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:22:33.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:22:33.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:22:33.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-29T02:22:36.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-29T02:22:36.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:22:36.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:22:36.093 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:22:36.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:22:36.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:22:36.115 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:22:36.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:22:36.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:22:36.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:22:36.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:22:36.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:22:36.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:22:36.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:22:36.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:22:36.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:22:36.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:22:36.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:22:36.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:22:36.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:22:36.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:22:36.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:22:36.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:22:36.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:22:36.454 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:22:10
2026-05-29T02:22:36.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70636, datetime.datetime(2026, 5, 29, 2, 22, 10), datetime.datetime(2026, 5, 29, 2, 22, 10), 'salt', 6.49, 87.42, None, 14.5, 119.29, 1.94, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:22:36.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:22:36.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:22:36.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:10, diff=26.461736s, valid=True
2026-05-29T02:22:36.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:22:36.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:22:36.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:12, diff=24.464905s, valid=True
2026-05-29T02:22:36.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:22:36.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:05, diff=31.472323s, valid=True
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:22:36.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:22:36.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:22:12, diff=24.475707s, valid=True
2026-05-29T02:22:36.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:22:36.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:22:36.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:22:36.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946798.476435s, valid=True
2026-05-29T02:22:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:22:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:22:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:22:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:22:36.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:22:36.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:22:36.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:22:36.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:22:36.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:22:36.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:22:36.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:22:36.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:22:36.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:22:36.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:22:37.065 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:22:37.400 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:22:37.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:22:37.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:22:37.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-29T02:22:37.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-29T02:22:37.676 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:22:37.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:23:07.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:23:07.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:23:07.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:23:08.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:23:08.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:23:08.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:23:08.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-29T02:23:08.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:23:08.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-29T02:23:08.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:23:08.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:23:08.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:23:08.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-29T02:23:10.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-29T02:23:10.695 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:23:10.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:23:10.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:23:10.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:23:10.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:23:10.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:23:10.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:23:10.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:23:10.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:23:10.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:23:10.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:23:10.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:23:10.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:23:10.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:23:10.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:23:10.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:23:10.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:23:10.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:23:11.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:23:11.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:23:11.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:23:11.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:23:11.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:23:11.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:23:10
2026-05-29T02:23:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70638, datetime.datetime(2026, 5, 29, 2, 23, 10), datetime.datetime(2026, 5, 29, 2, 23, 10), 'salt', 6.42, 87.39, None, 13.34, 122.55, 1.94, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:23:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:23:11.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:23:11.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:10, diff=1.077375s, valid=True
2026-05-29T02:23:11.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:23:11.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:23:11.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:12, diff=-0.919714s, valid=True
2026-05-29T02:23:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:23:11.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:23:11.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:08, diff=3.086956s, valid=True
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:23:11.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:23:11.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:12, diff=-0.909999s, valid=True
2026-05-29T02:23:11.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:23:11.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:23:11.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:23:11.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946833.090678s, valid=True
2026-05-29T02:23:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:23:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:23:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:23:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:23:11.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:23:11.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:23:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:23:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:23:11.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:23:11.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:23:11.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:23:11.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:23:11.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:23:11.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:23:11.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:23:12.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:23:12.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:23:12.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:23:12.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-29T02:23:12.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-29T02:23:12.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:23:12.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:23:42.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:23:42.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:23:42.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:23:42.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:23:42.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:23:42.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:23:42.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-29T02:23:42.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:23:42.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-29T02:23:42.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:23:42.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:23:42.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:23:42.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:23:45.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-29T02:23:45.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:23:45.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:23:45.120 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:23:45.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:23:45.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:23:45.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:23:45.141 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:23:45.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:23:45.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:23:45.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:23:45.141 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:23:45.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:23:45.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:23:45.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:23:45.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:23:45.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:23:45.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:23:45.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:23:45.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:23:45.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:23:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:23:45.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:23:45.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:23:45.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:23:41
2026-05-29T02:23:45.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70639, datetime.datetime(2026, 5, 29, 2, 23, 41), datetime.datetime(2026, 5, 29, 2, 23, 40), 'salt', 6.25, 87.35, None, 13.2, 118.96, 1.94, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:23:45.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:23:45.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:23:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:40, diff=5.524724s, valid=True
2026-05-29T02:23:45.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:23:45.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:23:45.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:12, diff=-26.471913s, valid=True
2026-05-29T02:23:45.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:23:45.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:23:39, diff=6.536028s, valid=True
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:23:45.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:23:45.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:12, diff=-26.460418s, valid=True
2026-05-29T02:23:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:23:45.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:23:45.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:23:45.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946867.540375s, valid=True
2026-05-29T02:23:45.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:23:45.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:23:45.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:23:45.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:23:45.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:23:45.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:23:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:23:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:23:45.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:23:45.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:23:45.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:23:45.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:23:45.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:23:45.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:23:46.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:23:46.466 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:23:46.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:23:46.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:23:46.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-29T02:23:46.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-29T02:23:46.770 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:23:46.771 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:24:16.781 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:24:16.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:24:16.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:24:17.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:24:17.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:24:17.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:24:17.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-29T02:24:17.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:24:17.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-29T02:24:17.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:24:17.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:24:17.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:24:17.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-29T02:24:19.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-29T02:24:19.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:24:19.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:24:19.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:24:19.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:24:19.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:24:19.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:24:19.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:24:19.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:24:19.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:24:19.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:24:19.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:24:19.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:24:19.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:24:19.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:24:19.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:24:19.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:24:20.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:24:20.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:24:20.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:24:20.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:24:20.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:24:20.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:24:20.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:24:20.113 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:24:11
2026-05-29T02:24:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70640, datetime.datetime(2026, 5, 29, 2, 24, 11), datetime.datetime(2026, 5, 29, 2, 24, 11), 'salt', 6.42, 87.62, None, 14.89, 121.54, 1.9, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:24:20.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:24:20.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:24:20.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:11, diff=9.120372s, valid=True
2026-05-29T02:24:20.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:24:20.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:24:20.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:12, diff=8.123547s, valid=True
2026-05-29T02:24:20.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:24:20.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:10, diff=10.131287s, valid=True
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:24:20.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:24:20.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:12, diff=8.134697s, valid=True
2026-05-29T02:24:20.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:24:20.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:24:20.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:24:20.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946902.135525s, valid=True
2026-05-29T02:24:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:24:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:24:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:24:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:24:20.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:24:20.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:24:20.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:24:20.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:24:20.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:24:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:24:20.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:24:20.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:24:20.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:24:20.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:24:20.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:24:20.992 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:24:21.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:24:21.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:24:21.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-29T02:24:21.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-29T02:24:21.180 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:24:21.180 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:24:51.210 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:24:51.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:24:51.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:24:51.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:24:51.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:24:51.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:24:51.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-29T02:24:51.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:24:51.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:24:51.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:24:51.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:24:51.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:24:51.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-29T02:24:54.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:24:54.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:24:54.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:24:54.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:24:54.257 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:24:54.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:24:54.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:24:54.282 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:24:54.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:24:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:24:54.283 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:24:54.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:24:54.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:24:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:24:54.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:24:54.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:24:54.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:24:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:24:54.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:24:54.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:24:54.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:24:54.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:24:54.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:24:54.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:24:54.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:24:41
2026-05-29T02:24:54.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70641, datetime.datetime(2026, 5, 29, 2, 24, 41), datetime.datetime(2026, 5, 29, 2, 24, 41), 'salt', 6.29, 87.72, None, 14.54, 120.86, 1.88, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:24:54.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:24:54.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:24:54.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:41, diff=13.673819s, valid=True
2026-05-29T02:24:54.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:24:54.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:24:54.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:12, diff=-17.322678s, valid=True
2026-05-29T02:24:54.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:24:54.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:24:35, diff=19.685262s, valid=True
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:24:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:24:54.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:12, diff=-17.311024s, valid=True
2026-05-29T02:24:54.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:24:54.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:24:54.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:24:54.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946936.689789s, valid=True
2026-05-29T02:24:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:24:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:24:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:24:54.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:24:54.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:24:54.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:24:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:24:54.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:24:54.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:24:54.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:24:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:24:54.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:24:54.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:24:55.011 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:24:55.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:24:55.548 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:24:55.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:24:55.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:24:55.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-29T02:24:55.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-29T02:24:55.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:24:55.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:25:25.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:25:25.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:25:25.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:25:26.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:25:26.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:25:26.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:25:26.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-29T02:25:26.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:25:26.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-29T02:25:26.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:25:26.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:25:26.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:25:26.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-29T02:25:28.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-29T02:25:28.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:25:28.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:25:28.876 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:25:28.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:25:28.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:25:28.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:25:28.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:25:28.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:25:28.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:25:28.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:25:28.901 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:25:28.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:25:29.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:25:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:25:29.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:25:29.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:25:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:25:29.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:25:29.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:25:29.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:25:29.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:25:29.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:25:29.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:25:29.290 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:25:11
2026-05-29T02:25:29.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70642, datetime.datetime(2026, 5, 29, 2, 25, 11), datetime.datetime(2026, 5, 29, 2, 25, 11), 'salt', 6.45, 87.98, None, 13.16, 130.93, 1.84, 832.17, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:25:29.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:25:29.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:25:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:11, diff=18.297315s, valid=True
2026-05-29T02:25:29.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:25:29.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:25:29.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:12, diff=17.300665s, valid=True
2026-05-29T02:25:29.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:25:29.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:06, diff=23.308507s, valid=True
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:25:29.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:25:29.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:25:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:12, diff=17.312118s, valid=True
2026-05-29T02:25:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:25:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:25:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:25:29.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=946971.312921s, valid=True
2026-05-29T02:25:29.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:25:29.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:25:29.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:25:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:25:29.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:25:29.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:25:29.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:25:29.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:25:29.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:25:29.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:25:29.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:25:29.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:25:29.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:25:29.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:25:29.843 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:25:30.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:25:30.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:25:30.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:25:30.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-29T02:25:30.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-29T02:25:30.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:25:30.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:26:00.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:26:00.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:26:00.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:26:01.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:26:01.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:26:01.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:26:01.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:26:01.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:26:01.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-29T02:26:01.274 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:26:01.274 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:26:01.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:26:01.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-29T02:26:03.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-29T02:26:03.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:26:03.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:26:03.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:26:03.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:26:03.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:26:03.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:26:03.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:26:03.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:26:03.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:26:03.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:26:03.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:26:03.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:26:03.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:26:03.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:26:03.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:26:03.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:26:03.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:26:03.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:26:03.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:26:03.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:26:03.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:26:03.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:26:03.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:26:04.045 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:25:42
2026-05-29T02:26:04.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70643, datetime.datetime(2026, 5, 29, 2, 25, 42), datetime.datetime(2026, 5, 29, 2, 25, 41), 'salt', 6.52, 88.05, None, 13.13, 123.56, 1.83, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:26:04.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:26:04.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:26:04.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:41, diff=23.052876s, valid=True
2026-05-29T02:26:04.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:26:04.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:26:04.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:12, diff=-7.943948s, valid=True
2026-05-29T02:26:04.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:26:04.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:25:36, diff=28.063445s, valid=True
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:26:04.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:26:04.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:12, diff=-7.933126s, valid=True
2026-05-29T02:26:04.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:26:04.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:26:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:26:04.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947006.067613s, valid=True
2026-05-29T02:26:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:26:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:26:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:26:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:26:04.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:26:04.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:26:04.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:26:04.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:26:04.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:26:04.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:26:04.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:26:04.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:26:04.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:26:04.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:26:04.590 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:26:04.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:26:05.027 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:26:05.027 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:26:05.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-29T02:26:05.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-29T02:26:05.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:26:05.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:26:35.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:26:35.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:26:35.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:26:35.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:26:35.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:26:35.768 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:26:35.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:26:35.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:26:35.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:26:35.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:26:35.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:26:35.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:26:35.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-29T02:26:38.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:26:38.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:26:38.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:26:38.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:26:38.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:26:38.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:26:38.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:26:38.716 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:26:38.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:26:38.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:26:38.716 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:26:38.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:26:38.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:26:38.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:26:38.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:26:38.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:26:38.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:26:38.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:26:38.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:26:38.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:26:38.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:26:38.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:26:38.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:26:38.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:26:39.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:26:12
2026-05-29T02:26:39.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70644, datetime.datetime(2026, 5, 29, 2, 26, 12), datetime.datetime(2026, 5, 29, 2, 26, 12), 'salt', 6.52, 87.98, None, 12.99, 119.29, 1.84, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:26:39.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:26:39.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:26:39.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:12, diff=27.04722s, valid=True
2026-05-29T02:26:39.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:26:39.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:26:39.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:12, diff=27.050022s, valid=True
2026-05-29T02:26:39.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:26:39.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:06, diff=33.056448s, valid=True
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:26:39.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:26:39.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:26:12, diff=27.059435s, valid=True
2026-05-29T02:26:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:26:39.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:26:39.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:26:39.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947041.060098s, valid=True
2026-05-29T02:26:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:26:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:26:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:26:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:26:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:26:39.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:26:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:26:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:26:39.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:26:39.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:26:39.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:26:39.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:26:39.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:26:39.396 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:26:39.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:26:40.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:26:40.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:26:40.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:26:40.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-29T02:26:40.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:26:40.330 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:26:40.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:27:10.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:27:10.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:27:10.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:27:10.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:27:10.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:27:10.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:27:10.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:27:10.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:27:10.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-29T02:27:10.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:27:10.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:27:10.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:27: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-29T02:27:13.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:27:13.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:27:13.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:27:13.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:27:13.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:27:13.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:27:13.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:27:13.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:27:13.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:27:13.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:27:13.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:27:13.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:27:13.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:27:13.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:27:13.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:27:13.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:27:13.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:27:13.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:27:13.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:27:13.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:27:13.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:27:13.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:27:13.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:27:13.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:27:13.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:27:13
2026-05-29T02:27:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70646, datetime.datetime(2026, 5, 29, 2, 27, 13), datetime.datetime(2026, 5, 29, 2, 27, 12), 'salt', 6.69, 88.05, None, 13.55, 122.57, 1.84, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:27:13.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:27:13.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:27:13.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:12, diff=1.977223s, valid=True
2026-05-29T02:27:13.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:27:13.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:27:13.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:12, diff=1.980652s, valid=True
2026-05-29T02:27:13.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:27:13.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:08, diff=5.988503s, valid=True
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:27:13.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:27:13.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:27:13.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:12, diff=1.992144s, valid=True
2026-05-29T02:27:13.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:27:13.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:27:13.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:27:13.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947075.99294s, valid=True
2026-05-29T02:27:13.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:27:13.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:27:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:27:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:27:13.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:27:14.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:27:14.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:27:14.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:27:14.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:27:14.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:27:14.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:27:14.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:27:14.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:27:14.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:27:14.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:27:14.869 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:27:14.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:27:14.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:27:14.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-29T02:27:14.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-29T02:27:15.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:27:15.207 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:27:45.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:27:45.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:27:45.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:27:45.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:27:45.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:27:45.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:27:45.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-29T02:27:45.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:27:45.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-29T02:27:45.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:27:45.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:27:45.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:27:45.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-29T02:27:48.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:27:48.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:27:48.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:27:48.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:27:48.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:27:48.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:27:48.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:27:48.247 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:27:48.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:27:48.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:27:48.248 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:27:48.248 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:27:48.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:27:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:27:48.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:27:48.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:27:48.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:27:48.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:27:48.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:27:48.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:27:48.558 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:27:48.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:27:48.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:27:48.563 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:27:48.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:27:43
2026-05-29T02:27:48.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70647, datetime.datetime(2026, 5, 29, 2, 27, 43), datetime.datetime(2026, 5, 29, 2, 27, 42), 'salt', 6.55, 87.95, None, 13.27, 122.08, 1.84, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:27:48.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:27:48.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:27:48.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:42, diff=6.629454s, valid=True
2026-05-29T02:27:48.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:27:48.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:27:48.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:12, diff=-23.367091s, valid=True
2026-05-29T02:27:48.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:27:48.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:27:48.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:27:40, diff=8.640792s, valid=True
2026-05-29T02:27:48.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:27:48.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:27:48.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:27:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:27:48.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:27:48.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:27:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:12, diff=-23.35561s, valid=True
2026-05-29T02:27:48.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:27:48.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:27:48.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:27:48.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947110.645198s, valid=True
2026-05-29T02:27:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:27:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:27:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:27:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:27:48.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:27:48.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:27:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:27:48.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:27:48.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:27:48.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:27:48.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:27:48.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:27:48.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:27:49.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:27:49.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:27:49.576 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:27:49.679 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:27:49.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:27:49.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-29T02:27:49.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-29T02:27:49.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:27:49.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:28:19.915 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:28:19.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:28:19.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:28:20.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:28:20.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:28:20.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:28:20.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-29T02:28:20.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:28:20.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:28:20.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:28:20.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:28:20.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:28:20.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-29T02:28:22.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-29T02:28:22.880 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:28:22.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:28:22.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:28:22.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:28:22.900 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:28:22.912 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:28:22.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:28:22.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:28:22.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:28:22.914 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:28:22.914 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:28:22.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:28:23.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:28:23.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:28:23.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:28:23.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:28:23.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:28:23.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:28:23.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:28:23.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:28:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:28:23.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:28:23.236 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:28:23.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:28:13
2026-05-29T02:28:23.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70648, datetime.datetime(2026, 5, 29, 2, 28, 13), datetime.datetime(2026, 5, 29, 2, 28, 13), 'salt', 6.65, 88.08, None, 13.45, 122.88, 1.82, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:28:23.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:28:23.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:28:23.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:13, diff=10.303034s, valid=True
2026-05-29T02:28:23.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:28:23.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:28:23.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:12, diff=11.306492s, valid=True
2026-05-29T02:28:23.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:28:23.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:28:23.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:11, diff=12.314636s, valid=True
2026-05-29T02:28:23.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:28:23.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:28:23.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:28:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:28:23.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:28:23.315 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:28:23.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:12, diff=11.318321s, valid=True
2026-05-29T02:28:23.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:28:23.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:28:23.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:28:23.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947145.319141s, valid=True
2026-05-29T02:28:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:28:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:28:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:28:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:28:23.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:28:23.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:28:23.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:28:23.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:28:23.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:28:23.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:28:23.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:28:23.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:28:23.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:28:23.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:28:23.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:28:24.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:28:24.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:28:24.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:28:24.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-29T02:28:24.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:28:24.368 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:28:24.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:28:54.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:28:54.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:28:54.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:28:55.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:28:55.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:28:55.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:28:55.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-29T02:28:55.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:28:55.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-29T02:28:55.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:28:55.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:28:55.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:28:55.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:28:57.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-29T02:28:57.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:28:57.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:28:57.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:28:57.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:28:58.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:28:58.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:28:58.017 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:28:58.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:28:58.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:28:58.018 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:28:58.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:28:58.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:28:58.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:28:58.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:28:58.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:28:58.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:28:58.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:28:58.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:28:58.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:28:58.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:28:58.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:28:58.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:28:58.281 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:28:58.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:28:43
2026-05-29T02:28:58.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70649, datetime.datetime(2026, 5, 29, 2, 28, 43), datetime.datetime(2026, 5, 29, 2, 28, 42), 'salt', 6.65, 88.08, None, 13.13, 125.95, 1.82, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:28:58.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:28:58.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:28:58.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:42, diff=16.345961s, valid=True
2026-05-29T02:28:58.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:28:58.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:28:58.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:12, diff=-13.650867s, valid=True
2026-05-29T02:28:58.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:28:58.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:28:43, diff=15.356492s, valid=True
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:28:58.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:28:58.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:28:58.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:12, diff=-13.640121s, valid=True
2026-05-29T02:28:58.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:28:58.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:28:58.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:28:58.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947180.360611s, valid=True
2026-05-29T02:28:58.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:28:58.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:28:58.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:28:58.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:28:58.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:28:58.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:28:58.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:28:58.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:28:58.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:28:58.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:28:58.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:28:58.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:28:58.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:28:58.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:28:58.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:28:59.283 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:28:59.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:28:59.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:28:59.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-29T02:28:59.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-29T02:28:59.594 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:28:59.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:29:29.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:29:29.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:29:29.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:29:29.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:29:29.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:29:30.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:29:30.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:29:30.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:29:30.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-29T02:29:30.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:29:30.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:29:30.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:29:30.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-29T02:29:32.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-29T02:29:32.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:29:32.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:29:32.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:29:32.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:29:32.924 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:29:32.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:29:32.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:29:32.938 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:29:32.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:29:32.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:29:32.939 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:29:32.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:29:33.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:29:33.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:29:33.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:29:33.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:29:33.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:29:33.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:29:33.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:29:33.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:29:33.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:29:33.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:29:33.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:29:33.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:29:14
2026-05-29T02:29:33.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70650, datetime.datetime(2026, 5, 29, 2, 29, 14), datetime.datetime(2026, 5, 29, 2, 29, 13), 'salt', 6.59, 88.02, None, 13.45, 123.51, 1.84, 832.11, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:29:33.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:29:33.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:29:33.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:13, diff=20.336361s, valid=True
2026-05-29T02:29:33.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:29:33.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:29:33.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:12, diff=21.339857s, valid=True
2026-05-29T02:29:33.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:29:33.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:29:33.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:08, diff=25.347899s, valid=True
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:29:33.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:29:33.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:12, diff=21.35159s, valid=True
2026-05-29T02:29:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:29:33.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:29:33.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:29:33.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947215.352412s, valid=True
2026-05-29T02:29:33.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:29:33.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:29:33.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:29:33.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:29:33.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:29:33.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:29:33.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:29:33.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:29:33.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:29:33.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:29:33.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:29:33.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:29:33.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:29:33.674 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:29:33.875 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:29:34.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:29:34.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:29:34.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:29:34.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-29T02:29:34.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-29T02:29:34.404 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:29:34.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:30:04.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:30:04.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:30:04.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:30:04.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:30:04.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:30:04.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:30:04.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-29T02:30:04.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:30:04.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-29T02:30:04.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:30:04.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:30:04.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:30:04.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-29T02:30:07.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:30:07.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:30:07.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:30:07.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:30:07.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:30:07.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:30:07.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:30:07.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:30:07.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:30:07.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:30:07.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:30:07.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:30:07.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:30:07.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:30:07.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:30:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:30:07.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:30:07.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:30:07.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:30:07.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:30:07.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:30:07.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:30:07.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:30:07.982 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:30:08.041 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:29:44
2026-05-29T02:30:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70651, datetime.datetime(2026, 5, 29, 2, 29, 44), datetime.datetime(2026, 5, 29, 2, 29, 43), 'salt', 6.52, 88.02, None, 13.48, 121.66, 1.84, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:30:08.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:30:08.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:30:08.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:43, diff=25.049002s, valid=True
2026-05-29T02:30:08.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:30:08.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:30:08.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:12, diff=-3.947555s, valid=True
2026-05-29T02:30:08.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:30:08.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:30:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:29:38, diff=30.06069s, valid=True
2026-05-29T02:30:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:30:08.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:30:08.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:30:08.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:30:08.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:30:08.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:30:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:12, diff=-3.935655s, valid=True
2026-05-29T02:30:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:30:08.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:30:08.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:30:08.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947250.065152s, valid=True
2026-05-29T02:30:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:30:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:30:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:30:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:30:08.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:30:08.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:30:08.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:30:08.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:30:08.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:30:08.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:30:08.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:30:08.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:30:08.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:30:08.454 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:30:08.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:30:09.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:30:09.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:30:09.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:30:09.111 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:30:09.111 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:30:09.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:30:09.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:30:39.302 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:30:39.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:30:39.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:30:39.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:30:39.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:30:39.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:30:39.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-29T02:30:39.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:30:39.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-29T02:30:39.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:30:39.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:30:39.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:30:39.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-29T02:30:42.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-29T02:30:42.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:30:42.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:30:42.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:30:42.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:30:42.308 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:30:42.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:30:42.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:30:42.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:30:42.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:30:42.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:30:42.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:30:42.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:30:42.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:30:42.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:30:42.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:30:42.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:30:42.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:30:42.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:30:42.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:30:42.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:30:42.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:30:42.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:30:42.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:30:42.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:30:14
2026-05-29T02:30:42.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70652, datetime.datetime(2026, 5, 29, 2, 30, 14), datetime.datetime(2026, 5, 29, 2, 30, 14), 'salt', 6.49, 88.05, None, 13.69, 123.84, 1.83, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:30:42.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:30:42.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:30:42.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:14, diff=28.707225s, valid=True
2026-05-29T02:30:42.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:30:42.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:30:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:12, diff=30.710592s, valid=True
2026-05-29T02:30:42.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:30:42.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:30:42.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:08, diff=34.7186s, valid=True
2026-05-29T02:30:42.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:30:42.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:30:42.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:30:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:30:42.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:30:42.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:30:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:30:12, diff=30.722252s, valid=True
2026-05-29T02:30:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:30:42.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:30:42.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:30:42.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947284.723053s, valid=True
2026-05-29T02:30:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:30:42.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:30:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:30:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:30:42.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:30:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:30:42.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:30:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:30:42.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:30:42.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:30:42.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:30:42.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:30:43.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:30:43.045 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:30:43.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:30:43.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:30:43.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:30:43.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:30:43.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-29T02:30:43.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-29T02:30:43.857 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:30:43.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:31:13.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:31:13.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:31:13.859 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:31:14.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:31:14.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:31:14.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:31:14.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-29T02:31:14.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:31:14.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-29T02:31:14.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:31:14.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:31:14.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:31:14.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-29T02:31:17.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:31:17.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:31:17.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:31:17.084 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:31:17.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:31:17.096 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:31:17.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:31:17.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:31:17.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:31:17.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:31:17.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:31:17.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:31:17.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:31:17.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:31:17.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:31:17.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:31:17.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:31:17.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:31:17.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:31:17.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T02:31:17.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:31:17.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:31:17.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:31:17.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:31:17.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:31:15
2026-05-29T02:31:17.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70654, datetime.datetime(2026, 5, 29, 2, 31, 15), datetime.datetime(2026, 5, 29, 2, 31, 14), 'salt', 6.39, 88.08, None, 12.67, 126.38, 1.83, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:31:17.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:31:17.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:31:17.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:14, diff=3.506507s, valid=True
2026-05-29T02:31:17.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:31:17.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:31:17.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:12, diff=5.509848s, valid=True
2026-05-29T02:31:17.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:31:17.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:31:17.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:10, diff=7.517614s, valid=True
2026-05-29T02:31:17.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:31:17.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:31:17.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:31:17.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:31:17.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:31:17.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T02:31:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:12, diff=5.52118s, valid=True
2026-05-29T02:31:17.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:31:17.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:31:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:31:17.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947319.521967s, valid=True
2026-05-29T02:31:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:31:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:31:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:31:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:31:17.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:31:17.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:31:17.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:31:17.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:31:17.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:31:17.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:31:17.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:31:17.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:31:17.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:31:17.843 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:31:18.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:31:18.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:31:18.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:31:18.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:31:18.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-29T02:31:18.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-29T02:31:18.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:31:18.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:31:48.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:31:48.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:31:48.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:31:48.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:31:48.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:31:49.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:31:49.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:31:49.072 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:31:49.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-29T02:31:49.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:31:49.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:31:49.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:31:49.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-29T02:31:51.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-29T02:31:51.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:31:51.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:31:51.786 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:31:51.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:31:51.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:31:51.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:31:51.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:31:51.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:31:51.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:31:51.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:31:51.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:31:51.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:31:51.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:31:51.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:31:52.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:31:52.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:31:52.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:31:52.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:31:52.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:31:52.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:31:52.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:31:52.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:31:52.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:31:52.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:31:45
2026-05-29T02:31:52.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70655, datetime.datetime(2026, 5, 29, 2, 31, 45), datetime.datetime(2026, 5, 29, 2, 31, 44), 'salt', 6.45, 88.21, None, 12.67, 125.77, 1.8, 832.05, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:31:52.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:31:52.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:31:52.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:44, diff=8.195799s, valid=True
2026-05-29T02:31:52.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:31:52.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:31:52.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:12, diff=-19.800784s, valid=True
2026-05-29T02:31:52.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:31:52.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:31:41, diff=11.207081s, valid=True
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:31:52.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:31:52.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:12, diff=-19.789322s, valid=True
2026-05-29T02:31:52.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:31:52.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:31:52.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:31:52.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947354.211483s, valid=True
2026-05-29T02:31:52.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:31:52.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:31:52.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:31:52.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:31:52.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:31:52.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:31:52.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:31:52.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:31:52.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:31:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:31:52.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:31:52.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:31:52.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:31:52.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:31:52.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:31:53.091 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:31:53.252 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:31:53.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:31:53.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-29T02:31:53.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-29T02:31:53.436 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:31:53.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:32:23.454 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:32:23.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:32:23.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:32:23.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:32:23.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:32:23.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:32:23.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-29T02:32:23.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:32:23.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-29T02:32:24.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:32:24.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:32:24.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:32:24.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-29T02:32:26.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-29T02:32:26.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:32:26.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:32:26.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:32:26.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:32:26.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:32:26.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:32:26.512 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:32:26.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:32:26.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:32:26.513 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:32:26.513 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:32:26.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:32:26.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:32:26.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:32:26.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:32:26.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:32:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:32:26.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:32:26.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T02:32:26.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:32:26.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:32:26.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:32:26.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:32:26.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:32:15
2026-05-29T02:32:26.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70656, datetime.datetime(2026, 5, 29, 2, 32, 15), datetime.datetime(2026, 5, 29, 2, 32, 15), 'salt', 6.39, 88.25, None, 12.18, 124.55, 1.8, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:32:26.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:32:26.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:32:26.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:15, diff=11.916206s, valid=True
2026-05-29T02:32:26.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:32:26.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:32:26.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:12, diff=14.919561s, valid=True
2026-05-29T02:32:26.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:32:26.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:13, diff=13.927323s, valid=True
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:32:26.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T02:32:26.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:12, diff=14.930872s, valid=True
2026-05-29T02:32:26.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:32:26.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:32:26.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:32:26.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947388.931654s, valid=True
2026-05-29T02:32:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:32:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:32:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:32:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:32:26.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:32:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:32:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:32:26.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:32:27.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:32:27.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:32:27.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:32:27.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:32:27.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:32:27.253 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:32:27.457 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:32:27.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:32:27.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:32:27.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:32:27.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-29T02:32:27.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-29T02:32:28.064 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:32:28.064 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:32:58.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:32:58.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:32: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-29T02:32:58.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:32:58.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:32:58.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:32:58.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-29T02:32:58.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:32:58.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-29T02:32:58.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:32:58.810 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:32:58.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:32:58.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-29T02:33:01.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-29T02:33:01.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:33:01.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:33:01.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:33:01.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:33:01.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:33:01.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:33:01.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:33:01.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:33:01.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:33:01.276 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:33:01.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:33:01.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:33:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:33:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:33:01.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:33:01.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:33:01.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:33:01.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:33:01.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:33:01.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:33:01.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:33:01.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:33:01.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:33:01.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:32:45
2026-05-29T02:33:01.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70657, datetime.datetime(2026, 5, 29, 2, 32, 45), datetime.datetime(2026, 5, 29, 2, 32, 45), 'salt', 6.35, 88.28, None, 11.61, 121.4, 1.79, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:33:01.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:33:01.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:33:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:45, diff=16.703979s, valid=True
2026-05-29T02:33:01.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:33:01.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:33:01.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:12, diff=-10.292556s, valid=True
2026-05-29T02:33:01.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:33:01.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:33:01.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:32:44, diff=17.715536s, valid=True
2026-05-29T02:33:01.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:33:01.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:33:01.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:33:01.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:33:01.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:33:01.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:33:01.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:12, diff=-10.280706s, valid=True
2026-05-29T02:33:01.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:33:01.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:33:01.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:33:01.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947423.720831s, valid=True
2026-05-29T02:33:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:33:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:33:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:33:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:33:01.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:33:01.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:33:01.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:33:01.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:33:01.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:33:01.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:33:01.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:33:01.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:33:02.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:33:02.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:33:02.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:33:02.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:33:02.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:33:02.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:33:02.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-29T02:33:02.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-29T02:33:03.741 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:33:03.742 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:33:33.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:33:33.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:33:33.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:33:34.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:33:34.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:33:34.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:33:34.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-29T02:33:34.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:33:34.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-29T02:33:34.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:33:34.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:33:34.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:33:34.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-29T02:33:37.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-29T02:33:37.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:33:37.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:33:37.118 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:33:37.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:33:37.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:33:37.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:33:37.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:33:37.144 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:33:37.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:33:37.144 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:33:37.145 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:33:37.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:33:37.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:33:37.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:33:37.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:33:37.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:33:37.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:33:37.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:33:37.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T02:33:37.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:33:37.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:33:37.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:33:37.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:33:37.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:33:16
2026-05-29T02:33:37.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70658, datetime.datetime(2026, 5, 29, 2, 33, 16), datetime.datetime(2026, 5, 29, 2, 33, 15), 'salt', 6.29, 88.28, None, 12.18, 121.26, 1.79, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:33:37.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:33:37.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:33:37.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:15, diff=22.573021s, valid=True
2026-05-29T02:33:37.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:33:37.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:33:37.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:12, diff=25.57638s, valid=True
2026-05-29T02:33:37.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:33:37.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:15, diff=22.584307s, valid=True
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:33:37.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T02:33:37.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:12, diff=25.587928s, valid=True
2026-05-29T02:33:37.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:33:37.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:33:37.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:33:37.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947459.588932s, valid=True
2026-05-29T02:33:37.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:33:37.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:33:37.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:33:37.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:33:37.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:33:37.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:33:37.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:33:37.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:33:37.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:33:37.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:33:37.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:33:37.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:33:37.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:33:37.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:33:38.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:33:38.464 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:33:38.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:33:38.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:33:38.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-29T02:33:38.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-29T02:33:38.811 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:33:38.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:34:08.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:34:08.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:34:08.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:34:09.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:34:09.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:34:09.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:34:09.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-29T02:34:09.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:34: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-29T02:34:09.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:34:09.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:34:09.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:34: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-29T02:34:11.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:34:11.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:34:11.583 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:34:11.584 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:34:11.584 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:34:11.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:34:11.608 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:34:11.609 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:34:11.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:34:11.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:34:11.610 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:34:11.610 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:34:11.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:34:11.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:34:11.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:34:11.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:34:11.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:34:11.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:34:11.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:34:11.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:34:11.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:34:11.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:34:11.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:34:11.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:34:12.011 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:33:46
2026-05-29T02:34:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70659, datetime.datetime(2026, 5, 29, 2, 33, 46), datetime.datetime(2026, 5, 29, 2, 33, 46), 'salt', 6.39, 88.41, None, 13.02, 120.69, 1.77, 831.99, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:34:12.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:34:12.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:34:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:46, diff=26.018688s, valid=True
2026-05-29T02:34:12.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:34:12.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:34:12.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:12, diff=0.022255s, valid=True
2026-05-29T02:34:12.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:34:12.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:33:40, diff=32.030462s, valid=True
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:34:12.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:34:12.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:34:12.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:12, diff=0.034231s, valid=True
2026-05-29T02:34:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:34:12.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:34:12.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:34:12.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947494.035079s, valid=True
2026-05-29T02:34:12.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:34:12.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:34:12.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:34:12.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:34:12.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:34:12.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:34:12.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:34:12.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:34:12.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:34:12.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:34:12.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:34:12.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:34:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:34:12.360 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:34:12.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:34:12.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:34:13.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:34:13.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:34:13.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-29T02:34:13.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-29T02:34:13.258 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:34:13.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:34:43.288 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:34:43.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:34: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-29T02:34:43.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:34:43.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:34:43.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:34:43.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-29T02:34:43.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:34:43.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-29T02:34:43.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:34:43.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:34:43.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:34:43.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:34: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-29T02:34:46.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:34:46.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:34:46.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:34:46.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:34:46.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:34:46.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:34:46.362 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:34:46.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:34:46.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:34:46.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:34:46.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:34:46.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:34:46.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:34:46.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:34:46.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:34:46.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:34:46.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:34:46.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:34:46.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T02:34:46.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:34:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:34:46.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:34:46.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:34:46.766 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:34:17
2026-05-29T02:34:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70660, datetime.datetime(2026, 5, 29, 2, 34, 17), datetime.datetime(2026, 5, 29, 2, 34, 16), 'salt', 6.39, 88.42, None, 12.85, 120.95, 1.77, 832.18, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:34:46.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:34:46.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:34:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:16, diff=30.774395s, valid=True
2026-05-29T02:34:46.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:34:46.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:34:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:12, diff=34.77799s, valid=True
2026-05-29T02:34:46.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:34:46.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:10, diff=36.786198s, valid=True
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:34:46.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T02:34:46.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:34:12, diff=34.790029s, valid=True
2026-05-29T02:34:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:34:46.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:34:46.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:34:46.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947528.790862s, valid=True
2026-05-29T02:34:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:34:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:34:46.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:34:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:34:46.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:34:46.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:34:46.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:34:46.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:34:46.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:34:46.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:34:46.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:34:47.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:34:47.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:34:47.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:34:47.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:34:47.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:34:47.771 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:34:47.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:34:47.772 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:34:47.772 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:34:48.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:34:48.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:35:18.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:35:18.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:35:18.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:35:18.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:35:18.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:35:18.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:35: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-29T02:35:18.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:35:18.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-29T02:35:18.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:35:18.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:35:18.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:35:18.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-29T02:35:21.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-29T02:35:21.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:35:21.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:35:21.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:35:21.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:35:21.183 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:35:21.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:35:21.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:35:21.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:35:21.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:35:21.197 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:35:21.197 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:35:21.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:35:21.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:35:21.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:35:21.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:35:21.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:35:21.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:35:21.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:35:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:35:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:35:21.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:35:21.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:35:21.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:35:21.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:35:17
2026-05-29T02:35:21.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70662, datetime.datetime(2026, 5, 29, 2, 35, 17), datetime.datetime(2026, 5, 29, 2, 35, 17), 'salt', 6.29, 88.32, None, 13.59, 121.66, 1.79, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:35:21.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:35:21.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:35:21.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:17, diff=4.609594s, valid=True
2026-05-29T02:35:21.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:35:21.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:35:21.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:12, diff=9.613115s, valid=True
2026-05-29T02:35:21.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:35:21.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:35:21.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:11, diff=10.621536s, valid=True
2026-05-29T02:35:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:35:21.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:35:21.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:35:21.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:35:21.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:35:21.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:35:21.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:12, diff=9.625286s, valid=True
2026-05-29T02:35:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:35:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:35:21.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:35:21.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947563.6261s, valid=True
2026-05-29T02:35:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:35:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:35:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:35:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:35:21.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:35:21.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:35:21.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:35:21.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:35:21.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:35:21.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:35:21.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:35:21.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:35:22.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:35:22.068 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:35:22.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:35:22.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:35:22.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:35:22.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:35:22.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-29T02:35:22.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-29T02:35:22.896 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:35:22.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:35:52.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:35:52.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:35: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-29T02:35:53.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:35:53.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:35:53.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:35:53.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:35:53.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:35:53.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-29T02:35:53.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:35:53.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:35:53.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:35:53.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-29T02:35:55.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-29T02:35:55.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:35:56.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:35:56.005 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:35:56.005 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:35:56.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:35:56.029 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:35:56.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:35:56.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:35:56.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:35:56.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:35:56.031 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:35:56.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:35:56.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:35:56.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:35:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:35:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:35:56.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:35:56.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:35:56.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:35:56.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:35:56.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:35:56.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:35:56.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:35:56.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:35:47
2026-05-29T02:35:56.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70663, datetime.datetime(2026, 5, 29, 2, 35, 47), datetime.datetime(2026, 5, 29, 2, 35, 47), 'salt', 6.29, 88.28, None, 13.06, 120.72, 1.79, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:35:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:35:56.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:35:56.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:47, diff=9.464324s, valid=True
2026-05-29T02:35:56.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:35:56.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:35:56.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:12, diff=-15.53212s, valid=True
2026-05-29T02:35:56.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:35:56.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:35:43, diff=13.47606s, valid=True
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:35:56.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:35:56.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:12, diff=-15.520158s, valid=True
2026-05-29T02:35:56.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:35:56.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:35:56.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:35:56.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947598.480663s, valid=True
2026-05-29T02:35:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:35:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:35:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:35:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:35:56.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:35:56.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:35:56.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:35:56.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:35:56.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:35:56.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:35:56.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:35:56.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:35:56.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:35:56.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:35:57.007 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:35:57.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:35:57.442 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:35:57.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:35:57.443 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:35:57.443 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:35:57.619 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:35:57.619 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:36:27.649 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:36:27.649 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:36:27.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:36:28.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:36:28.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:36:28.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:36:28.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-29T02:36:28.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:36:28.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-29T02:36:28.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:36:28.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:36:28.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:36:28.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-29T02:36:30.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:36:30.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:36:30.821 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:36:30.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:36:30.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:36:30.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:36:30.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:36:30.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:36:30.841 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:36:30.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:36:30.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:36:30.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:36:30.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:36:30.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:36:30.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:36:31.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:36:31.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:36:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:36:31.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:36:31.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:36:31.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:36:31.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:36:31.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:36:31.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:36:31.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:36:18
2026-05-29T02:36:31.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70664, datetime.datetime(2026, 5, 29, 2, 36, 18), datetime.datetime(2026, 5, 29, 2, 36, 17), 'salt', 6.39, 88.45, None, 13.27, 121.4, 1.77, 832.12, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:36:31.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:36:31.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:36:31.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:17, diff=14.229517s, valid=True
2026-05-29T02:36:31.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:36:31.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:36:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:12, diff=19.232605s, valid=True
2026-05-29T02:36:31.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:36:31.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:36:31.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:14, diff=17.239687s, valid=True
2026-05-29T02:36:31.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:36:31.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:36:31.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:36:31.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:36:31.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:36:31.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:36:31.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:12, diff=19.243001s, valid=True
2026-05-29T02:36:31.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:36:31.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:36:31.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:36:31.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947633.243757s, valid=True
2026-05-29T02:36:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:36:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:36:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:36:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:36:31.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:36:31.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:36:31.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:36:31.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:36:31.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:36:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:36:31.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:36:31.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:36:31.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:36:31.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:36:31.845 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:36:32.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:36:32.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:36:32.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:36: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-29T02:36: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-29T02:36:32.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:36:32.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:37:02.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:37:02.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:37:02.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:37:03.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:37:03.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:37:03.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:37:03.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-29T02:37:03.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:37:03.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:37:03.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:37:03.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:37:03.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:37:03.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-29T02:37:05.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-29T02:37:05.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:37:05.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:37:05.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:37:05.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:37:05.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:37:05.794 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:37:05.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:37:05.795 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:37:05.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:37:05.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:37:05.796 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:37:05.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:37:05.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:37:05.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:37:06.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:37:06.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:37:06.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:37:06.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:37:06.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:37:06.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:37:06.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:37:06.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:37:06.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:37:06.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:36:48
2026-05-29T02:37:06.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70665, datetime.datetime(2026, 5, 29, 2, 36, 48), datetime.datetime(2026, 5, 29, 2, 36, 47), 'salt', 6.36, 88.38, None, 13.69, 120.06, 1.78, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:37:06.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:37:06.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:37:06.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:47, diff=19.214991s, valid=True
2026-05-29T02:37:06.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:37:06.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:37:06.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:12, diff=-5.781515s, valid=True
2026-05-29T02:37:06.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:37:06.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:37:06.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:36:46, diff=20.226536s, valid=True
2026-05-29T02:37:06.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:37:06.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:37:06.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:37:06.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:37:06.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:37:06.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:37:06.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:12, diff=-5.76975s, valid=True
2026-05-29T02:37:06.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:37:06.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:37:06.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:37:06.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947668.231087s, valid=True
2026-05-29T02:37:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:37:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:37:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:37:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:37:06.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:37:06.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:37:06.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:37:06.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:37:06.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:37:06.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:37:06.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:37:06.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:37:06.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:37:06.557 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:37:06.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:37:07.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:37:07.201 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:37:07.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:37:07.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-29T02:37:07.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-29T02:37:09.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:37:09.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:37:39.272 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:37:39.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:37:39.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:37:39.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:37:39.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:37:39.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:37:39.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-29T02:37:39.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:37:39.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-29T02:37:39.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:37:39.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:37:39.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:37:39.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-29T02:37:43.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-29T02:37:43.244 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:37:43.252 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:37:43.253 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:37:43.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:37:43.261 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:37:43.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:37:43.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:37:43.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:37:43.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:37:43.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:37:43.276 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:37:43.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:37:43.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:37:43.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:37:43.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:37:43.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:37:43.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:37:43.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:37:43.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:37:43.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:37:43.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:37:43.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:37:43.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:37:43.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:37:18
2026-05-29T02:37:43.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70666, datetime.datetime(2026, 5, 29, 2, 37, 18), datetime.datetime(2026, 5, 29, 2, 37, 18), 'salt', 6.45, 88.58, None, 13.41, 121.02, 1.74, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:37:43.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:37:43.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:37:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:18, diff=25.687397s, valid=True
2026-05-29T02:37:43.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:37:43.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:37:43.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:12, diff=31.690884s, valid=True
2026-05-29T02:37:43.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:37:43.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:37:43.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:17, diff=26.698923s, valid=True
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:37:43.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:37:43.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:12, diff=31.702642s, valid=True
2026-05-29T02:37:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:37:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:37:43.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:37:43.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947705.703451s, valid=True
2026-05-29T02:37:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:37:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:37:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:37:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:37:43.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:37:43.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:37:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:37:43.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:37:43.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:37:43.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:37:43.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:37:43.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:37:43.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:37:44.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:37:44.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:37:44.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:37:44.654 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:37:44.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:37:44.654 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:37:44.654 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:37:44.754 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:37:44.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:38:14.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:38:14.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:38:14.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:38:15.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:38:15.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:38:15.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:38:15.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-29T02:38:15.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:38:15.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-29T02:38:15.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:38:15.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:38:15.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:38:15.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-29T02:38:17.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-29T02:38:17.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:38:17.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:38:17.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:38:17.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:38:17.733 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:38:17.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:38:17.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:38:17.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:38:17.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:38:17.748 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:38:17.748 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:38:17.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:38:17.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:38:17.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:38:17.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:38:17.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:38:18.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:38:18.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:38:18.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:38:18.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:38:18.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:38:18.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:38:18.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:38:18.137 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:37:48
2026-05-29T02:38:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70667, datetime.datetime(2026, 5, 29, 2, 37, 48), datetime.datetime(2026, 5, 29, 2, 37, 48), 'salt', 6.32, 88.42, None, 13.94, 119.85, 1.77, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:38:18.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:38:18.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:38:18.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:48, diff=30.145296s, valid=True
2026-05-29T02:38:18.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:38:18.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:38:18.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:38:12, diff=6.14871s, valid=True
2026-05-29T02:38:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:38:18.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:38:18.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:37:42, diff=36.156721s, valid=True
2026-05-29T02:38:18.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:38:18.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:38:18.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:38:18.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:38:18.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:38:18.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:38:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:38:12, diff=6.160338s, valid=True
2026-05-29T02:38:18.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:38:18.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:38:18.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:38:18.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947740.161137s, valid=True
2026-05-29T02:38:18.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:38:18.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:38:18.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:38:18.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:38:18.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:38:18.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:38:18.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:38:18.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:38:18.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:38:18.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:38:18.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:38:18.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:38:18.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:38:18.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:38:18.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:38:19.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:38:19.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:38:19.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:38:19.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-29T02:38:19.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-29T02:38:19.372 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:38:19.372 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:38:49.380 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:38:49.380 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:38:49.380 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:38:49.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:38:49.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:38:50.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:38:50.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:38:50.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:38:50.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-29T02:38:50.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:38:50.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:38:50.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:38:50.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-29T02:38:52.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-29T02:38:52.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:38:52.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:38:52.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:38:52.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:38:52.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:38:52.793 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:38:52.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:38:52.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:38:52.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:38:52.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:38:52.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:38:52.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:38:52.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:38:52.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:38:52.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:38:52.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:38:53.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:38:53.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:38:53.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:38:53.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:38:53.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:38:53.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:38:53.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:38:53.142 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:38:49
2026-05-29T02:38:53.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70669, datetime.datetime(2026, 5, 29, 2, 38, 49), datetime.datetime(2026, 5, 29, 2, 38, 48), 'salt', 6.42, 88.22, None, 13.94, 123.37, 1.8, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:38:53.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:38:53.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:38:53.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:38:48, diff=5.154045s, valid=True
2026-05-29T02:38:53.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:38:53.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:38:53.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:12, diff=-18.842209s, valid=True
2026-05-29T02:38:53.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:38:53.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:38:43, diff=10.165067s, valid=True
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:38:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:38:53.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:12, diff=-18.831465s, valid=True
2026-05-29T02:38:53.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:38:53.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:38:53.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:38:53.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947775.169292s, valid=True
2026-05-29T02:38:53.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:38:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:38:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:38:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:38:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:38:53.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:38:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:38:53.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:38:53.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:38:53.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:38:53.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:38:53.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:38:53.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:38:53.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:38:53.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:38:54.011 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:38:54.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:38:54.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:38:54.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-29T02:38:54.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-29T02:38:54.299 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:38:54.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:39:24.307 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:39:24.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:39:24.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:39:24.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:39:24.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:39:24.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:39:24.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-29T02:39:24.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:39:24.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-29T02:39:24.720 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:39:24.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:39:24.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:39:24.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-29T02:39:27.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-29T02:39:27.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:39:27.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:39:27.164 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:39:27.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:39:27.175 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:39:27.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:39:27.183 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:39:27.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:39:27.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:39:27.184 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:39:27.185 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:39:27.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:39:27.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:39:27.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:39:27.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:39:27.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:39:27.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:39:27.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:39:27.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:39:27.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:39:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:39:27.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:39:27.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:39:27.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:39:19
2026-05-29T02:39:27.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70670, datetime.datetime(2026, 5, 29, 2, 39, 19), datetime.datetime(2026, 5, 29, 2, 39, 19), 'salt', 6.49, 88.35, None, 13.34, 119.45, 1.78, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:39:27.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:39:27.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:39:27.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:19, diff=8.524189s, valid=True
2026-05-29T02:39:27.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:39:27.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:39:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:12, diff=15.527274s, valid=True
2026-05-29T02:39:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:39:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:13, diff=14.534461s, valid=True
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:39:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:39:27.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:12, diff=15.537736s, valid=True
2026-05-29T02:39:27.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:39:27.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:39:27.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:39:27.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947809.538447s, valid=True
2026-05-29T02:39:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:39:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:39:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:39:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:39:27.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:39:27.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:39:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:39:27.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:39:27.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:39:27.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:39:27.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:39:27.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:39:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:39:27.860 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:39:28.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:39:28.461 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:39:28.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:39:28.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:39:28.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-29T02:39:28.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-29T02:39:28.778 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:39:28.778 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:39:58.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:39:58.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:39:58.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:39:59.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:39:59.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:39:59.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:39:59.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-29T02:39:59.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:39:59.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-29T02:39:59.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:39:59.366 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:39:59.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:39:59.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-29T02:40:01.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-29T02:40:01.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:40:01.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:40:01.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:40:01.897 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:40:01.906 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:40:01.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:40:01.919 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:40:01.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:40:01.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:40:01.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:40:01.920 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:40:01.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:40:02.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:40:02.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:40:02.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:40:02.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:40:02.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:40:02.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:40:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:40:02.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:40:02.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:40:02.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:40:02.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:40:02.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:39:50
2026-05-29T02:40:02.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70671, datetime.datetime(2026, 5, 29, 2, 39, 50), datetime.datetime(2026, 5, 29, 2, 39, 49), 'salt', 6.52, 88.18, None, 12.1, 124.1, 1.81, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:40:02.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:40:02.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:40:02.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:49, diff=13.257036s, valid=True
2026-05-29T02:40:02.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:40:02.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:40:02.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:12, diff=-9.739756s, valid=True
2026-05-29T02:40:02.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:40:02.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:39:44, diff=18.267472s, valid=True
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:40:02.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:40:02.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:12, diff=-9.729104s, valid=True
2026-05-29T02:40:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:40:02.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:40:02.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:40:02.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947844.271635s, valid=True
2026-05-29T02:40:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:40:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:40:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:40:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:40:02.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:40:02.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:40:02.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:40:02.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:40:02.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:40:02.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:40:02.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:40:02.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:40:02.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:40:02.597 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:40:02.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:40:03.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:40:03.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:40:03.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:40:03.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-29T02:40:03.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-29T02:40:03.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:40:03.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:40:33.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:40:33.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:40:33.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:40:33.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:40:33.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:40:34.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:40:34.121 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:40:34.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:40:34.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-29T02:40:34.148 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:40:34.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:40:34.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:40:34.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-29T02:40:36.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-29T02:40:36.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:40:36.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:40:36.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:40:36.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:40:36.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:40:36.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:40:36.607 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:40:36.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:40:36.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:40:36.608 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:40:36.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:40:36.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:40:36.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:40:36.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:40:36.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:40:36.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:40:36.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:40:36.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:40:36.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:40:36.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:40:36.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:40:36.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:40:36.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:40:36.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:40:20
2026-05-29T02:40:36.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70672, datetime.datetime(2026, 5, 29, 2, 40, 20), datetime.datetime(2026, 5, 29, 2, 40, 20), 'salt', 6.69, 88.18, None, 12.18, 121.54, 1.81, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:40:36.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:40:36.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:40:36.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:20, diff=16.996736s, valid=True
2026-05-29T02:40:36.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:40:36.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:40:37.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:12, diff=25.00019s, valid=True
2026-05-29T02:40:37.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:40:37.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:15, diff=22.008126s, valid=True
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:40:37.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:40:37.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:12, diff=25.011785s, valid=True
2026-05-29T02:40:37.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:40:37.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:40:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:40:37.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947879.012567s, valid=True
2026-05-29T02:40:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:40:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:40:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:40:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:40:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:40:37.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:40:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:40:37.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:40:37.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:40:37.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:40:37.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:40:37.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:40:37.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:40:37.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:40:37.617 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:40:37.947 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:40:38.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:40:38.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:40:38.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-29T02:40:38.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-29T02:40:38.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:40:38.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:41:08.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:41:08.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:41:08.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:41:08.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:41:08.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:41:08.925 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:41:08.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-29T02:41:08.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:41:08.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:41:08.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:41:08.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:41:08.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:41:08.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-29T02:41:11.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-29T02:41:11.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:41:11.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:41:11.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:41:11.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:41:11.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:41:11.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:41:11.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:41:11.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:41:11.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:41:11.347 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:41:11.348 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:41:11.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:41:11.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:41:11.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:41:11.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:41:11.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:41:11.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:41:11.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:41:11.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:41:11.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:41:11.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:41:11.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:41:11.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:41:11.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:40:50
2026-05-29T02:41:11.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70673, datetime.datetime(2026, 5, 29, 2, 40, 50), datetime.datetime(2026, 5, 29, 2, 40, 50), 'salt', 6.69, 87.92, None, 13.76, 117.6, 1.86, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:41:11.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:41:11.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:41:11.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:50, diff=21.744166s, valid=True
2026-05-29T02:41:11.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:41:11.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:41:11.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:12, diff=-0.252335s, valid=True
2026-05-29T02:41:11.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:41:11.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:41:11.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:40:47, diff=24.755701s, valid=True
2026-05-29T02:41:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:41:11.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:41:11.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:41:11.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:41:11.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:41:11.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:41:11.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:12, diff=-0.240629s, valid=True
2026-05-29T02:41:11.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:41:11.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:41:11.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:41:11.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947913.76019s, valid=True
2026-05-29T02:41:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:41:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:41:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:41:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:41:11.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:41:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:41:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:41:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:41:11.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:41:11.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:41:11.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:41:12.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:41:12.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:41:12.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:41:12.289 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:41:12.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:41:12.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:41:12.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:41:12.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-29T02:41:12.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-29T02:41:13.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:41:13.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:41:43.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:41:43.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:41:43.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:41:43.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:41:43.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:41:43.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:41:43.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:41:43.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:41:43.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-29T02:41:43.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:41:43.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:41:43.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:41:43.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-29T02:41:47.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-29T02:41:47.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:41:47.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:41:47.053 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:41:47.053 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:41:47.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:41:47.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:41:47.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:41:47.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:41:47.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:41:47.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:41:47.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:41:47.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:41:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:41:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:41:47.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:41:47.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:41:47.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:41:47.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:41:47.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:41:47.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:41:47.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:41:47.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:41:47.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:41:47.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:41:20
2026-05-29T02:41:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70674, datetime.datetime(2026, 5, 29, 2, 41, 20), datetime.datetime(2026, 5, 29, 2, 41, 20), 'salt', 6.69, 87.92, None, 13.73, 123.75, 1.86, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:41:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:41:47.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:41:47.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:20, diff=27.399249s, valid=True
2026-05-29T02:41:47.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:41:47.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:41:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:12, diff=35.402357s, valid=True
2026-05-29T02:41:47.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:41:47.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:41:47.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:18, diff=29.409673s, valid=True
2026-05-29T02:41:47.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:41:47.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:41:47.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:41:47.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:41:47.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:41:47.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:41:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:41:12, diff=35.413035s, valid=True
2026-05-29T02:41:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:41:47.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:41:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:41:47.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947949.413785s, valid=True
2026-05-29T02:41:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:41:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:41:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:41:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:41:47.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:41:47.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:41:47.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:41:47.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:41:47.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:41:47.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:41:47.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:41:47.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:41:47.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:41:47.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:41:47.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:41:48.332 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:41:48.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:41:48.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:41:48.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-29T02:41:48.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-29T02:41:48.638 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:41:48.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:42:18.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:42:18.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:42:18.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:42:18.836 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:42:18.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:42:19.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:42:19.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-29T02:42:19.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:42:19.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:42:19.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:42:19.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:42:19.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:42:19.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-29T02:42:21.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-29T02:42:21.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:42:21.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:42:21.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:42:21.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:42:21.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:42:21.450 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:42:21.450 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:42:21.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:42:21.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:42:21.451 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:42:21.451 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:42:21.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:42:21.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:42:21.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:42:21.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:42:21.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:42:21.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:42:21.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:42:21.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:42:21.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:42:21.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:42:21.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:42:21.771 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:42:21.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:42:21
2026-05-29T02:42:21.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70676, datetime.datetime(2026, 5, 29, 2, 42, 21), datetime.datetime(2026, 5, 29, 2, 42, 21), 'salt', 6.62, 87.68, None, 12.63, 120.53, 1.89, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:42:21.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:42:21.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:42:21.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:21, diff=0.837697s, valid=True
2026-05-29T02:42:21.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:42:21.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:42:21.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:12, diff=9.841162s, valid=True
2026-05-29T02:42:21.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:42:21.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:15, diff=6.849086s, valid=True
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:42:21.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:42:21.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:12, diff=9.852749s, valid=True
2026-05-29T02:42:21.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:42:21.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:42:21.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:42:21.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=947983.853548s, valid=True
2026-05-29T02:42:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:42:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:42:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:42:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:42:21.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:42:21.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:42:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:42:21.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:42:21.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:42:21.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:42:22.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:42:22.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:42:22.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:42:22.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:42:22.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:42:22.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:42:22.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:42:22.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:42:22.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-29T02:42:22.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-29T02:42:23.042 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:42:23.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:42:53.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:42:53.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:42:53.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:42:53.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:42:53.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:42:53.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:42:53.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-29T02:42:53.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:42:53.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-29T02:42:53.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:42:53.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:42:53.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:42:53.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-29T02:42:56.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-29T02:42:56.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:42:56.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:42:56.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:42:56.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:42:56.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:42:56.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:42:56.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:42:56.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:42:56.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:42:56.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:42:56.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:42:56.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:42:56.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:42:56.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:42:56.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:42:56.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:42:56.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:42:56.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:42:56.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:42:56.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:42:56.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:42:56.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:42:56.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:42:56.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:42:51
2026-05-29T02:42:56.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70677, datetime.datetime(2026, 5, 29, 2, 42, 51), datetime.datetime(2026, 5, 29, 2, 42, 51), 'salt', 6.69, 87.58, None, 12.99, 119.5, 1.91, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:42:56.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:42:56.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:42:56.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:51, diff=5.705216s, valid=True
2026-05-29T02:42:56.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:42:56.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:42:56.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:12, diff=-15.291943s, valid=True
2026-05-29T02:42:56.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:42:56.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:42:56.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:42:45, diff=11.714603s, valid=True
2026-05-29T02:42:56.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:42:56.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:42:56.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:42:56.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:42:56.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:42:56.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:42:56.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:12, diff=-15.282396s, valid=True
2026-05-29T02:42:56.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:42:56.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:42:56.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:42:56.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948018.718258s, valid=True
2026-05-29T02:42:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:42:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:42:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:42:56.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:42:56.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:42:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:42:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:42:56.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:42:56.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:42:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:42:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:42:56.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:42:56.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:42:57.036 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:42:57.233 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:42:57.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:42:57.663 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:42:57.663 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:42:57.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-29T02:42:57.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-29T02:42:57.871 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:42:57.871 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:43:27.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:43:27.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:43:27.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:43:28.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:43:28.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:43:28.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:43: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-29T02:43:28.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:43:28.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-29T02:43:28.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:43:28.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:43:28.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:43:28.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-29T02:43:31.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-29T02:43:31.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:43:31.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:43:31.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:43:31.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:43:31.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:43:31.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:43:31.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:43:31.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:43:31.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:43:31.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:43:31.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:43:31.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:43:31.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:43:31.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:43:31.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:43:31.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:43:31.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:43:31.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:43:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:43:31.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:43:31.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:43:31.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:43:31.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:43:31.482 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:43:21
2026-05-29T02:43:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70678, datetime.datetime(2026, 5, 29, 2, 43, 21), datetime.datetime(2026, 5, 29, 2, 43, 21), 'salt', 6.55, 87.45, None, 13.06, 119.78, 1.92, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:43:31.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:43:31.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:43:31.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:21, diff=10.489111s, valid=True
2026-05-29T02:43:31.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:43:31.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:43:31.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:12, diff=19.492326s, valid=True
2026-05-29T02:43:31.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:43:31.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:43:31.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:15, diff=16.499615s, valid=True
2026-05-29T02:43:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:43:31.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:43:31.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:43:31.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:43:31.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:43:31.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:43:31.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:12, diff=19.503057s, valid=True
2026-05-29T02:43:31.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:43:31.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:43:31.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:43:31.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948053.503809s, valid=True
2026-05-29T02:43:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:43:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:43:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:43:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:43:31.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:43:31.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:43:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:43:31.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:43:31.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:43:31.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:43:31.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:43:31.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:43:31.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:43:31.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:43:32.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:43:32.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:43:32.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:43:32.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:43:32.460 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:43: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-29T02:43:32.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:43:32.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:44:02.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:44:02.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:44:02.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:44:03.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:44:03.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:44:03.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:44:03.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-29T02:44:03.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:44:03.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-29T02:44:03.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:44:03.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:44:03.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:44: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-29T02:44:05.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-29T02:44:05.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:44:05.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:44:05.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:44:05.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:44:05.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:44:05.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:44:05.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:44:05.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:44:05.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:44:05.982 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:44:05.982 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:44:05.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:44:06.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:44:06.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:44:06.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:44:06.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:44:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:44:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:44:06.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:44:06.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:44:06.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:44:06.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:44:06.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:44:06.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:43:52
2026-05-29T02:44:06.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70679, datetime.datetime(2026, 5, 29, 2, 43, 52), datetime.datetime(2026, 5, 29, 2, 43, 51), 'salt', 6.69, 87.52, None, 12.67, 120.25, 1.92, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:44:06.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:44:06.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:44:06.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:51, diff=15.381774s, valid=True
2026-05-29T02:44:06.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:44:06.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:44:06.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:12, diff=-5.614699s, valid=True
2026-05-29T02:44:06.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:44:06.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:43:45, diff=21.393204s, valid=True
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:44:06.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:44:06.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:12, diff=-5.603195s, valid=True
2026-05-29T02:44:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:44:06.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:44:06.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:44:06.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948088.39757s, valid=True
2026-05-29T02:44:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:44:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:44:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:44:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:44:06.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:44:06.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:44:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:44:06.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:44:06.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:44:06.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:44:06.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:44:06.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:44:06.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:44:06.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:44:06.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:44:07.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:44:07.355 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:44:07.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:44:07.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-29T02:44:07.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-29T02:44:07.601 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:44:07.601 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:44:37.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:44:37.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:44:37.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:44:37.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:44:37.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:44:38.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:44:38.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-29T02:44:38.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:44:38.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-29T02:44:38.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:44:38.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:44:38.198 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:44:38.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-29T02:44:41.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-29T02:44:41.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:44:41.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:44:41.122 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:44:41.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:44:41.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:44:41.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:44:41.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:44:41.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:44:41.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:44:41.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:44:41.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:44:41.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:44:41.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:44:41.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:44:41.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:44:41.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:44:41.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:44:41.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:44:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:44:41.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:44:41.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:44:41.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:44:41.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:44:41.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:44:22
2026-05-29T02:44:41.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70680, datetime.datetime(2026, 5, 29, 2, 44, 22), datetime.datetime(2026, 5, 29, 2, 44, 21), 'salt', 6.65, 87.52, None, 12.88, 121.47, 1.91, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:44:41.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:44:41.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:44:41.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:21, diff=20.534715s, valid=True
2026-05-29T02:44:41.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:44:41.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:44:41.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:12, diff=29.538157s, valid=True
2026-05-29T02:44:41.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:44:41.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:16, diff=25.546058s, valid=True
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:44:41.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:44:41.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:12, diff=29.549721s, valid=True
2026-05-29T02:44:41.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:44:41.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:44:41.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:44:41.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948123.550499s, valid=True
2026-05-29T02:44:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:44:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:44:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:44:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:44:41.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:44:41.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:44:41.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:44:41.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:44:41.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:44:41.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:44:41.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:44:41.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:44:41.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:44:41.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:44:42.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:44:42.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:44:42.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:44:42.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:44:42.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-29T02:44:42.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-29T02:44:42.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:44:42.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:45:12.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:45:12.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:45:12.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:45:12.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:45:12.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:45:13.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:45:13.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-29T02:45:13.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:45:13.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-29T02:45:13.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:45:13.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:45:13.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:45:13.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-29T02:45:15.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-29T02:45:15.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:45:15.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:45:15.586 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:45:15.586 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:45:15.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:45:15.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:45:15.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:45:15.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:45:15.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:45:15.618 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:45:15.618 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:45:15.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:45:15.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:45:15.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:45:15.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:45:15.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:45:15.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:45:15.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:45:15.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:45:15.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:45:15.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:45:15.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:45:15.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:45:15.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:44:52
2026-05-29T02:45:15.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70681, datetime.datetime(2026, 5, 29, 2, 44, 52), datetime.datetime(2026, 5, 29, 2, 44, 52), 'salt', 6.72, 87.49, None, 12.85, 120.74, 1.92, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:45:15.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:45:15.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:45:15.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:52, diff=23.990477s, valid=True
2026-05-29T02:45:15.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:45:15.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:45:15.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:12, diff=3.993979s, valid=True
2026-05-29T02:45:15.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:45:15.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:45:16.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:44:48, diff=28.001766s, valid=True
2026-05-29T02:45:16.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:45:16.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:45:16.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:45:16.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:45:16.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:45:16.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:45:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:12, diff=4.005321s, valid=True
2026-05-29T02:45:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:45:16.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:45:16.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:45:16.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948158.006085s, valid=True
2026-05-29T02:45:16.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:45:16.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:45:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:45:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:45:16.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:45:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:45:16.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:45:16.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:45:16.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:45:16.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:45:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:45:16.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:45:16.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:45:16.327 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:45:16.521 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:45:16.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:45:16.946 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:45:16.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:45:16.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-29T02:45:16.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-29T02:45:17.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:45:17.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:45:47.162 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:45:47.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:45:47.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:45:47.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:45:47.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:45:47.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:45:47.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-29T02:45:47.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:45:47.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-29T02:45:47.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:45:47.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:45:47.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:45:47.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-29T02:45:50.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-29T02:45:50.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:45:50.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:45:50.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:45:50.187 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:45:50.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:45:50.208 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:45:50.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:45:50.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:45:50.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:45:50.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:45:50.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:45:50.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:45:50.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:45:50.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:45:50.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:45:50.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:45:50.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:45:50.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:45:50.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:45:50.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:45:50.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:45:50.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:45:50.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:45:50.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:45:23
2026-05-29T02:45:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70682, datetime.datetime(2026, 5, 29, 2, 45, 23), datetime.datetime(2026, 5, 29, 2, 45, 22), 'salt', 6.65, 87.49, None, 12.53, 122.15, 1.92, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:45:50.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:45:50.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:45:50.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:22, diff=28.599468s, valid=True
2026-05-29T02:45:50.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:45:50.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:45:50.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:12, diff=38.603001s, valid=True
2026-05-29T02:45:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:45:50.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:19, diff=31.611113s, valid=True
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:45:50.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:45:50.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:45:12, diff=38.614874s, valid=True
2026-05-29T02:45:50.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:45:50.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:45:50.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:45:50.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948192.615709s, valid=True
2026-05-29T02:45:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:45:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:45:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:45:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:45:50.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:45:50.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:45:50.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:45:50.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:45:50.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:45:50.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:45:50.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:45:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:45:50.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:45:50.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:45:51.131 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:45:51.513 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:45:51.612 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:45:51.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:45:51.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:45:51.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-29T02:45:51.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:45:51.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:46:21.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:46:21.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:46:21.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:46:22.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:46:22.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:46:22.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:46:22.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-29T02:46:22.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:46:22.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-29T02:46:22.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:46:22.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:46:22.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:46:22.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-29T02:46: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-29T02:46:25.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:46:25.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:46:25.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:46:25.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:46:25.216 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:46:25.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:46:25.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:46:25.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:46:25.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:46:25.230 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:46:25.231 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:46:25.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:46:25.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:46:25.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:46:25.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:46:25.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:46:25.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:46:25.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:46:25.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:46:25.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:46:25.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:46:25.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:46:25.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:46:25.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:46:23
2026-05-29T02:46:25.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70684, datetime.datetime(2026, 5, 29, 2, 46, 23), datetime.datetime(2026, 5, 29, 2, 46, 23), 'salt', 6.55, 87.65, None, 12.99, 121.38, 1.89, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:46:25.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:46:25.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:46:25.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:23, diff=2.617498s, valid=True
2026-05-29T02:46:25.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:46:25.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:46:25.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:12, diff=13.620939s, valid=True
2026-05-29T02:46:25.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:46:25.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:23, diff=2.633107s, valid=True
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:46:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:46:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:12, diff=13.636722s, valid=True
2026-05-29T02:46:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:46:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:46:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:46:25.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948227.637498s, valid=True
2026-05-29T02:46:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:46:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:46:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:46:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:46:25.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:46:25.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:46:25.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:46:25.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:46:25.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:46:25.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:46:25.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:46:25.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:46:25.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:46:25.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:46:26.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:46:26.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:46:26.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:46:26.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:46:26.585 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:46:26.585 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:46:26.806 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:46:26.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:46:56.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:46:56.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:46:56.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:46:57.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:46:57.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:46:57.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:46:57.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:46:57.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:46:57.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-29T02:46:57.416 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:46:57.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:46:57.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:46:57.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-29T02:47:00.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-29T02:47:00.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:47:00.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:47:00.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:47:00.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:47:00.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:47:00.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:47:00.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:47:00.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:47:00.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:47:00.078 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:47:00.078 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:47:00.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:47:00.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:47:00.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:47:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:47:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:47:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:47:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:47:00.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:47:00.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:47:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:47:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:47:00.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:47:00.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:46:53
2026-05-29T02:47:00.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70685, datetime.datetime(2026, 5, 29, 2, 46, 53), datetime.datetime(2026, 5, 29, 2, 46, 52), 'salt', 6.49, 87.98, None, 12.67, 121.94, 1.84, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:47:00.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:47:00.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:47:00.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:52, diff=8.411771s, valid=True
2026-05-29T02:47:00.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:47:00.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:47:00.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:12, diff=-11.584952s, valid=True
2026-05-29T02:47:00.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:47:00.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:46:47, diff=13.42232s, valid=True
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:47:00.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:47:00.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:12, diff=-11.574259s, valid=True
2026-05-29T02:47:00.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:47:00.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:47:00.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:47:00.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948262.426471s, valid=True
2026-05-29T02:47:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:47:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:47:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:47:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:47:00.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:47:00.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:47:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:47:00.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:47:00.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:47:00.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:47:00.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:47:00.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:47:00.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:47:00.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:47:01.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:47:01.357 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:47:01.456 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:47:01.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:47:01.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:47:01.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:47:01.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:47:01.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:47:31.730 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:47:31.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:47:31.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:47:32.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:47:32.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:47:32.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:47:32.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-29T02:47:32.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:47:32.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-29T02:47:32.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:47:32.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:47:32.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:47:32.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-29T02:47:34.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-29T02:47:34.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:47:34.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:47:34.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:47:34.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:47:34.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:47:34.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:47:34.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:47:34.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:47:34.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:47:34.944 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:47:34.944 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:47:34.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:47:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:47:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:47:35.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:47:35.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:47:35.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:47:35.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:47:35.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:47:35.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:47:35.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:47:35.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:47:35.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:47:35.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:47:24
2026-05-29T02:47:35.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70686, datetime.datetime(2026, 5, 29, 2, 47, 24), datetime.datetime(2026, 5, 29, 2, 47, 23), 'salt', 6.49, 88.08, None, 11.26, 122.15, 1.83, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:47:35.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:47:35.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:47:35.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:23, diff=12.336297s, valid=True
2026-05-29T02:47:35.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:47:35.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:47:35.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:12, diff=23.339835s, valid=True
2026-05-29T02:47:35.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:47:35.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:47:35.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:17, diff=18.347807s, valid=True
2026-05-29T02:47:35.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:47:35.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:47:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:47:35.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:47:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:47:35.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:47:35.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:12, diff=23.351575s, valid=True
2026-05-29T02:47:35.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:47:35.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:47:35.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:47:35.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948297.352408s, valid=True
2026-05-29T02:47:35.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:47:35.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:47:35.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:47:35.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:47:35.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:47:35.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:47:35.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:47:35.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:47:35.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:47:35.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:47:35.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:47:35.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:47:35.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:47:35.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:47:35.882 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:47:36.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:47:36.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:47:36.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:47:36.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-29T02:47:36.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-29T02:47:36.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:47:36.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:48:06.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:48:06.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:48:06.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:48:06.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:48:06.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:48:07.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:48:07.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-29T02:48:07.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:48: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-29T02:48:07.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:48:07.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:48:07.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:48:07.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-29T02:48:09.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:48:09.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:48:09.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:48:09.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:48:09.416 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:48:09.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:48:09.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:48:09.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:48:09.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:48:09.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:48:09.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:48:09.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:48:09.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:48:09.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:48:09.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:48:09.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:48:09.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:48:09.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:48:09.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:48:09.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:48:09.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:48:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:48:09.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:48:09.779 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:48:09.858 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:47:54
2026-05-29T02:48:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70687, datetime.datetime(2026, 5, 29, 2, 47, 54), datetime.datetime(2026, 5, 29, 2, 47, 53), 'salt', 6.49, 88.28, None, 11.33, 121.56, 1.79, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:48:09.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:48:09.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:48:09.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:53, diff=16.865072s, valid=True
2026-05-29T02:48:09.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:48:09.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:48:09.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:12, diff=-2.131918s, valid=True
2026-05-29T02:48:09.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:48:09.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:48:09.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:47:47, diff=22.875606s, valid=True
2026-05-29T02:48:09.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:48:09.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:48:09.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:48:09.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:48:09.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:48:09.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:48:09.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:12, diff=-2.121167s, valid=True
2026-05-29T02:48:09.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:48:09.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:48:09.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:48:09.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948331.879502s, valid=True
2026-05-29T02:48:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:48:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:48:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:48:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:48:09.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:48:09.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:48:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:48:09.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:48:09.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:48:10.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:48:10.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:48:10.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:48:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:48:10.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:48:10.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:48:10.809 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:48:10.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:48:10.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:48:10.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-29T02:48:10.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-29T02:48:10.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:48:10.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:48:41.023 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:48:41.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:48:41.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:48:41.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:48:41.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:48:41.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:48:41.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-29T02:48:41.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:48:41.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-29T02:48:41.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:48:41.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:48:41.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:48:41.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-29T02:48:44.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-29T02:48:44.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:48:44.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:48:44.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:48:44.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:48:44.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:48:44.664 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:48:44.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:48:44.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:48:44.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:48:44.666 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:48:44.666 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:48:44.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:48:44.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:48:44.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:48:44.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:48:44.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:48:44.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:48:44.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:48:44.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:48:44.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:48:44.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:48:44.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:48:44.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:48:45.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:48:24
2026-05-29T02:48:45.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70688, datetime.datetime(2026, 5, 29, 2, 48, 24), datetime.datetime(2026, 5, 29, 2, 48, 24), 'salt', 6.45, 88.42, None, 12.39, 121.49, 1.76, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:48:45.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:48:45.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:48:45.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:24, diff=21.062885s, valid=True
2026-05-29T02:48:45.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:48:45.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:48:45.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:12, diff=33.066282s, valid=True
2026-05-29T02:48:45.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:48:45.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:18, diff=27.074204s, valid=True
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:48:45.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:48:45.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:12, diff=33.077876s, valid=True
2026-05-29T02:48:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:48:45.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:48:45.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:48:45.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948367.078686s, valid=True
2026-05-29T02:48:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:48:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:48:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:48:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:48:45.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:48:45.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:48:45.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:48:45.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:48:45.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:48:45.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:48:45.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:48:45.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:48:45.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:48:45.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:48:45.595 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:48:45.922 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:48:46.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:48:46.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:48:46.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-29T02:48:46.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-29T02:48:46.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:48:46.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:49:16.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:49:16.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:49:16.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:49:16.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:49:16.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:49:16.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:49:16.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-29T02:49:16.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:49:16.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-29T02:49:16.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:49:16.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:49:16.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:49:16.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-29T02:49: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-29T02:49:19.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:49:19.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:49:19.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:49:19.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:49:19.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:49:19.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:49:19.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:49:19.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:49:19.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:49:19.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:49:19.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:49:19.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:49:19.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:49:19.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:49:19.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:49:19.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:49:19.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:49:19.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:49:19.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:49:19.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:49:19.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:49:19.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:49:19.468 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:49:19.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:48:54
2026-05-29T02:49:19.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70689, datetime.datetime(2026, 5, 29, 2, 48, 54), datetime.datetime(2026, 5, 29, 2, 48, 54), 'salt', 6.45, 88.55, None, 12.21, 121.73, 1.74, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:49:19.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:49:19.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:49:19.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:54, diff=25.539554s, valid=True
2026-05-29T02:49:19.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:49:19.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:49:19.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:12, diff=7.542965s, valid=True
2026-05-29T02:49:19.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:49:19.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:49:19.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:48:49, diff=30.5509s, valid=True
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:49:19.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:49:19.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:12, diff=7.554609s, valid=True
2026-05-29T02:49:19.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:49:19.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:49:19.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:49:19.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948401.555408s, valid=True
2026-05-29T02:49:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:49:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:49:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:49:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:49:19.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:49:19.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:49:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:49:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:49:19.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:49:19.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:49:19.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:49:19.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:49:19.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:49:19.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:49:20.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:49:20.603 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:49:20.703 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:49:20.703 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:49:20.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-29T02:49:20.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-29T02:49:20.934 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:49:20.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:49:50.946 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:49:50.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:49:50.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:49:51.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:49:51.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:49:51.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:49:51.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-29T02:49:51.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:49:51.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-29T02:49:51.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:49:51.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:49:51.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:49:51.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-29T02:49:53.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-29T02:49:53.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:49:53.778 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:49:53.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:49:53.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:49:53.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:49:53.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:49:53.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:49:53.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:49:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:49:53.801 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:49:53.802 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:49:53.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:49:53.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:49:53.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:49:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:49:54.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:49:54.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:49:54.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:49:54.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:49:54.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:49:54.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:49:54.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:49:54.126 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:49:54.193 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:49:25
2026-05-29T02:49:54.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70690, datetime.datetime(2026, 5, 29, 2, 49, 25), datetime.datetime(2026, 5, 29, 2, 49, 24), 'salt', 6.42, 88.65, None, 11.93, 120.86, 1.73, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:49:54.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:49:54.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:49:54.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:24, diff=30.201187s, valid=True
2026-05-29T02:49:54.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:49:54.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:49:54.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:12, diff=42.204634s, valid=True
2026-05-29T02:49:54.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:49:54.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:49:54.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:21, diff=33.212554s, valid=True
2026-05-29T02:49:54.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:49:54.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:49:54.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:49:54.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:49:54.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:49:54.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:49:54.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:49:12, diff=42.216167s, valid=True
2026-05-29T02:49:54.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:49:54.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:49:54.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:49:54.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948436.216973s, valid=True
2026-05-29T02:49:54.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:49:54.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:49:54.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:49:54.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:49:54.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:49:54.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:49:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:49:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:49:54.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:49:54.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:49:54.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:49:54.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:49:54.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:49:54.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:49:54.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:49:55.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:49:55.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:49:55.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:49:55.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-29T02:49:55.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-29T02:49:55.447 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:49:55.447 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:50:25.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:50:25.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:50:25.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:50:25.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:50:25.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:50:25.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:50:25.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-29T02:50:25.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:50:25.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-29T02:50:25.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:50:25.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:50:25.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:50:25.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-29T02:50:28.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-29T02:50:28.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:50:28.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:50:28.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:50:28.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:50:28.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:50:28.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:50:28.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:50:28.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:50:28.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:50:28.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:50:28.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:50:28.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:50:28.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:50:28.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:50:28.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:50:28.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:50:28.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:50:28.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:50:28.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:50:28.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:50:28.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:50:28.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:50:28.787 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:50:28.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:50:25
2026-05-29T02:50:28.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70692, datetime.datetime(2026, 5, 29, 2, 50, 25), datetime.datetime(2026, 5, 29, 2, 50, 25), 'salt', 6.39, 88.78, None, 12.53, 121.99, 1.71, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:50:28.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:50:28.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:50:28.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:25, diff=3.859849s, valid=True
2026-05-29T02:50:28.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:50:28.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:50:28.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:12, diff=16.863378s, valid=True
2026-05-29T02:50:28.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:50:28.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:50:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:24, diff=4.871523s, valid=True
2026-05-29T02:50:28.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:50:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:50:28.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:50:28.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:50:28.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:50:28.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:50:28.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:12, diff=16.875299s, valid=True
2026-05-29T02:50:28.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:50:28.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:50:28.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:50:28.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948470.876113s, valid=True
2026-05-29T02:50:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:50:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:50:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:50:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:50:28.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:50:28.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:50:28.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:50:28.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:50:29.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:50:29.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:50:29.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:50:29.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:50:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:50:29.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:50:29.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:50:29.801 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:50:29.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:50:29.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:50:29.906 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:50:29.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-29T02:50:30.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:50:30.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:51:00.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:51:00.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:51:00.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:51:00.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:51:00.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:51:00.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:51:00.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-29T02:51:00.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:51:00.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-29T02:51:00.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:51:00.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:51:00.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:51:00.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-29T02:51:03.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-29T02:51:03.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:51:03.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:51:03.293 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:51:03.293 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:51:03.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:51:03.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:51:03.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:51:03.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:51:03.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:51:03.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:51:03.318 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:51:03.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:51:03.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:51:03.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:51:03.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:51:03.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:51:03.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:51:03.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:51:03.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:51:03.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:51:03.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:51:03.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:51:03.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:51:03.699 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:50:55
2026-05-29T02:51:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70693, datetime.datetime(2026, 5, 29, 2, 50, 55), datetime.datetime(2026, 5, 29, 2, 50, 55), 'salt', 6.42, 88.98, None, 12.03, 121.61, 1.68, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:51:03.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:51:03.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:51:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:55, diff=8.707317s, valid=True
2026-05-29T02:51:03.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:51:03.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:51:03.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:12, diff=-8.289187s, valid=True
2026-05-29T02:51:03.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:51:03.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:51:03.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:50:55, diff=8.718934s, valid=True
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:51:03.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:51:03.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:12, diff=-8.277415s, valid=True
2026-05-29T02:51:03.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:51:03.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:51:03.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:51:03.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948505.723401s, valid=True
2026-05-29T02:51:03.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:51:03.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:51:03.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:51:03.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:51:03.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:51:03.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:51:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:51:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:51:03.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:51:03.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:51:03.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:51:03.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:51:04.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:51:04.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:51:04.248 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:51:04.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:51:04.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:51:04.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:51:04.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-29T02:51:04.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-29T02:51:06.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:51:06.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:51:36.464 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:51:36.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:51:36.464 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:51:36.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:51:36.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:51:37.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:51:37.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:51:37.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:51:37.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-29T02:51:37.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:51:37.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:51:37.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:51:37.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-29T02:51:39.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:51:39.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:51:39.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:51:39.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:51:39.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:51:39.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:51:39.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:51:39.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:51:39.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:51:39.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:51:39.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:51:39.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:51:39.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:51:39.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:51:39.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:51:39.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:51:39.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:51:39.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:51:39.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:51:39.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:51:39.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:51:39.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:51:39.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:51:39.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:51:39.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:51:25
2026-05-29T02:51:39.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70694, datetime.datetime(2026, 5, 29, 2, 51, 25), datetime.datetime(2026, 5, 29, 2, 51, 25), 'salt', 6.35, 88.98, None, 12.18, 121.75, 1.67, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:51:39.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:51:39.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:51:40.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:25, diff=15.007461s, valid=True
2026-05-29T02:51:40.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:51:40.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:51:40.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:12, diff=28.010643s, valid=True
2026-05-29T02:51:40.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:51:40.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:19, diff=21.017996s, valid=True
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:51:40.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:51:40.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:12, diff=28.021346s, valid=True
2026-05-29T02:51:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:51:40.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:51:40.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:51:40.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948542.022061s, valid=True
2026-05-29T02:51:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:51:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:51:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:51:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:51:40.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:51:40.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:51:40.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:51:40.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:51:40.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:51:40.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:51:40.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:51:40.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:51:40.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:51:40.345 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:51:40.550 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:51:40.883 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:51:40.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:51:40.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:51:40.980 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:51:40.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-29T02:51:41.071 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:51:41.071 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:52:11.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:52:11.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:52:11.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:52:11.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:52:11.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:52:11.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:52:11.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:52:11.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:52:11.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-29T02:52:11.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:52:11.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:52:11.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:52:11.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-29T02:52:14.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-29T02:52:14.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:52:14.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:52:14.094 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:52:14.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:52:14.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:52:14.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:52:14.117 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:52:14.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:52:14.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:52:14.118 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:52:14.118 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:52:14.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:52:14.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:52:14.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:52:14.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:52:14.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:52:14.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:52:14.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:52:14.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:52:14.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:52:14.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:52:14.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:52:14.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:52:14.510 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:51:56
2026-05-29T02:52:14.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70695, datetime.datetime(2026, 5, 29, 2, 51, 56), datetime.datetime(2026, 5, 29, 2, 51, 55), 'salt', 6.25, 89.01, None, 12.32, 120.77, 1.67, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:52:14.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:52:14.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:52:14.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:55, diff=19.518131s, valid=True
2026-05-29T02:52:14.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:52:14.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:52:14.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:12, diff=2.521681s, valid=True
2026-05-29T02:52:14.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:52:14.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:52:14.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:51:49, diff=25.529701s, valid=True
2026-05-29T02:52:14.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:52:14.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:52:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:52:14.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:52:14.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:52:14.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:52:14.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:12, diff=2.533446s, valid=True
2026-05-29T02:52:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:52:14.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:52:14.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:52:14.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948576.53428s, valid=True
2026-05-29T02:52:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:52:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:52:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:52:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:52:14.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:52:14.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:52:14.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:52:14.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:52:14.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:52:14.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:52:14.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:52:14.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:52:14.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:52:14.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:52:15.077 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:52:15.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:52:15.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:52:15.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:52:15.570 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:52:15.570 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:52:15.755 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:52:15.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:52:45.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:52:45.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:52:45.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:52:45.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:52:45.955 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:52:46.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:52:46.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-29T02:52:46.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:52:46.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-29T02:52:46.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:52:46.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:52:46.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:52:46.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-29T02:52:49.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:52:49.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:52:49.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:52:49.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:52:49.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:52:49.472 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:52:49.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:52:49.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:52:49.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:52:49.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:52:49.486 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:52:49.487 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:52:49.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:52:49.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:52:49.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:52:49.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:52:49.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:52:49.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:52:49.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:52:49.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:52:49.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:52:49.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:52:49.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:52:49.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:52:49.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:52:26
2026-05-29T02:52:49.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70696, datetime.datetime(2026, 5, 29, 2, 52, 26), datetime.datetime(2026, 5, 29, 2, 52, 26), 'salt', 6.39, 89.25, None, 11.86, 119.47, 1.64, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:52:49.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:52:49.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:52:49.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:26, diff=23.881911s, valid=True
2026-05-29T02:52:49.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:52:49.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:52:49.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:12, diff=37.88498s, valid=True
2026-05-29T02:52:49.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:52:49.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:52:49.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:20, diff=29.892784s, valid=True
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:52:49.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:52:49.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:12, diff=37.896849s, valid=True
2026-05-29T02:52:49.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:52:49.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:52:49.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:52:49.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948611.897711s, valid=True
2026-05-29T02:52:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:52:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:52:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:52:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:52:49.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:52:49.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:52:49.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:52:49.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:52:49.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:52:50.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:52:50.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:52:50.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:52:50.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:52:50.235 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:52:50.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:52:50.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:52:50.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:52:50.872 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:52:50.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-29T02:52:50.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-29T02:52:51.117 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:52:51.117 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:53:21.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:53:21.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:53:21.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:53:21.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:53:21.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:53:21.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:53:21.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-29T02:53:21.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:53:21.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-29T02:53:21.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:53:21.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:53:21.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:53:21.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-29T02:53:24.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-29T02:53:24.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:53:24.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:53:24.506 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:53:24.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:53:24.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:53:24.529 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:53:24.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:53:24.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:53:24.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:53:24.531 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:53:24.531 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:53:24.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:53:24.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:53:24.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:53:24.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:53:24.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:53:24.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:53:24.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:53:24.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:53:24.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:53:24.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:53:24.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:53:24.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:53:24.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:52:56
2026-05-29T02:53:24.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70697, datetime.datetime(2026, 5, 29, 2, 52, 56), datetime.datetime(2026, 5, 29, 2, 52, 56), 'salt', 6.29, 89.15, None, 11.89, 118.98, 1.65, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:53:24.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:53:24.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:53:24.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:56, diff=28.924672s, valid=True
2026-05-29T02:53:24.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:53:24.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:53:24.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:53:12, diff=12.928205s, valid=True
2026-05-29T02:53:24.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:53:24.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:52:50, diff=34.936251s, valid=True
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:53:24.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:53:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:53:12, diff=12.940042s, valid=True
2026-05-29T02:53:24.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:53:24.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:53:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:53:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948646.940882s, valid=True
2026-05-29T02:53:24.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:53:24.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:53:24.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:53:24.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:53:24.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:53:25.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:53:25.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:53:25.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:53:25.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:53:25.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:53:25.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:53:25.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:53:25.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:53:25.267 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:53:25.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:53:25.898 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:53:25.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:53:25.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:53:25.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-29T02:53:25.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-29T02:53:26.174 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:53:26.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:53:56.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:53:56.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:53:56.199 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:53:56.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:53:56.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:53:56.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:53: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-29T02:53:56.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:53:56.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-29T02:53:56.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:53:56.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:53:56.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:53:56.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:53:59.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-29T02:53:59.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:53:59.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:53:59.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:53:59.218 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:53:59.229 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:53:59.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:53:59.242 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:53:59.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:53:59.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:53:59.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:53:59.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:53:59.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:53:59.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:53:59.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:53:59.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:53:59.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:53:59.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:53:59.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:53:59.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:53:59.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:53:59.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:53:59.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:53:59.557 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:53:59.616 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:53:57
2026-05-29T02:53:59.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70699, datetime.datetime(2026, 5, 29, 2, 53, 57), datetime.datetime(2026, 5, 29, 2, 53, 56), 'salt', 6.35, 89.21, None, 11.5, 116.96, 1.64, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:53:59.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:53:59.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:53:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:53:56, diff=3.624074s, valid=True
2026-05-29T02:53:59.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:53:59.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:53:59.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:12, diff=-12.372607s, valid=True
2026-05-29T02:53:59.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:53:59.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:53:53, diff=6.635185s, valid=True
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:53:59.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:53:59.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:12, diff=-12.361255s, valid=True
2026-05-29T02:53:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:53:59.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:53:59.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:53:59.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948681.639565s, valid=True
2026-05-29T02:53:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:53:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:53:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:53:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:53:59.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:53:59.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:53:59.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:53:59.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:53:59.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:53:59.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:53:59.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:53:59.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:53:59.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:53:59.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:54:00.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:54:00.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:54:00.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:54:00.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:54:00.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-29T02:54:00.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-29T02:54:00.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:54:00.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:54:30.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:54:30.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:54:30.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:54:31.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:54:31.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:54:31.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:54:31.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-29T02:54:31.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:54:31.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-29T02:54:31.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:54:31.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:54:31.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:54:31.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-29T02:54:34.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-29T02:54:34.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:54:34.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:54:34.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:54:34.621 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:54:34.633 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:54:34.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:54:34.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:54:34.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:54:34.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:54:34.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:54:34.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:54:34.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:54:34.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:54:34.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:54:34.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:54:34.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:54:34.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:54:34.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:54:34.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:54:34.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:54:34.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:54:34.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:54:34.977 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:54:35.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:54:27
2026-05-29T02:54:35.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70700, datetime.datetime(2026, 5, 29, 2, 54, 27), datetime.datetime(2026, 5, 29, 2, 54, 27), 'salt', 6.35, 89.24, None, 11.19, 116.33, 1.63, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:54:35.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:54:35.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:54:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:27, diff=8.047512s, valid=True
2026-05-29T02:54:35.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:54:35.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:54:35.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:12, diff=23.050887s, valid=True
2026-05-29T02:54:35.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:54:35.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:54:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:25, diff=10.058666s, valid=True
2026-05-29T02:54:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:54:35.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:54:35.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:54:35.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:54:35.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:54:35.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:54:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:12, diff=23.062227s, valid=True
2026-05-29T02:54:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:54:35.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:54:35.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:54:35.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948717.063032s, valid=True
2026-05-29T02:54:35.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:54:35.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:54:35.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:54:35.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:54:35.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:54:35.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:54:35.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:54:35.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:54:35.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:54:35.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:54:35.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:54:35.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:54:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:54:35.387 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:54:35.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:54:36.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:54:36.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:54:36.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:54:36.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-29T02:54:36.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-29T02:54:36.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:54:36.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:55:06.305 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:55:06.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:55:06.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:55:06.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:55:06.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:55:06.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:55:06.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-29T02:55:06.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:55:06.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-29T02:55:06.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:55:06.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:55:06.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:55:06.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-29T02:55:09.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-29T02:55:09.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:55:09.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:55:09.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:55:09.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:55:09.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:55:09.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:55:09.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:55:09.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:55:09.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:55:09.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:55:09.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:55:09.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:55:09.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:55:09.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:55:10.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:55:10.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:55:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:55:10.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:55:10.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:55:10.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:55:10.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:55:10.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:55:10.154 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:55:10.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:54:57
2026-05-29T02:55:10.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70701, datetime.datetime(2026, 5, 29, 2, 54, 57), datetime.datetime(2026, 5, 29, 2, 54, 57), 'salt', 6.39, 89.14, None, 11.33, 118.21, 1.65, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:55:10.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:55:10.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:55:10.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:57, diff=13.223779s, valid=True
2026-05-29T02:55:10.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:55:10.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:55:10.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:12, diff=-1.773136s, valid=True
2026-05-29T02:55:10.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:55:10.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:54:56, diff=14.234039s, valid=True
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:55:10.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:55:10.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:12, diff=-1.762698s, valid=True
2026-05-29T02:55:10.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:55:10.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:55:10.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:55:10.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948752.238019s, valid=True
2026-05-29T02:55:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:55:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:55:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:55:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:55:10.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:55:10.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:55:10.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:55:10.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:55:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:55:10.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:55:10.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:55:10.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:55:10.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:55:10.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:55:10.760 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:55:11.094 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:55:11.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:55:11.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:55:11.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-29T02:55:11.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-29T02:55:11.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:55:11.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:55:41.314 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:55:41.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:55:41.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:55:41.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:55:41.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:55:41.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:55:41.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:55:41.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:55: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-29T02:55:41.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:55:41.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:55:41.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:55: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-29T02:55:44.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-29T02:55:44.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:55:44.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:55:44.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:55:44.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:55:44.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:55:44.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:55:44.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:55:44.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:55:44.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:55:44.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:55:44.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:55:44.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:55:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:55:44.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:55:44.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:55:44.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:55:44.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:55:44.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:55:44.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:55:44.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:55:44.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:55:44.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:55:44.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:55:44.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:55:28
2026-05-29T02:55:44.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70702, datetime.datetime(2026, 5, 29, 2, 55, 28), datetime.datetime(2026, 5, 29, 2, 55, 27), 'salt', 6.35, 89.05, None, 11.43, 118.7, 1.66, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:55:44.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:55:44.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:55:44.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:27, diff=17.769329s, valid=True
2026-05-29T02:55:44.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:55:44.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:55:44.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:12, diff=32.772581s, valid=True
2026-05-29T02:55:44.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:55:44.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:55:44.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:21, diff=23.77984s, valid=True
2026-05-29T02:55:44.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:55:44.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:55:44.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:55:44.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:55:44.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:55:44.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:55:44.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:12, diff=32.783201s, valid=True
2026-05-29T02:55:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:55:44.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:55:44.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:55:44.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948786.78394s, valid=True
2026-05-29T02:55:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:55:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:55:44.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:55:44.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:55:44.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:55:44.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:55:44.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:55:44.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:55:44.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:55:44.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:55:44.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:55:45.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:55:45.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:55:45.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:55:45.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:55:45.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:55:45.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:55:45.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:55:45.811 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:55:45.811 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T02:55:46.031 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:55:46.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:56:16.051 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:56:16.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:56:16.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:56:16.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:56:16.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:56:16.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:56:16.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:56:16.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:56:16.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-29T02:56:16.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:56:16.597 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:56:16.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:56:16.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-29T02:56:19.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:56:19.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:56:19.648 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:56:19.649 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:56:19.650 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:56:19.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:56:19.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:56:19.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:56:19.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:56:19.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:56:19.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:56:19.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:56:19.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:56:19.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:56:19.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:56:19.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:56:19.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:56:19.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:56:19.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:56:20.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:56:20.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:56:20.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:56:20.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:56:20.006 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:56:20.071 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:55:59
2026-05-29T02:56:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70703, datetime.datetime(2026, 5, 29, 2, 55, 59), datetime.datetime(2026, 5, 29, 2, 55, 58), 'salt', 6.35, 89.08, None, 11.86, 117.29, 1.66, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:56:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:56:20.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:56:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:58, diff=22.078463s, valid=True
2026-05-29T02:56:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:56:20.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:56:20.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:12, diff=8.081851s, valid=True
2026-05-29T02:56:20.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:56:20.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:56:20.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:55:52, diff=28.089509s, valid=True
2026-05-29T02:56:20.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:56:20.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:56:20.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:56:20.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:56:20.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:56:20.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:56:20.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:12, diff=8.093125s, valid=True
2026-05-29T02:56:20.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:56:20.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:56:20.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:56:20.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948822.093903s, valid=True
2026-05-29T02:56:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:56:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:56:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:56:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:56:20.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:56:20.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:56:20.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:56:20.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:56:20.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:56:20.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:56:20.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:56:20.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:56:20.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:56:20.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:56:20.630 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:56:20.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:56:21.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:56:21.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:56:21.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:56:21.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-29T02:56:21.240 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:56:21.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:56:51.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:56:51.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:56:51.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:56:51.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:56:51.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:56:51.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:56:51.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-29T02:56:51.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:56:51.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-29T02:56:51.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:56:51.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:56:51.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:56:51.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-29T02:56:54.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T02:56:54.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:56:54.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:56:54.679 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:56:54.679 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:56:54.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:56:54.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:56:54.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:56:54.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:56:54.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:56:54.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:56:54.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:56:54.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:56:54.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:56:54.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:56:54.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:56:54.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:56:54.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:56:54.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:56:54.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T02:56:54.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:56:54.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:56:54.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:56:54.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:56:55.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:56:29
2026-05-29T02:56:55.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70704, datetime.datetime(2026, 5, 29, 2, 56, 29), datetime.datetime(2026, 5, 29, 2, 56, 29), 'salt', 6.25, 89.04, None, 11.43, 116.59, 1.66, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:56:55.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:56:55.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:56:55.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:29, diff=26.064556s, valid=True
2026-05-29T02:56:55.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:56:55.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:56:55.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:12, diff=43.067901s, valid=True
2026-05-29T02:56:55.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:56:55.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:22, diff=33.075544s, valid=True
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:56:55.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:56:55.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T02:56:55.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:12, diff=43.079065s, valid=True
2026-05-29T02:56:55.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:56:55.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:56:55.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:56:55.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948857.079837s, valid=True
2026-05-29T02:56:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:56:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:56:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:56:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:56:55.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:56:55.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:56:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:56:55.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:56:55.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:56:55.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:56:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:56:55.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:56:55.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:56:55.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:56:55.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:56:56.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:56:56.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:56:56.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:56:56.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T02:56:56.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-29T02:56:56.293 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:56:56.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:57:26.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:57:26.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:57:26.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:57:26.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:57:26.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:57:26.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:57:26.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-29T02:57:26.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:57:26.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-29T02:57:26.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:57:26.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:57:26.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:57:26.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T02:57:29.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-29T02:57:29.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:57:29.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:57:29.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:57:29.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:57:29.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:57:29.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:57:29.562 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:57:29.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:57:29.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:57:29.563 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:57:29.564 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:57:29.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:57:29.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T02:57:29.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:57:29.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T02:57:29.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:57:29.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:57:29.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:57:29.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:57:29.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:57:29.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:57:29.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:57:29.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:57:29.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:56:59
2026-05-29T02:57:29.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70705, datetime.datetime(2026, 5, 29, 2, 56, 59), datetime.datetime(2026, 5, 29, 2, 56, 59), 'salt', 6.32, 89.08, None, 11.22, 115.62, 1.66, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:57:29.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:57:29.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T02:57:29.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:59, diff=30.921455s, valid=True
2026-05-29T02:57:29.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:57:29.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:57:29.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:57:12, diff=17.924527s, valid=True
2026-05-29T02:57:29.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:57:29.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:56:52, diff=37.931405s, valid=True
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:57:29.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:57:29.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:57:12, diff=17.934517s, valid=True
2026-05-29T02:57:29.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:57:29.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:57:29.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:57:29.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948891.935201s, valid=True
2026-05-29T02:57:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:57:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:57:29.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:57:29.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:57:29.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:57:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:57:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:57:29.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:57:30.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:57:30.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:57:30.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:57:30.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:57:30.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:57:30.302 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:57:30.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:57:30.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:57:31.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:57:31.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:57:31.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-29T02:57:31.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-29T02:57:34.791 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:57:34.791 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:58:04.822 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:58:04.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:58:04.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:58:05.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:58:05.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:58:05.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:58:05.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-29T02:58:05.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:58:05.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-29T02:58:05.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:58:05.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:58:05.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:58:05.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-29T02:58:08.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-29T02:58:08.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:58:08.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:58:08.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:58:08.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:58:08.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:58:08.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:58:08.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:58:08.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:58:08.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:58:08.039 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:58:08.039 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:58:08.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:58:08.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:58:08.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:58:08.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:58:08.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:58:08.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:58:08.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:58:08.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:58:08.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:58:08.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:58:08.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:58:08.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:58:08.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:58:00
2026-05-29T02:58:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70707, datetime.datetime(2026, 5, 29, 2, 58), datetime.datetime(2026, 5, 29, 2, 58), 'salt', 6.35, 89.01, None, 10.52, 115.88, 1.67, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:58:08.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:58:08.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:58:08.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:00, diff=8.429007s, valid=True
2026-05-29T02:58:08.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:58:08.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:58:08.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:12, diff=-3.567615s, valid=True
2026-05-29T02:58:08.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:58:08.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:57:54, diff=14.440134s, valid=True
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:58:08.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:58:08.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:12, diff=-3.556269s, valid=True
2026-05-29T02:58:08.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:58:08.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:58:08.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:58:08.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948930.444512s, valid=True
2026-05-29T02:58:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:58:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:58:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:58:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:58:08.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:58:08.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:58:08.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:58:08.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:58:08.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:58:08.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:58:08.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:58:08.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:58:08.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:58:08.767 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:58:08.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:58:09.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:58:09.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:58:09.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:58:09.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-29T02:58:09.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-29T02:58:09.616 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:58:09.616 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:58:39.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:58:39.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:58:39.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:58:39.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:58:39.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:58:40.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:58:40.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T02:58:40.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:58:40.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-29T02:58:40.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:58:40.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:58:40.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:58:40.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-29T02:58:43.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-29T02:58:43.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:58:43.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:58:43.062 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:58:43.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:58:43.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:58:43.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:58:43.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:58:43.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:58:43.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:58:43.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:58:43.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:58:43.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:58:43.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:58:43.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:58:43.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:58:43.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:58:43.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:58:43.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:58:43.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:58:43.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:58:43.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:58:43.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:58:43.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:58:43.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:58:30
2026-05-29T02:58:43.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70708, datetime.datetime(2026, 5, 29, 2, 58, 30), datetime.datetime(2026, 5, 29, 2, 58, 30), 'salt', 6.42, 88.95, None, 10.55, 116.07, 1.68, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:58:43.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:58:43.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:58:43.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:30, diff=13.479821s, valid=True
2026-05-29T02:58:43.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:58:43.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:58:43.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:12, diff=31.483288s, valid=True
2026-05-29T02:58:43.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:58:43.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:26, diff=17.491178s, valid=True
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:58:43.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:58:43.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:12, diff=31.494938s, valid=True
2026-05-29T02:58:43.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:58:43.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:58:43.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:58:43.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=948965.495757s, valid=True
2026-05-29T02:58:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:58:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:58:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:58:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:58:43.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:58:43.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:58:43.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:58:43.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:58:43.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:58:43.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:58:43.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:58:43.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:58:43.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:58:43.821 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:58:44.025 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:58:44.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:58:44.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:58:44.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:58:44.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-29T02:58:44.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-29T02:58:44.709 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:58:44.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:59:14.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:59:14.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:59:14.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:59:15.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:59:15.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:59:15.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:59:15.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-29T02:59:15.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:59:15.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-29T02:59:15.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:59:15.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:59:15.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:59:15.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-29T02:59:18.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-29T02:59:18.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:59:18.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:59:18.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:59:18.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:59:18.104 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:59:18.120 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:59:18.121 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:59:18.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:59:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:59:18.122 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:59:18.122 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:59:18.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:59:18.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:59:18.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:59:18.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:59:18.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:59:18.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:59:18.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:59:18.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:59:18.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:59:18.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:59:18.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:59:18.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:59:18.497 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:59:00
2026-05-29T02:59:18.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70709, datetime.datetime(2026, 5, 29, 2, 59), datetime.datetime(2026, 5, 29, 2, 59), 'salt', 6.35, 88.78, None, 10.62, 116.66, 1.71, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:59:18.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:59:18.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:59:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:00, diff=18.505163s, valid=True
2026-05-29T02:59:18.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:59:18.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:59:18.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:12, diff=6.50869s, valid=True
2026-05-29T02:59:18.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:59:18.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:59:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:58:57, diff=21.516652s, valid=True
2026-05-29T02:59:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:59:18.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:59:18.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:59:18.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:59:18.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:59:18.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:59:18.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:12, diff=6.520307s, valid=True
2026-05-29T02:59:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:59:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:59:18.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:59:18.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949000.521127s, valid=True
2026-05-29T02:59:18.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:59:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:59:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:59:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:59:18.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:59:18.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:59:18.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:59:18.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:59:18.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:59:18.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:59:18.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:59:18.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:59:18.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:59:18.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:59:19.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:59:19.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:59:19.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:59:19.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:59:19.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-29T02:59:19.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-29T02:59:19.671 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:59:19.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T02:59:49.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T02:59:49.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T02:59:49.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T02:59:49.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T02:59:49.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T02:59:50.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T02:59: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-29T02:59:50.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T02:59:50.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T02:59:50.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T02:59:50.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T02:59:50.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T02:59:50.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-29T02:59:52.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-29T02:59:52.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T02:59:52.741 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T02:59:52.742 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T02:59:52.742 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T02:59:52.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T02:59:52.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T02:59:52.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T02:59:52.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T02:59:52.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T02:59:52.767 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T02:59:52.767 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T02:59:52.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T02:59:52.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T02:59:52.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T02:59:52.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T02:59:52.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:59:53.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:59:53.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T02:59:53.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T02:59:53.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T02:59:53.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T02:59:53.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T02:59:53.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T02:59:53.146 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 02:59:31
2026-05-29T02:59:53.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70710, datetime.datetime(2026, 5, 29, 2, 59, 31), datetime.datetime(2026, 5, 29, 2, 59, 30), 'salt', 6.35, 88.78, None, 10.45, 117.74, 1.7, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T02:59:53.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T02:59:53.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T02:59:53.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:30, diff=23.153927s, valid=True
2026-05-29T02:59:53.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T02:59:53.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:59:53.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:12, diff=41.15735s, valid=True
2026-05-29T02:59:53.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T02:59:53.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:28, diff=25.165204s, valid=True
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T02:59:53.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T02:59:53.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 02:59:12, diff=41.168844s, valid=True
2026-05-29T02:59:53.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T02:59:53.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T02:59:53.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T02:59:53.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949035.169645s, valid=True
2026-05-29T02:59:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T02:59:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T02:59:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T02:59:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T02:59:53.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T02:59:53.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T02:59:53.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T02:59:53.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T02:59:53.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T02:59:53.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T02:59:53.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T02:59:53.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T02:59:53.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T02:59:53.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T02:59:53.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:59:54.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T02:59:54.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T02:59:54.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T02:59:54.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-29T02:59:54.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-29T02:59:54.483 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T02:59:54.483 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:00:24.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:00:24.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:00:24.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:00:24.679 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:00:24.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:00:24.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:00:24.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-29T03:00:24.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:00:24.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-29T03:00:24.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:00:24.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:00:24.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:00:24.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-29T03:00:27.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-29T03:00:27.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:00:27.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:00:27.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:00:27.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:00:27.519 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:00:27.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:00:27.532 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:00:27.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:00:27.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:00:27.533 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:00:27.533 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:00:27.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:00:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:00:27.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:00:27.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:00:27.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:00:27.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:00:27.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:00:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:00:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:00:27.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:00:27.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:00:27.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:00:27.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:00:01
2026-05-29T03:00:27.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70711, datetime.datetime(2026, 5, 29, 3, 0, 1), datetime.datetime(2026, 5, 29, 3, 0), 'salt', 6.32, 88.68, None, 10.13, 118.11, 1.72, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:00:27.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:00:27.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:00:27.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:00:00, diff=27.92246s, valid=True
2026-05-29T03:00:27.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:00:27.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:00:27.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:00:12, diff=15.926042s, valid=True
2026-05-29T03:00:27.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:00:27.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:00:27.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:00:00, diff=27.934584s, valid=True
2026-05-29T03:00:27.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:00:27.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:00:27.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:00:27.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:00:27.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:00:27.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:00:27.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:00:12, diff=15.938278s, valid=True
2026-05-29T03:00:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:00:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:00:27.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:00:27.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949069.939088s, valid=True
2026-05-29T03:00:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:00:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:00:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:00:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:00:27.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:00:28.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:00:28.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:00:28.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:00:28.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:00:28.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:00:28.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:00:28.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:00:28.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:00:28.273 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:00:28.509 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:00:28.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:00:28.962 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:00:28.962 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:00:28.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-29T03:00:28.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-29T03:00:29.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:00:29.145 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:00:59.158 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:00:59.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:00:59.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:00:59.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:00:59.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:00:59.776 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:00:59.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-29T03:00:59.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:00:59.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-29T03:00:59.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:00:59.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:00:59.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:00:59.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-29T03:01:02.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:01:02.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:01:02.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:01:02.270 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:01:02.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:01:02.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:01:02.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:01:02.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:01:02.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:01:02.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:01:02.296 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:01:02.296 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:01:02.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:01:02.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:01:02.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:01:02.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:01:02.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:01:02.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:01:02.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:01:02.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:01:02.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:01:02.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:01:02.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:01:02.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:01:02.668 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:01:01
2026-05-29T03:01:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70713, datetime.datetime(2026, 5, 29, 3, 1, 1), datetime.datetime(2026, 5, 29, 3, 1, 1), 'salt', 6.35, 88.58, None, 10.23, 118.7, 1.74, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:01:02.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:01:02.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:01:02.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:01, diff=1.675994s, valid=True
2026-05-29T03:01:02.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:01:02.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:01:02.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=-9.320626s, valid=True
2026-05-29T03:01:02.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:01:02.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:00:54, diff=8.687127s, valid=True
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:01:02.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:01:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=-9.309253s, valid=True
2026-05-29T03:01:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:01:02.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:01:02.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:01:02.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949104.691511s, valid=True
2026-05-29T03:01:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:01:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:01:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:01:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:01:02.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:01:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:01:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:01:02.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:01:02.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:01:02.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:01:02.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:01:02.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:01:02.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:01:03.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:01:03.299 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:01:03.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:01:03.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:01:03.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:01:03.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-29T03:01:03.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-29T03:01:03.898 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:01:03.898 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:01:33.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:01:33.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:01:33.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:01:34.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:01:34.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:01:34.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:01:34.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-29T03:01:34.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:01:34.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-29T03:01:34.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:01:34.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:01:34.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:01:34.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-29T03:01:36.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-29T03:01:36.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:01:36.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:01:36.986 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:01:36.986 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:01:36.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:01:37.009 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:01:37.009 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:01:37.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:01:37.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:01:37.010 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:01:37.011 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:01:37.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:01:37.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:01:37.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:01:37.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:01:37.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:01:37.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:01:37.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:01:37.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T03:01:37.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:01:37.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:01:37.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:01:37.329 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:01:37.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:01:32
2026-05-29T03:01:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70714, datetime.datetime(2026, 5, 29, 3, 1, 32), datetime.datetime(2026, 5, 29, 3, 1, 31), 'salt', 6.45, 88.48, None, 10.52, 119.24, 1.75, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:01:37.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:01:37.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:01:37.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:31, diff=6.396373s, valid=True
2026-05-29T03:01:37.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:01:37.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:01:37.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=25.39983s, valid=True
2026-05-29T03:01:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:01:37.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:01:37.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:24, diff=13.407723s, valid=True
2026-05-29T03:01:37.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:01:37.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:01:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:01:37.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:01:37.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T03:01:37.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=25.411337s, valid=True
2026-05-29T03:01:37.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:01:37.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:01:37.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:01:37.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949139.41215s, valid=True
2026-05-29T03:01:37.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:01:37.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:01:37.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:01:37.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:01:37.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:01:37.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:01:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:01:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:01:37.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:01:37.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:01:37.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:01:37.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:01:37.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:01:37.735 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:01:37.949 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:01:38.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:01:38.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:01:38.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:01:38.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-29T03:01:38.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-29T03:01:38.589 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:01:38.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:02:08.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:02:08.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:02:08.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:02:08.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:02:08.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:02:09.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:02:09.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-29T03:02:09.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:02:09.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-29T03:02:09.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:02:09.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:02:09.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:02:09.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-29T03:02:11.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:02:11.883 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:02:11.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:02:11.891 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:02:11.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:02:11.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:02:11.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:02:11.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:02:11.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:02:11.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:02:11.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:02:11.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:02:11.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:02:12.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:02:12.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:02:12.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:02:12.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:02:12.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:02:12.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:02:12.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:02:12.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:02:12.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:02:12.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:02:12.248 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:02:12.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:02:02
2026-05-29T03:02:12.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70715, datetime.datetime(2026, 5, 29, 3, 2, 2), datetime.datetime(2026, 5, 29, 3, 2, 1), 'salt', 6.42, 88.28, None, 10.66, 119.19, 1.79, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:02:12.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:02:12.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:02:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:02:01, diff=11.31708s, valid=True
2026-05-29T03:02:12.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:02:12.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:02:12.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=60.320503s, valid=True
2026-05-29T03:02:12.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:02:12.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:55, diff=17.328406s, valid=True
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:02:12.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:02:12.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=60.332015s, valid=True
2026-05-29T03:02:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:02:12.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:02:12.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:02:12.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949174.332807s, valid=True
2026-05-29T03:02:12.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:02:12.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:02:12.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:02:12.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:02:12.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:02:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:02:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:02:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:02:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:02:12.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:02:12.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:02:12.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:02:12.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:02:12.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:02:12.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:02:13.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:02:13.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:02:13.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:02:13.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-29T03:02:13.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-29T03:02:13.570 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:02:13.614 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:02:43.639 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:02:43.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:02:43.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:02:44.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:02:44.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:02:44.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:02:44.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-29T03:02:44.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:02:44.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-29T03:02:44.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:02:44.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:02:44.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:02:44.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-29T03:02:47.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-29T03:02:47.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:02:47.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:02:47.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:02:47.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:02:47.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:02:47.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:02:47.192 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:02:47.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:02:47.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:02:47.193 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:02:47.193 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:02:47.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:02:47.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:02:47.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:02:47.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:02:47.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:02:47.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:02:47.466 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:02:47.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:02:47.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:02:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:02:47.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:02:47.513 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:02:47.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:02:32
2026-05-29T03:02:47.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70716, datetime.datetime(2026, 5, 29, 3, 2, 32), datetime.datetime(2026, 5, 29, 3, 2, 31), 'salt', 6.39, 88.12, None, 10.91, 118.58, 1.82, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:02:47.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:02:47.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:02:47.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:02:31, diff=16.580437s, valid=True
2026-05-29T03:02:47.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:02:47.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:02:47.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=95.583912s, valid=True
2026-05-29T03:02:47.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:02:47.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:02:47.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:02:26, diff=21.591856s, valid=True
2026-05-29T03:02:47.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:02:47.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:02:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:02:47.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:02:47.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:02:47.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:02:47.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=95.595452s, valid=True
2026-05-29T03:02:47.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:02:47.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:02:47.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:02:47.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949209.596246s, valid=True
2026-05-29T03:02:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:02:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:02:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:02:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:02:47.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:02:47.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:02:47.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:02:47.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:02:47.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:02:47.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:02:47.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:02:47.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:02:47.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:02:47.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:02:48.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:02:48.479 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:02:48.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:02:48.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:02:48.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-29T03:02:48.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-29T03:02:48.767 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:02:48.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:03:18.772 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:03:18.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:03:18.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:03:18.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:03:18.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:03:19.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:03:19.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-29T03:03:19.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:03:19.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-29T03:03:19.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:03:19.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:03:19.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:03:19.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-29T03:03:21.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-29T03:03:21.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:03:21.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:03:21.473 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:03:21.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:03:21.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:03:21.498 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:03:21.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:03:21.499 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:03:21.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:03:21.500 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:03:21.500 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:03:21.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:03:21.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:03:21.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:03:21.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:03:21.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:03:21.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:03:21.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:03:21.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:03:21.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:03:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:03:21.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:03:21.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:03:21.877 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:03:12
2026-05-29T03:03:21.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70717, datetime.datetime(2026, 5, 29, 3, 3, 12), datetime.datetime(2026, 5, 29, 3, 3, 1), 'salt', 6.35, 87.98, None, 10.91, 116.47, 1.83, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:03:21.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:03:21.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:03:21.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:03:01, diff=20.885341s, valid=True
2026-05-29T03:03:21.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:03:21.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:03:21.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=129.88895s, valid=True
2026-05-29T03:03:21.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:03:21.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:02:58, diff=23.897126s, valid=True
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:03:21.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:03:21.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:01:12, diff=129.900903s, valid=True
2026-05-29T03:03:21.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:03:21.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:03:21.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:03:21.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949243.901751s, valid=True
2026-05-29T03:03:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:03:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:03:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:03:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:03:21.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:03:21.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:03:21.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:03:21.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:03:21.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:03:22.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:03:22.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:03:22.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:03:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:03:22.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:03:22.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:03:22.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:03:22.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:03:22.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:03:22.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-29T03:03:22.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-29T03:03:23.194 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:03:23.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:03:53.225 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:03:53.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:03:53.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:03:53.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:03:53.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:03:53.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:03:53.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-29T03:03:53.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:03:53.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-29T03:03:53.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:03:53.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:03:53.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:03:53.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-29T03:03:56.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-29T03:03:56.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:03:56.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:03:56.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:03:56.421 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:03:56.430 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:03:56.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:03:56.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:03:56.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:03:56.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:03:56.445 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:03:56.445 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:03:56.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:03:56.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:03:56.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:03:56.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:03:56.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:03:56.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:03:56.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:03:56.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:03:56.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:03:56.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:03:56.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:03:56.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:03:56.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:03:43
2026-05-29T03:03:56.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70718, datetime.datetime(2026, 5, 29, 3, 3, 43), datetime.datetime(2026, 5, 29, 3, 3, 42), 'salt', 6.29, 87.78, None, 10.76, 119.57, 1.87, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:03:56.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:03:56.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:03:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:03:42, diff=14.839665s, valid=True
2026-05-29T03:03:56.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:03:56.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:03:56.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=-15.15694s, valid=True
2026-05-29T03:03:56.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:03:56.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:03:56.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:03:40, diff=16.850893s, valid=True
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:03:56.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:03:56.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=-15.145468s, valid=True
2026-05-29T03:03:56.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:03:56.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:03:56.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:03:56.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949278.85534s, valid=True
2026-05-29T03:03:56.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:03:56.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:03:56.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:03:56.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:03:56.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:03:56.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:03:56.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:03:56.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:03:56.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:03:56.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:03:57.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:03:57.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:03:57.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:03:57.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:03:57.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:03:57.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:03:57.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:03:57.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:03:57.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-29T03:03:57.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-29T03:03:58.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:03:58.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:04:28.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:04:28.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:04:28.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:04:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:04:28.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:04:28.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:04:28.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-29T03:04:28.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:04:28.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-29T03:04:28.489 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:04:28.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:04:28.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:04:28.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-29T03:04:30.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-29T03:04:30.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:04:30.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:04:30.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:04:30.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:04:30.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:04:30.891 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:04:30.892 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:04:30.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:04:30.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:04:30.893 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:04:30.893 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:04:30.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:04:31.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:04:31.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:04:31.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:04:31.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:04:31.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:04:31.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:04:31.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:04:31.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:04:31.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:04:31.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:04:31.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:04:31.296 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:04:13
2026-05-29T03:04:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70719, datetime.datetime(2026, 5, 29, 3, 4, 13), datetime.datetime(2026, 5, 29, 3, 4, 12), 'salt', 6.45, 87.88, None, 10.98, 118.07, 1.85, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:04:31.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:04:31.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:04:31.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=19.302992s, valid=True
2026-05-29T03:04:31.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:04:31.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:04:31.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=19.306201s, valid=True
2026-05-29T03:04:31.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:04:31.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:04:31.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=19.313626s, valid=True
2026-05-29T03:04:31.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:04:31.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:04:31.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:04:31.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:04:31.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:04:31.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:04:31.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:12, diff=19.317066s, valid=True
2026-05-29T03:04:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:04:31.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:04:31.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:04:31.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949313.317826s, valid=True
2026-05-29T03:04:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:04:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:04:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:04:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:04:31.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:04:31.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:04:31.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:04:31.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:04:31.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:04:31.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:04:31.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:04:31.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:04:31.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:04:31.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:04:31.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:04:32.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:04:32.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:04:32.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:04:32.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-29T03:04:32.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-29T03:04:32.559 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:04:32.559 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:05:02.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:05:02.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:05:02.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:05:03.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:05:03.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:05:03.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:05:03.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:05:03.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:05: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-29T03:05:03.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:05:03.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:05:03.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:05:03.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-29T03:05:05.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-29T03:05:05.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:05:05.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:05:05.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:05:05.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:05:05.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:05:05.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:05:05.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:05:05.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:05:05.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:05:05.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:05:05.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:05:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:05:05.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:05:05.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:05:05.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:05:05.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:05:05.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:05:05.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:05:05.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:05:05.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:05:05.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:05:05.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:05:05.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:05:06.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:04:44
2026-05-29T03:05:06.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70720, datetime.datetime(2026, 5, 29, 3, 4, 44), datetime.datetime(2026, 5, 29, 3, 4, 44), 'salt', 6.39, 87.85, None, 11.15, 117.38, 1.86, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:05:06.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:05:06.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:05:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:44, diff=22.040231s, valid=True
2026-05-29T03:05:06.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:05:06.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:05:06.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:12, diff=-5.956136s, valid=True
2026-05-29T03:05:06.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:05:06.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:04:43, diff=23.052021s, valid=True
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:05:06.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:05:06.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:12, diff=-5.94421s, valid=True
2026-05-29T03:05:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:05:06.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:05:06.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:05:06.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949348.056605s, valid=True
2026-05-29T03:05:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:05:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:05:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:05:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:05:06.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:05:06.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:05:06.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:05:06.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:05:06.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:05:06.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:05:06.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:05:06.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:05:06.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:05:06.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:05:06.594 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:05:06.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:05:07.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:05:07.097 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:05:07.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-29T03:05:07.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-29T03:05:07.283 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:05:07.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:05:37.294 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:05:37.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:05:37.295 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:05:37.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:05:37.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:05:37.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:05:37.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:05:37.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:05:37.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-29T03:05:37.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:05:37.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:05:37.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:05:37.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-29T03:05:40.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-29T03:05:40.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:05:40.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:05:40.320 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:05:40.320 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:05:40.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:05:40.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:05:40.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:05:40.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:05:40.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:05:40.344 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:05:40.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:05:40.352 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:05:40.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:05:40.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:05:40.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:05:40.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:05:40.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:05:40.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:05:40.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:05:40.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:05:40.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:05:40.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:05:40.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:05:40.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:05:14
2026-05-29T03:05:40.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70721, datetime.datetime(2026, 5, 29, 3, 5, 14), datetime.datetime(2026, 5, 29, 3, 5, 14), 'salt', 6.45, 87.75, None, 10.94, 117.1, 1.87, 831.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:05:40.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:05:40.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:05:40.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:14, diff=26.796171s, valid=True
2026-05-29T03:05:40.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:05:40.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:05:40.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:12, diff=28.799705s, valid=True
2026-05-29T03:05:40.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:05:40.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:06, diff=34.807979s, valid=True
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:05:40.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:05:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:12, diff=28.811703s, valid=True
2026-05-29T03:05:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:05:40.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:05:40.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:05:40.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949382.81253s, valid=True
2026-05-29T03:05:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:05:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:05:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:05:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:05:40.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:05:40.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:05:40.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:05:40.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:05:40.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:05:40.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:05:41.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:05:41.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:05:41.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:05:41.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:05:41.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:05:41.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:05:41.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:05:41.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:05:41.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-29T03:05:41.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-29T03:05:42.025 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:05:42.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:06:12.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:06:12.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:06: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-29T03:06:12.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:06:12.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:06:12.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:06:12.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-29T03:06:12.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:06:12.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-29T03:06:12.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:06:12.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:06:12.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:06:12.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-29T03:06:15.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-29T03:06:15.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:06:15.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:06:15.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:06:15.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:06:15.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:06:15.177 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:06:15.177 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:06:15.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:06:15.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:06:15.178 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:06:15.179 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:06:15.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:06:15.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:06:15.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:06:15.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:06:15.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:06:15.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:06:15.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:06:15.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:06:15.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:06:15.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:06:15.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:06:15.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:06:15.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:05:45
2026-05-29T03:06:15.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70722, datetime.datetime(2026, 5, 29, 3, 5, 45), datetime.datetime(2026, 5, 29, 3, 5, 44), 'salt', 6.45, 87.78, None, 11.05, 115.53, 1.87, 831.81, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:06:15.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:06:15.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:06:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:44, diff=31.563173s, valid=True
2026-05-29T03:06:15.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:06:15.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:06:15.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:06:12, diff=3.566491s, valid=True
2026-05-29T03:06:15.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:06:15.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:05:36, diff=39.57436s, valid=True
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:06:15.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:06:15.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:06:12, diff=3.577969s, valid=True
2026-05-29T03:06:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:06:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:06:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:06:15.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949417.578757s, valid=True
2026-05-29T03:06:15.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:06:15.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:06:15.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:06:15.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:06:15.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:06:15.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:06:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:06:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:06:15.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:06:15.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:06:15.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:06:15.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:06:15.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:06:15.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:06:16.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:06:16.529 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:06:16.628 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:06:16.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:06:16.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-29T03:06:16.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-29T03:06:16.716 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:06:16.716 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:06:46.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:06:46.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:06:46.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:06:47.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:06:47.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:06:47.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:06:47.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-29T03:06:47.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:06:47.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-29T03:06:47.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:06:47.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:06:47.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:06:47.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-29T03:06:49.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:06:49.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:06:49.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:06:49.736 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:06:49.736 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:06:49.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:06:49.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:06:49.759 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:06:49.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:06:49.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:06:49.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:06:49.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:06:49.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:06:49.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:06:49.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:06:49.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:06:49.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:06:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:06:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:06:50.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:06:50.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:06:50.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:06:50.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:06:50.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:06:50.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:06:46
2026-05-29T03:06:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70724, datetime.datetime(2026, 5, 29, 3, 6, 46), datetime.datetime(2026, 5, 29, 3, 6, 45), 'salt', 6.45, 87.68, None, 10.8, 116.09, 1.88, 831.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:06:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:06:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:06:50.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:06:45, diff=5.123721s, valid=True
2026-05-29T03:06:50.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:06:50.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:06:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:12, diff=-21.873007s, valid=True
2026-05-29T03:06:50.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:06:50.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:06:50.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:06:39, diff=11.133857s, valid=True
2026-05-29T03:06:50.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:06:50.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:06:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:06:50.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:06:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:06:50.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:06:50.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:12, diff=-21.863016s, valid=True
2026-05-29T03:06:50.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:06:50.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:06:50.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:06:50.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949452.137658s, valid=True
2026-05-29T03:06:50.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:06:50.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:06:50.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:06:50.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:06:50.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:06:50.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:06:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:06:50.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:06:50.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:06:50.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:06:50.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:06:50.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:06:50.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:06:50.460 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:06:50.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:06:51.039 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:06:51.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:06:51.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:06:51.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-29T03:06:51.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-29T03:06:51.325 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:06:51.325 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:07:21.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:07:21.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:07:21.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:07:21.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:07:21.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:07:21.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:07:21.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-29T03:07:21.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:07:21.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-29T03:07:21.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:07:21.709 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:07:21.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:07:21.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-29T03:07:24.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-29T03:07:24.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:07:24.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:07:24.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:07:24.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:07:24.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:07:24.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:07:24.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:07:24.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:07:24.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:07:24.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:07:24.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:07:24.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:07:24.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:07:24.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:07:24.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:07:24.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:07:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:07:24.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:07:24.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:07:24.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:07:24.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:07:24.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:07:24.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:07:24.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:07:17
2026-05-29T03:07:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70725, datetime.datetime(2026, 5, 29, 3, 7, 17), datetime.datetime(2026, 5, 29, 3, 7, 15), 'salt', 6.52, 87.59, None, 10.73, 111.33, 1.9, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:07:24.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:07:24.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:07:24.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:15, diff=9.416309s, valid=True
2026-05-29T03:07:24.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:07:24.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:07:24.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:12, diff=12.419714s, valid=True
2026-05-29T03:07:24.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:07:24.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:07:24.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:10, diff=14.427543s, valid=True
2026-05-29T03:07:24.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:07:24.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:07:24.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:07:24.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:07:24.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:07:24.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:07:24.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:12, diff=12.431189s, valid=True
2026-05-29T03:07:24.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:07:24.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:07:24.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:07:24.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949486.431976s, valid=True
2026-05-29T03:07:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:07:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:07:24.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:07:24.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:07:24.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:07:24.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:07:24.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:07:24.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:07:24.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:07:24.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:07:24.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:07:24.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:07:24.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:07:24.825 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:07:25.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:07:25.378 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:07:25.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:07:25.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:07:25.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-29T03:07:25.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-29T03:07:25.662 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:07:25.662 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:07:55.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:07:55.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:07:55.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:07:56.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:07:56.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:07:56.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:07:56.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-29T03:07:56.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:07:56.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-29T03:07:56.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:07:56.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:07:56.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:07:56.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-29T03:07:58.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-29T03:07:58.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:07:58.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:07:58.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:07:58.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:07:58.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:07:58.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:07:58.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:07:58.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:07:58.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:07:58.966 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:07:58.966 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:07:58.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:07:59.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:07:59.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:07:59.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:07:59.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:07:59.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:07:59.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:07:59.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:07:59.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:07:59.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:07:59.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:07:59.272 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:07:59.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:07:47
2026-05-29T03:07:59.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70726, datetime.datetime(2026, 5, 29, 3, 7, 47), datetime.datetime(2026, 5, 29, 3, 7, 46), 'salt', 6.52, 87.42, None, 11.22, 112.85, 1.93, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:07:59.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:07:59.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:07:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:46, diff=13.338985s, valid=True
2026-05-29T03:07:59.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:07:59.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:07:59.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:12, diff=-12.657633s, valid=True
2026-05-29T03:07:59.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:07:59.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:07:41, diff=18.350164s, valid=True
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:07:59.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:07:59.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:12, diff=-12.646225s, valid=True
2026-05-29T03:07:59.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:07:59.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:07:59.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:07:59.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949521.354563s, valid=True
2026-05-29T03:07:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:07:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:07:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:07:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:07:59.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:07:59.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:07:59.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:07:59.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:07:59.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:07:59.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:07:59.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:07:59.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:07:59.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:07:59.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:07:59.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:08:00.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:08:00.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:08:00.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:08:00.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-29T03:08:00.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-29T03:08:01.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:08:01.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:08:31.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:08:31.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:08:31.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:08:31.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:08:31.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:08:31.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:08:31.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-29T03:08:31.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:08:31.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-29T03:08:31.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:08:31.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:08:31.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:08:31.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-29T03:08:33.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-29T03:08:33.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:08:33.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:08:33.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:08:33.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:08:33.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:08:33.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:08:33.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:08:33.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:08:33.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:08:33.978 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:08:33.978 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:08:33.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:08:34.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:08:34.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:08:34.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:08:34.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:08:34.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:08:34.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:08:34.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:08:34.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:08:34.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:08:34.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:08:34.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:08:34.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:08:18
2026-05-29T03:08:34.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70727, datetime.datetime(2026, 5, 29, 3, 8, 18), datetime.datetime(2026, 5, 29, 3, 8, 17), 'salt', 6.52, 87.39, None, 11.05, 111.91, 1.94, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:08:34.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:08:34.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:08:34.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:17, diff=17.368217s, valid=True
2026-05-29T03:08:34.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:08:34.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:08:34.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:12, diff=22.371662s, valid=True
2026-05-29T03:08:34.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:08:34.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:08:34.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:13, diff=21.379642s, valid=True
2026-05-29T03:08:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:08:34.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:08:34.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:08:34.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:08:34.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:08:34.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:08:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:12, diff=22.383255s, valid=True
2026-05-29T03:08:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:08:34.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:08:34.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:08:34.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949556.384053s, valid=True
2026-05-29T03:08:34.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:08:34.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:08:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:08:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:08:34.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:08:34.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:08:34.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:08:34.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:08:34.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:08:34.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:08:34.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:08:34.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:08:34.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:08:34.776 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:08:34.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:08:35.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:08:35.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:08:35.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:08:35.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-29T03:08:35.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-29T03:08:35.588 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:08:35.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:09:05.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:09:05.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:09:05.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:09:05.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:09:05.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:09:06.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:09:06.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-29T03:09:06.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:09:06.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-29T03:09:06.166 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:09:06.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:09:06.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:09:06.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-29T03:09:08.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-29T03:09:08.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:09:08.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:09:08.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:09:08.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:09:08.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:09:08.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:09:08.605 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:09:08.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:09:08.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:09:08.606 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:09:08.606 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:09:08.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:09:08.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:09:08.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:09:08.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:09:08.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:09:08.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:09:08.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:09:08.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:09:08.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:09:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:09:08.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:09:08.939 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:09:09.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:08:48
2026-05-29T03:09:09.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70728, datetime.datetime(2026, 5, 29, 3, 8, 48), datetime.datetime(2026, 5, 29, 3, 8, 48), 'salt', 6.52, 87.25, None, 10.91, 111.16, 1.96, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:09:09.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:09:09.005 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:09:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:48, diff=21.01273s, valid=True
2026-05-29T03:09:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:09:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:09:09.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:12, diff=-2.983835s, valid=True
2026-05-29T03:09:09.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:09:09.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:08:44, diff=25.024107s, valid=True
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:09:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:09:09.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:12, diff=-2.972227s, valid=True
2026-05-29T03:09:09.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:09:09.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:09:09.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:09:09.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949591.028561s, valid=True
2026-05-29T03:09:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:09:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:09:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:09:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:09:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:09:09.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:09:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:09:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:09:09.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:09:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:09:09.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:09:09.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:09:09.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:09:09.352 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:09:09.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:09:09.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:09:10.026 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:09:10.026 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:09:10.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-29T03:09:10.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-29T03:09:10.211 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:09:10.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:09:40.231 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:09:40.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:09:40.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:09:40.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:09:40.396 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:09:40.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:09:40.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-29T03:09:40.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:09:40.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:09:40.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:09:40.632 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:09:40.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:09:40.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-29T03:09: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-29T03:09:42.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:09:42.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:09:42.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:09:42.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:09:43.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:09:43.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:09:43.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:09:43.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:09:43.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:09:43.015 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:09:43.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:09:43.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:09:43.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:09:43.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:09:43.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:09:43.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:09:43.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:09:43.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:09:43.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:09:43.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:09:43.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:09:43.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:09:43.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:09:43.414 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:09:19
2026-05-29T03:09:43.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70729, datetime.datetime(2026, 5, 29, 3, 9, 19), datetime.datetime(2026, 5, 29, 3, 9, 18), 'salt', 6.52, 87.15, None, 10.94, 111.4, 1.98, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:09:43.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:09:43.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:09:43.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:18, diff=25.422138s, valid=True
2026-05-29T03:09:43.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:09:43.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:09:43.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:12, diff=31.425878s, valid=True
2026-05-29T03:09:43.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:09:43.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:16, diff=27.434164s, valid=True
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:09:43.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:09:43.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:12, diff=31.438047s, valid=True
2026-05-29T03:09:43.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:09:43.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:09:43.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:09:43.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949625.438902s, valid=True
2026-05-29T03:09:43.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:09:43.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:09:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:09:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:09:43.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:09:43.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:09:43.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:09:43.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:09:43.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:09:43.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:09:43.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:09:43.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:09:43.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:09:43.830 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:09:44.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:09:44.386 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:09:44.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:09:44.486 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:09:44.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-29T03:09:44.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-29T03:09:44.569 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:09:44.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:10:14.599 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:10:14.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:10:14.600 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:10:14.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:10:14.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:10:14.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:10:14.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-29T03:10:14.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:10:14.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-29T03:10:14.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:10:14.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:10:14.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:10:14.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-29T03:10:17.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-29T03:10:17.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:10:17.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:10:17.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:10:17.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:10:17.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:10:17.509 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:10:17.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:10:17.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:10:17.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:10:17.511 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:10:17.511 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:10:17.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:10:17.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:10:17.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:10:17.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:10:17.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:10:17.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:10:17.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:10:17.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:10:17.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:10:17.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:10:17.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:10:17.850 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:10:17.941 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:09:49
2026-05-29T03:10:17.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70730, datetime.datetime(2026, 5, 29, 3, 9, 49), datetime.datetime(2026, 5, 29, 3, 9, 49), 'salt', 6.52, 87.19, None, 10.73, 109.0, 1.97, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:10:17.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:10:17.941 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:10:17.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:49, diff=28.948449s, valid=True
2026-05-29T03:10:17.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:10:17.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:10:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:10:12, diff=5.952027s, valid=True
2026-05-29T03:10:17.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:10:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:10:17.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:09:49, diff=28.959953s, valid=True
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:10:17.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:10:17.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:10:12, diff=5.963708s, valid=True
2026-05-29T03:10:17.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:10:17.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:10:17.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:10:17.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949659.964532s, valid=True
2026-05-29T03:10:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:10:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:10:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:10:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:10:17.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:10:18.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:10:18.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:10:18.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:10:18.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:10:18.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:10:18.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:10:18.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:10:18.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:10:18.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:10:18.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:10:18.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:10:18.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:10:18.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:10:18.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-29T03:10:18.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-29T03:10:19.142 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:10:19.142 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:10:49.152 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:10:49.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:10:49.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:10:49.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:10:49.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:10:49.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:10:49.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-29T03:10:49.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:10:49.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-29T03:10:49.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:10:49.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:10:49.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:10:49.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-29T03:10:52.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-29T03:10:52.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:10:52.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:10:52.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:10:52.577 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:10:52.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:10:52.601 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:10:52.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:10:52.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:10:52.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:10:52.603 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:10:52.603 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:10:52.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:10:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:10:52.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:10:52.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:10:52.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:10:52.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:10:52.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:10:52.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:10:52.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:10:52.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:10:52.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:10:52.924 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:10:52.984 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:10:50
2026-05-29T03:10:52.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70732, datetime.datetime(2026, 5, 29, 3, 10, 50), datetime.datetime(2026, 5, 29, 3, 10, 49), 'salt', 6.55, 87.16, None, 11.47, 109.73, 1.97, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:10:52.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:10:52.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:10:52.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:10:49, diff=3.99211s, valid=True
2026-05-29T03:10:52.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:10:52.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:10:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:12, diff=-19.004425s, valid=True
2026-05-29T03:10:52.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:10:52.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:10:53.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:10:49, diff=4.003629s, valid=True
2026-05-29T03:10:53.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:10:53.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:10:53.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:10:53.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:10:53.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:10:53.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:10:53.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:12, diff=-18.992668s, valid=True
2026-05-29T03:10:53.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:10:53.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:10:53.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:10:53.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949695.00819s, valid=True
2026-05-29T03:10:53.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:10:53.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:10:53.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:10:53.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:10:53.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:10:53.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:10:53.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:10:53.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:10:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:10:53.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:10:53.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:10:53.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:10:53.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:10:53.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:10:53.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:10:53.886 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:10:53.986 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:10:53.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:10:53.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-29T03:10:53.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-29T03:10:54.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:10:54.245 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:11:24.261 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:11:24.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:11:24.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:11:24.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:11:24.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:11:24.644 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:11:24.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:11:24.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:11:24.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-29T03:11:24.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:11:24.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:11:24.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:11:24.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-29T03:11:27.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-29T03:11:27.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:11:27.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:11:27.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:11:27.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:11:27.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:11:27.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:11:27.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:11:27.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:11:27.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:11:27.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:11:27.137 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:11:27.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:11:27.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:11:27.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:11:27.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:11:27.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:11:27.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:11:27.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:11:27.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:11:27.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:11:27.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:11:27.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:11:27.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:11:27.516 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:11:20
2026-05-29T03:11:27.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70733, datetime.datetime(2026, 5, 29, 3, 11, 20), datetime.datetime(2026, 5, 29, 3, 11, 20), 'salt', 6.52, 87.06, None, 11.4, 107.22, 1.99, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:11:27.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:11:27.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:11:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:20, diff=7.523471s, valid=True
2026-05-29T03:11:27.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:11:27.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:11:27.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:12, diff=15.526917s, valid=True
2026-05-29T03:11:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:11:27.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:11:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:19, diff=8.534793s, valid=True
2026-05-29T03:11:27.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:11:27.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:11:27.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:11:27.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:11:27.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:11:27.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:11:27.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:12, diff=15.538417s, valid=True
2026-05-29T03:11:27.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:11:27.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:11:27.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:11:27.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949729.539247s, valid=True
2026-05-29T03:11:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:11:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:11:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:11:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:11:27.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:11:27.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:11:27.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:11:27.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:11:27.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:11:27.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:11:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:11:27.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:11:27.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:11:27.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:11:28.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:11:28.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:11:28.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:11:28.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:11:28.570 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:11:28.570 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:11:28.809 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:11:28.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:11:58.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:11:58.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:11:58.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:11:59.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:11:59.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:11:59.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:11:59.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-29T03:11:59.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:11:59.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:11:59.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:11:59.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:11:59.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:11:59.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-29T03:12:01.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-29T03:12:01.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:12:01.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:12:01.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:12:01.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:12:01.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:12:01.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:12:01.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:12:01.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:12:01.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:12:01.818 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:12:01.818 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:12:01.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:12:01.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:12:01.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:12:01.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:12:01.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:12:02.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:12:02.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:12:02.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:12:02.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:12:02.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:12:02.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:12:02.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:12:02.130 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:11:50
2026-05-29T03:12:02.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70734, datetime.datetime(2026, 5, 29, 3, 11, 50), datetime.datetime(2026, 5, 29, 3, 11, 50), 'salt', 6.52, 87.12, None, 11.26, 110.62, 1.98, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:12:02.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:12:02.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:12:02.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:50, diff=12.13664s, valid=True
2026-05-29T03:12:02.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:12:02.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:12:02.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:12, diff=-9.860608s, valid=True
2026-05-29T03:12:02.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:12:02.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:12:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:11:50, diff=12.145729s, valid=True
2026-05-29T03:12:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:12:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:12:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:12:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:12:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:12:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:12:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:12, diff=-9.851313s, valid=True
2026-05-29T03:12:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:12:02.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:12:02.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:12:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949764.149333s, valid=True
2026-05-29T03:12:02.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:12:02.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:12:02.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:12:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:12:02.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:12:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:12:02.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:12:02.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:12:02.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:12:02.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:12:02.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:12:02.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:12:02.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:12:02.466 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:12:02.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:12:03.045 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:12:03.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:12:03.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:12:03.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-29T03:12:03.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-29T03:12:03.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:12:03.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:12:33.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:12:33.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:12:33.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:12:33.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:12:33.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:12:33.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:12:33.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-29T03:12:33.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:12:33.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-29T03:12:33.937 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:12:33.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:12:33.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:12:33.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-29T03:12:36.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-29T03:12:36.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:12:36.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:12:36.398 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:12:36.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:12:36.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:12:36.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:12:36.426 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:12:36.427 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:12:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:12:36.428 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:12:36.428 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:12:36.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:12:36.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:12:36.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:12:36.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:12:36.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:12:36.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:12:36.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:12:36.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:12:36.751 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:12:36.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:12:36.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:12:36.756 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:12:36.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:12:21
2026-05-29T03:12:36.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70735, datetime.datetime(2026, 5, 29, 3, 12, 21), datetime.datetime(2026, 5, 29, 3, 12, 20), 'salt', 6.46, 87.12, None, 11.33, 112.85, 1.99, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:12:36.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:12:36.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:12:36.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:20, diff=16.823435s, valid=True
2026-05-29T03:12:36.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:12:36.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:12:36.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:12, diff=24.826884s, valid=True
2026-05-29T03:12:36.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:12:36.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:12:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:20, diff=16.834746s, valid=True
2026-05-29T03:12:36.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:12:36.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:12:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:12:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:12:36.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:12:36.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:12:36.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:12, diff=24.838324s, valid=True
2026-05-29T03:12:36.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:12:36.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:12:36.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:12:36.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949798.839113s, valid=True
2026-05-29T03:12:36.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:12:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:12:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:12:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:12:36.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:12:36.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:12:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:12:36.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:12:36.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:12:36.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:12:37.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:12:37.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:12:37.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:12:37.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:12:37.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:12:37.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:12:37.891 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:12:37.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:12:37.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-29T03:12:37.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-29T03:12:38.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:12:38.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:13:08.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:13:08.093 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:13:08.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:13:08.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:13:08.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:13:08.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:13:08.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-29T03:13:08.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:13:08.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-29T03:13:08.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:13:08.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:13:08.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:13:08.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-29T03:13:11.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:13:11.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:13:11.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:13:11.262 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:13:11.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:13:11.270 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:13:11.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:13:11.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:13:11.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:13:11.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:13:11.285 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:13:11.285 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:13:11.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:13:11.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:13:11.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:13:11.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:13:11.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:13:11.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:13:11.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:13:11.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:13:11.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:13:11.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:13:11.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:13:11.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:13:11.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:12:51
2026-05-29T03:13:11.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70736, datetime.datetime(2026, 5, 29, 3, 12, 51), datetime.datetime(2026, 5, 29, 3, 12, 51), 'salt', 6.52, 87.19, None, 11.22, 107.59, 1.97, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:13:11.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:13:11.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:13:11.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:51, diff=20.672497s, valid=True
2026-05-29T03:13:11.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:13:11.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:13:11.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:12, diff=-0.324008s, valid=True
2026-05-29T03:13:11.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:13:11.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:13:11.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:12:50, diff=21.683877s, valid=True
2026-05-29T03:13:11.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:13:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:13:11.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:13:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:13:11.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:13:11.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:13:11.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:12, diff=-0.31253s, valid=True
2026-05-29T03:13:11.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:13:11.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:13:11.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:13:11.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949833.688263s, valid=True
2026-05-29T03:13:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:13:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:13:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:13:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:13:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:13:11.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:13:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:13:11.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:13:11.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:13:11.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:13:11.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:13:11.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:13:11.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:13:12.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:13:12.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:13:12.584 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:13:12.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:13:12.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:13:12.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-29T03:13:12.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-29T03:13:12.866 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:13:12.867 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:13:42.897 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:13:42.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:13:42.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:13:43.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:13:43.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:13:43.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:13:43.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-29T03:13:43.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:13:43.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-29T03:13:43.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:13:43.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:13:43.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:13:43.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-29T03:13:45.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-29T03:13:45.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:13:45.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:13:45.817 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:13:45.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:13:45.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:13:45.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:13:45.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:13:45.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:13:45.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:13:45.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:13:45.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:13:45.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:13:45.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:13:45.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:13:46.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:13:46.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:13:46.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:13:46.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:13:46.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:13:46.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:13:46.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:13:46.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:13:46.161 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:13:46.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:13:21
2026-05-29T03:13:46.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70737, datetime.datetime(2026, 5, 29, 3, 13, 21), datetime.datetime(2026, 5, 29, 3, 13, 21), 'salt', 6.49, 87.19, None, 10.76, 105.79, 1.97, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:13:46.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:13:46.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:13:46.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:21, diff=25.230001s, valid=True
2026-05-29T03:13:46.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:13:46.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:13:46.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:12, diff=34.233415s, valid=True
2026-05-29T03:13:46.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:13:46.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:20, diff=26.241078s, valid=True
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:13:46.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:13:46.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:12, diff=34.244673s, valid=True
2026-05-29T03:13:46.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:13:46.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:13:46.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:13:46.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949868.245437s, valid=True
2026-05-29T03:13:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:13:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:13:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:13:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:13:46.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:13:46.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:13:46.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:13:46.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:13:46.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:13:46.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:13:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:13:46.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:13:46.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:13:46.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:13:46.905 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:13:47.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:13:47.347 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:13:47.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:13:47.347 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:13:47.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-29T03:13:47.544 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:13:47.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:14:17.545 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:14:17.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:14:17.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:14:17.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:14:17.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:14:18.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:14:18.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-29T03:14:18.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:14:18.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-29T03:14:18.031 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:14:18.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:14:18.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:14:18.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-29T03:14:20.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-29T03:14:20.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:14:20.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:14:20.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:14:20.462 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:14:20.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:14:20.486 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:14:20.487 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:14:20.487 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:14:20.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:14:20.488 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:14:20.488 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:14:20.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:14:20.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:14:20.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:14:20.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:14:20.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:14:20.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:14:20.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:14:20.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:14:20.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:14:20.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:14:20.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:14:20.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:14:20.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:13:51
2026-05-29T03:14:20.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70738, datetime.datetime(2026, 5, 29, 3, 13, 51), datetime.datetime(2026, 5, 29, 3, 13, 51), 'salt', 6.46, 87.35, None, 10.91, 108.67, 1.95, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:14:20.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:14:20.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:14:20.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:51, diff=29.860313s, valid=True
2026-05-29T03:14:20.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:14:20.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:14:20.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:14:12, diff=8.863543s, valid=True
2026-05-29T03:14:20.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:14:20.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:13:50, diff=30.871062s, valid=True
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:14:20.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:14:20.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:14:12, diff=8.874509s, valid=True
2026-05-29T03:14:20.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:14:20.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:14:20.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:14:20.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949902.875263s, valid=True
2026-05-29T03:14:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:14:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:14:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:14:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:14:20.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:14:20.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:14:20.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:14:20.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:14:20.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:14:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:14:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:14:21.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:14:21.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:14:21.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:14:21.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:14:21.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:14:21.863 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:14:21.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:14:21.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-29T03:14:21.864 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:14:22.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:14:22.020 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:14:52.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:14:52.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:14:52.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:14:52.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:14:52.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:14:52.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:14: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-29T03:14:52.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:14:52.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-29T03:14:52.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:14:52.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:14:52.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:14:52.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-29T03:14:54.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-29T03:14:54.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:14:54.964 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:14:54.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:14:54.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:14:54.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:14:54.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:14:54.990 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:14:54.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:14:54.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:14:54.991 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:14:54.991 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:14:54.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:14:55.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:14:55.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:14:55.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:14:55.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:14:55.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:14:55.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:14:55.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:14:55.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:14:55.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:14:55.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:14:55.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:14:55.379 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:14:52
2026-05-29T03:14:55.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70740, datetime.datetime(2026, 5, 29, 3, 14, 52), datetime.datetime(2026, 5, 29, 3, 14, 52), 'salt', 6.49, 87.49, None, 10.83, 108.2, 1.92, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:14:55.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:14:55.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:14:55.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:14:52, diff=3.386234s, valid=True
2026-05-29T03:14:55.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:14:55.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:14:55.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:12, diff=-16.610469s, valid=True
2026-05-29T03:14:55.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:14:55.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:14:51, diff=4.397173s, valid=True
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:14:55.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:14:55.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:12, diff=-16.599322s, valid=True
2026-05-29T03:14:55.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:14:55.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:14:55.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:14:55.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949937.401437s, valid=True
2026-05-29T03:14:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:14:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:14:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:14:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:14:55.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:14:55.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:14:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:14:55.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:14:55.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:14:55.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:14:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:14:55.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:14:55.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:14:55.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:14:56.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:14:56.414 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:14:56.514 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:14:56.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:14:56.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-29T03:14:56.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-29T03:14:56.793 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:14:56.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:15:26.824 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:15:26.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:15:26.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:15:26.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:15:26.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:15:27.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:15:27.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-29T03:15:27.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:15:27.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-29T03:15:27.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:15:27.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:15:27.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:15:27.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-29T03:15:29.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:15:29.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:15:29.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:15:29.493 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:15:29.493 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:15:29.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:15:29.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:15:29.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:15:29.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:15:29.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:15:29.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:15:29.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:15:29.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:15:29.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:15:29.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:15:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:15:29.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:15:29.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:15:29.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:15:29.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:15:29.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:15:29.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:15:29.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:15:29.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:15:29.848 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:15:22
2026-05-29T03:15:29.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70741, datetime.datetime(2026, 5, 29, 3, 15, 22), datetime.datetime(2026, 5, 29, 3, 15, 21), 'salt', 6.42, 87.39, None, 10.73, 105.67, 1.93, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:15:29.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:15:29.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:15:29.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:21, diff=8.858446s, valid=True
2026-05-29T03:15:29.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:15:29.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:15:29.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:12, diff=17.865232s, valid=True
2026-05-29T03:15:29.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:15:29.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:21, diff=8.876097s, valid=True
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:15:29.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:15:29.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:12, diff=17.879313s, valid=True
2026-05-29T03:15:29.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:15:29.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:15:29.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:15:29.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=949971.880112s, valid=True
2026-05-29T03:15:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:15:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:15:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:15:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:15:29.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:15:29.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:15:29.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:15:29.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:15:29.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:15:30.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:15:30.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:15:30.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:15:30.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:15:30.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:15:30.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:15:30.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:15:30.916 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:15:30.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:15:30.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-29T03:15:30.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-29T03:15:31.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:15:31.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:16:01.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:16:01.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:16:01.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:16:01.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:16:01.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:16:01.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:16:01.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-29T03:16:01.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:16:01.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:16:01.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:16:01.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:16:01.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:16:01.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-29T03:16:04.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-29T03:16:04.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:16:04.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:16:04.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:16:04.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:16:04.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:16:04.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:16:04.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:16:04.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:16:04.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:16:04.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:16:04.263 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:16:04.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:16:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:16:04.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:16:04.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:16:04.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:16:04.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:16:04.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:16:04.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:16:04.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:16:04.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:16:04.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:16:04.605 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:16:04.666 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:15:53
2026-05-29T03:16:04.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70742, datetime.datetime(2026, 5, 29, 3, 15, 53), datetime.datetime(2026, 5, 29, 3, 15, 52), 'salt', 6.49, 87.45, None, 10.91, 110.11, 1.93, 831.57, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:16:04.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:16:04.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:16:04.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:52, diff=12.672962s, valid=True
2026-05-29T03:16:04.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:16:04.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:16:04.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:12, diff=-7.323885s, valid=True
2026-05-29T03:16:04.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:16:04.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:15:52, diff=12.683441s, valid=True
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:16:04.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:16:04.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:12, diff=-7.313228s, valid=True
2026-05-29T03:16:04.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:16:04.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:16:04.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:16:04.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950006.6875s, valid=True
2026-05-29T03:16:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:16:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:16:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:16:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:16:04.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:16:04.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:16:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:16:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:16:04.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:16:04.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:16:04.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:16:04.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:16:05.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:16:05.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:16:05.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:16:05.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:16:05.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:16:05.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:16:05.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-29T03:16:05.726 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:16:05.982 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:16:05.982 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:16:36.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:16:36.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:16:36.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:16:36.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:16:36.314 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:16:36.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:16:36.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-29T03:16:36.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:16: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-29T03:16:36.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:16:36.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:16:36.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:16:36.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-29T03:16:39.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-29T03:16:39.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:16:39.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:16:39.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:16:39.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:16:39.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:16:39.660 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:16:39.660 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:16:39.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:16:39.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:16:39.661 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:16:39.662 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:16:39.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:16:39.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:16:39.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:16:39.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:16:39.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:16:39.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:16:39.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:16:39.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:16:39.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:16:39.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:16:39.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:16:39.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:16:40.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:16:24
2026-05-29T03:16:40.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70743, datetime.datetime(2026, 5, 29, 3, 16, 24), datetime.datetime(2026, 5, 29, 3, 16, 22), 'salt', 6.49, 87.82, None, 10.83, 107.17, 1.87, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:16:40.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:16:40.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:16:40.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:22, diff=18.057477s, valid=True
2026-05-29T03:16:40.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:16:40.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:16:40.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:12, diff=28.060824s, valid=True
2026-05-29T03:16:40.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:16:40.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:16:40.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:22, diff=18.068917s, valid=True
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:16:40.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:16:40.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:12, diff=28.072808s, valid=True
2026-05-29T03:16:40.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:16:40.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:16:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:16:40.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950042.073598s, valid=True
2026-05-29T03:16:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:16:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:16:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:16:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:16:40.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:16:40.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:16:40.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:16:40.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:16:40.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:16:40.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:16:40.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:16:40.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:16:40.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:16:40.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:16:40.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:16:40.956 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:16:41.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:16:41.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:16:41.060 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:16:41.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-29T03:16:41.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:16:41.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:17:11.279 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:17:11.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:17:11.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:17:11.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:17:11.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:17:12.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:17:12.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-29T03:17:12.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:17:12.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-29T03:17:12.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:17:12.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:17:12.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:17:12.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-29T03:17:15.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-29T03:17:15.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:17:15.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:17:15.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:17:15.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:17:15.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:17:15.439 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:17:15.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:17:15.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:17:15.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:17:15.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:17:15.441 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:17:15.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:17:15.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:17:15.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:17:15.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:17:15.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:17:15.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:17:15.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:17:15.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:17:15.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:17:15.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:17:15.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:17:15.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:17:15.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:16:54
2026-05-29T03:17:15.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70744, datetime.datetime(2026, 5, 29, 3, 16, 54), datetime.datetime(2026, 5, 29, 3, 16, 54), 'salt', 6.55, 87.59, None, 10.2, 107.85, 1.9, 831.57, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:17:15.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:17:15.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:17:15.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:54, diff=21.826711s, valid=True
2026-05-29T03:17:15.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:17:15.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:17:15.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:12, diff=3.830243s, valid=True
2026-05-29T03:17:15.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:17:15.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:16:53, diff=22.838246s, valid=True
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:17:15.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:17:15.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:12, diff=3.841918s, valid=True
2026-05-29T03:17:15.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:17:15.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:17:15.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:17:15.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950077.842718s, valid=True
2026-05-29T03:17:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:17:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:17:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:17:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:17:15.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:17:15.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:17:15.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:17:15.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:17:15.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:17:15.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:17:16.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:17:16.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:17:16.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:17:16.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:17:16.377 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:17:16.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:17:16.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:17:16.824 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:17:16.824 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:17:16.824 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:17:17.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:17:17.016 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:17:47.044 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:17:47.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:17:47.045 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:17:47.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:17:47.318 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:17:47.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:17:47.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-29T03:17:47.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:17:47.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-29T03:17:47.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:17:47.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:17:47.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:17:47.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-29T03:17:50.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-29T03:17:50.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:17:50.341 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:17:50.341 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:17:50.342 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:17:50.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:17:50.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:17:50.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:17:50.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:17:50.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:17:50.367 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:17:50.367 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:17:50.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:17:50.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:17:50.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:17:50.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:17:50.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:17:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:17:50.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:17:50.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:17:50.623 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:17:50.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:17:50.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:17:50.627 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:17:50.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:17:25
2026-05-29T03:17:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70745, datetime.datetime(2026, 5, 29, 3, 17, 25), datetime.datetime(2026, 5, 29, 3, 17, 24), 'salt', 6.62, 87.55, None, 10.27, 112.31, 1.91, 831.57, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:17:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:17:50.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:17:50.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:24, diff=26.693437s, valid=True
2026-05-29T03:17:50.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:17:50.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:17:50.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:12, diff=38.696659s, valid=True
2026-05-29T03:17:50.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:17:50.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:23, diff=27.703984s, valid=True
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:17:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:17:50.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:17:12, diff=38.707409s, valid=True
2026-05-29T03:17:50.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:17:50.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:17:50.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:17:50.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950112.708164s, valid=True
2026-05-29T03:17:50.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:17:50.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:17:50.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:17:50.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:17:50.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:17:50.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:17:50.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:17:50.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:17:50.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:17:50.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:17:50.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:17:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:17:50.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:17:51.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:17:51.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:17:51.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:17:51.745 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:17:51.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:17:51.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-29T03:17:51.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-29T03:17:51.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:17:51.928 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:18:21.934 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:18:21.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:18:21.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:18:22.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:18:22.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:18:22.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:18:22.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-29T03:18:22.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:18:22.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:18:22.894 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:18:22.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:18:22.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:18:22.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-29T03:18: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-29T03:18:26.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:18:26.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:18:26.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:18:26.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:18:26.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:18:26.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:18:26.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:18:26.112 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:18:26.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:18:26.113 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:18:26.113 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:18:26.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:18:26.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:18:26.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:18:26.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:18:26.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:18:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:18:26.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:18:26.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:18:26.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:18:26.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:18:26.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:18:26.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:18:26.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:18:26
2026-05-29T03:18:26.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70747, datetime.datetime(2026, 5, 29, 3, 18, 26), datetime.datetime(2026, 5, 29, 3, 18, 25), 'salt', 6.52, 87.79, None, 10.55, 113.23, 1.87, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:18:26.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:18:26.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:18:26.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:25, diff=1.506571s, valid=True
2026-05-29T03:18:26.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:18:26.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:18:26.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:12, diff=14.509966s, valid=True
2026-05-29T03:18:26.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:18:26.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:18:26.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:23, diff=3.517963s, valid=True
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:18:26.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:18:26.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:12, diff=14.521545s, valid=True
2026-05-29T03:18:26.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:18:26.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:18:26.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:18:26.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950148.522344s, valid=True
2026-05-29T03:18:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:18:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:18:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:18:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:18:26.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:18:26.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:18:26.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:18:26.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:18:26.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:18:26.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:18:26.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:18:26.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:18:26.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:18:26.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:18:27.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:18:27.405 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:18:27.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:18:27.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:18:27.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-29T03:18:27.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-29T03:18:27.685 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:18:27.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:18:57.715 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:18:57.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:18:57.715 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:18:58.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:18:58.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:18:58.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:18:58.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-29T03:18:58.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:18:58.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-29T03:18:58.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:18:58.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:18:58.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:18:58.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-29T03:19:00.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-29T03:19:00.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:19:00.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:19:00.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:19:00.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:19:00.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:19:00.828 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:19:00.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:19:00.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:19:00.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:19:00.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:19:00.830 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:19:00.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:19:00.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:19:00.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:19:01.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:19:01.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:19:01.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:19:01.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:19:01.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:19:01.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:19:01.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:19:01.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:19:01.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:19:01.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:18:56
2026-05-29T03:19:01.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70748, datetime.datetime(2026, 5, 29, 3, 18, 56), datetime.datetime(2026, 5, 29, 3, 18, 56), 'salt', 6.62, 87.95, None, 9.49, 110.41, 1.85, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:19:01.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:19:01.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:19:01.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:56, diff=5.214922s, valid=True
2026-05-29T03:19:01.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:19:01.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:19:01.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:12, diff=-10.78167s, valid=True
2026-05-29T03:19:01.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:19:01.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:18:54, diff=7.226241s, valid=True
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:19:01.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:19:01.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:12, diff=-10.770108s, valid=True
2026-05-29T03:19:01.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:19:01.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:19:01.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:19:01.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950183.230705s, valid=True
2026-05-29T03:19:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:19:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:19:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:19:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:19:01.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:19:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:19:01.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:19:01.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:19:01.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:19:01.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:19:01.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:19:01.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:19:01.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:19:01.587 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:19:01.870 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:19:02.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:19:02.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:19:02.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:19:02.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-29T03:19:02.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-29T03:19:02.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:19:02.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:19:32.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:19:32.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:19:32.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:19:33.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:19:33.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:19:33.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:19:33.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-29T03:19:33.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:19:33.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-29T03:19:33.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:19:33.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:19:33.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:19:33.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-29T03:19:35.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:19:35.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:19:35.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:19:35.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:19:35.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:19:35.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:19:35.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:19:35.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:19:35.798 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:19:35.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:19:35.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:19:35.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:19:35.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:19:35.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:19:35.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:19:36.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:19:36.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:19:36.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:19:36.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:19:36.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:19:36.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:19:36.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:19:36.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:19:36.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:19:36.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:19:27
2026-05-29T03:19:36.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70749, datetime.datetime(2026, 5, 29, 3, 19, 27), datetime.datetime(2026, 5, 29, 3, 19, 26), 'salt', 6.52, 87.95, None, 10.45, 109.73, 1.84, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:19:36.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:19:36.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:19:36.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:26, diff=10.188154s, valid=True
2026-05-29T03:19:36.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:19:36.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:19:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:12, diff=24.191584s, valid=True
2026-05-29T03:19:36.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:19:36.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:19:36.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:24, diff=12.199588s, valid=True
2026-05-29T03:19:36.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:19:36.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:19:36.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:19:36.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:19:36.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:19:36.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:19:36.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:12, diff=24.20321s, valid=True
2026-05-29T03:19:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:19:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:19:36.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:19:36.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950218.204002s, valid=True
2026-05-29T03:19:36.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:19:36.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:19:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:19:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:19:36.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:19:36.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:19:36.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:19:36.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:19:36.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:19:36.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:19:36.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:19:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:19:36.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:19:36.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:19:36.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:19:37.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:19:37.182 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:19:37.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:19: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-29T03:19:37.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-29T03:19:37.416 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:19:37.416 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:20:07.446 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:20:07.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:20:07.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:20:07.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:20:07.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:20:08.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:20:08.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-29T03:20:08.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:20:08.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-29T03:20:08.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:20:08.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:20:08.043 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:20:08.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-29T03:20:10.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-29T03:20:10.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:20:10.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:20:10.590 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:20:10.590 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:20:10.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:20:10.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:20:10.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:20:10.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:20:10.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:20:10.615 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:20:10.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:20:10.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:20:10.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:20:10.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:20:10.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:20:10.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:20:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:20:10.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:20:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:20:10.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:20:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:20:10.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:20:10.931 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:20:10.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:19:57
2026-05-29T03:20:10.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70750, datetime.datetime(2026, 5, 29, 3, 19, 57), datetime.datetime(2026, 5, 29, 3, 19, 57), 'salt', 6.52, 88.05, None, 10.87, 112.67, 1.83, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:20:10.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:20:10.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:20:10.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:57, diff=13.998703s, valid=True
2026-05-29T03:20:10.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:20:10.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:20:11.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:12, diff=-0.997838s, valid=True
2026-05-29T03:20:11.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:20:11.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:20:11.009 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:19:55, diff=16.009962s, valid=True
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:20:11.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:20:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:12, diff=-0.986406s, valid=True
2026-05-29T03:20:11.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:20:11.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:20:11.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:20:11.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950253.014401s, valid=True
2026-05-29T03:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:20:11.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:20:11.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:20:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:20:11.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:20:11.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:20:11.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:20:11.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:20:11.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:20:11.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:20:11.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:20:11.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:20:11.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:20:12.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:20:12.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:20:12.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-29T03:20:12.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-29T03:20:12.239 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:20:12.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:20:42.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:20:42.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:20:42.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:20:42.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:20:42.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:20:42.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:20:42.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-29T03:20:42.663 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:20:42.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-29T03:20:42.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:20:42.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:20:42.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:20:42.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-29T03:20:45.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-29T03:20:45.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:20:45.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:20:45.983 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:20:45.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:20:45.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:20:46.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:20:46.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:20:46.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:20:46.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:20:46.008 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:20:46.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:20:46.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:20:46.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:20:46.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:20:46.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:20:46.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:20:46.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:20:46.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:20:46.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:20:46.327 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:20:46.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:20:46.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:20:46.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:20:46.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:20:29
2026-05-29T03:20:46.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70751, datetime.datetime(2026, 5, 29, 3, 20, 29), datetime.datetime(2026, 5, 29, 3, 20, 27), 'salt', 6.46, 88.05, None, 10.83, 111.12, 1.83, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:20:46.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:20:46.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:20:46.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:27, diff=19.40296s, valid=True
2026-05-29T03:20:46.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:20:46.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:20:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:12, diff=34.406361s, valid=True
2026-05-29T03:20:46.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:20:46.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:26, diff=20.414401s, valid=True
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:20:46.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:20:46.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:12, diff=34.418083s, valid=True
2026-05-29T03:20:46.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:20:46.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:20:46.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:20:46.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950288.418887s, valid=True
2026-05-29T03:20:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:20:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:20:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:20:46.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:20:46.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:20:46.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:20:46.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:20:46.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:20:46.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:20:46.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:20:46.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:20:46.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:20:46.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:20:46.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:20:46.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:20:47.301 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:20:47.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:20:47.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:20:47.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-29T03:20:47.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-29T03:20:47.632 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:20:47.632 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:21:17.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:21:17.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:21:17.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:21:17.986 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:21:18.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:21:18.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:21:18.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-29T03:21:18.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:21:18.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-29T03:21:18.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:21:18.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:21:18.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:21:18.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-29T03:21:20.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:21:20.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:21:20.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:21:20.685 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:21:20.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:21:20.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:21:20.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:21:20.710 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:21:20.711 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:21:20.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:21:20.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:21:20.712 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:21:20.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:21:20.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:21:20.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:21:20.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:21:20.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:21:21.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:21:21.006 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:21:21.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:21:21.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:21:21.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:21:21.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:21:21.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:21:21.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:20:59
2026-05-29T03:21:21.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70752, datetime.datetime(2026, 5, 29, 3, 20, 59), datetime.datetime(2026, 5, 29, 3, 20, 59), 'salt', 6.59, 88.15, None, 11.29, 113.11, 1.82, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:21:21.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:21:21.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:21:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:59, diff=22.135502s, valid=True
2026-05-29T03:21:21.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:21:21.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:21:21.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:12, diff=9.138936s, valid=True
2026-05-29T03:21:21.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:21:21.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:21:21.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:20:58, diff=23.146826s, valid=True
2026-05-29T03:21:21.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:21:21.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:21:21.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:21:21.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:21:21.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:21:21.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:21:21.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:12, diff=9.150454s, valid=True
2026-05-29T03:21:21.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:21:21.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:21:21.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:21:21.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950323.151273s, valid=True
2026-05-29T03:21:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:21:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:21:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:21:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:21:21.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:21:21.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:21:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:21:21.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:21:21.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:21:21.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:21:21.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:21:21.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:21:21.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:21:21.542 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:21:21.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:21:22.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:21:22.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:21:22.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:21:22.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-29T03:21:22.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-29T03:21:22.382 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:21:22.382 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:21:52.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:21:52.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:21:52.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:21:52.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:21:52.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:21:52.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:21:52.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-29T03:21:52.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:21:52.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-29T03:21:52.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:21:52.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:21:52.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:21:52.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-29T03:21:55.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-29T03:21:55.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:21:55.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:21:55.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:21:55.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:21:55.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:21:55.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:21:55.257 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:21:55.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:21:55.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:21:55.258 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:21:55.258 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:21:55.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:21:55.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:21:55.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:21:55.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:21:55.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:21:55.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:21:55.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:21:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:21:55.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:21:55.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:21:55.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:21:55.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:21:55.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:21:30
2026-05-29T03:21:55.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70753, datetime.datetime(2026, 5, 29, 3, 21, 30), datetime.datetime(2026, 5, 29, 3, 21, 29), 'salt', 6.56, 88.25, None, 10.66, 105.88, 1.8, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:21:55.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:21:55.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:21:55.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:29, diff=26.655999s, valid=True
2026-05-29T03:21:55.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:21:55.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:21:55.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:12, diff=43.659526s, valid=True
2026-05-29T03:21:55.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:21:55.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:21:55.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:25, diff=30.667807s, valid=True
2026-05-29T03:21:55.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:21:55.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:21:55.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:21:55.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:21:55.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:21:55.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:21:55.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:21:12, diff=43.671564s, valid=True
2026-05-29T03:21:55.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:21:55.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:21:55.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:21:55.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950357.672382s, valid=True
2026-05-29T03:21:55.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:21:55.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:21:55.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:21:55.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:21:55.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:21:55.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:21:55.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:21:55.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:21:55.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:21:55.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:21:55.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:21:55.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:21:55.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:21:55.999 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:21:56.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:21:56.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:21:56.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:21:56.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:21:56.659 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:21:56.659 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:21:56.841 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:21:56.841 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:22:26.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:22:26.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:22:26.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:22:27.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:22:27.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:22:27.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:22:27.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:22:27.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:22:27.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-29T03:22:27.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:22:27.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:22:27.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:22:27.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-29T03:22:30.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-29T03:22:30.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:22:30.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:22:30.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:22:30.209 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:22:30.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:22:30.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:22:30.229 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:22:30.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:22:30.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:22:30.229 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:22:30.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:22:30.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:22:30.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:22:30.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:22:30.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:22:30.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:22:30.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:22:30.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:22:30.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:22:30.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:22:30.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:22:30.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:22:30.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:22:30.550 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:22:30
2026-05-29T03:22:30.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70755, datetime.datetime(2026, 5, 29, 3, 22, 30), datetime.datetime(2026, 5, 29, 3, 22, 30), 'salt', 6.59, 88.48, None, 10.87, 107.69, 1.76, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:22:30.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:22:30.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:22:30.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:22:30, diff=0.556596s, valid=True
2026-05-29T03:22:30.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:22:30.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:22:30.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:22:12, diff=18.559487s, valid=True
2026-05-29T03:22:30.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:22:30.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:22:25, diff=5.566212s, valid=True
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:22:30.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:22:30.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:22:12, diff=18.569269s, valid=True
2026-05-29T03:22:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:22:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:22:30.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:22:30.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950392.569931s, valid=True
2026-05-29T03:22:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:22:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:22:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:22:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:22:30.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:22:30.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:22:30.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:22:30.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:22:30.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:22:30.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:22:30.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:22:30.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:22:31.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:22:31.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:22:31.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:22:31.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:22:31.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:22:31.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:22:31.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-29T03:22:31.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-29T03:22:31.885 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:22:31.885 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:23:01.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:23:01.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:23:01.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:23:02.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:23:02.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:23:02.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:23:02.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-29T03:23:02.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:23:02.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-29T03:23:02.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:23:02.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:23:02.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:23:02.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-29T03:23:06.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-29T03:23:06.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:23:06.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:23:06.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:23:06.144 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:23:06.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:23:06.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:23:06.168 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:23:06.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:23:06.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:23:06.169 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:23:06.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:23:06.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:23:06.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:23:06.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:23:06.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:23:06.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:23:06.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:23:06.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:23:06.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:23:06.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:23:06.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:23:06.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:23:06.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:23:06.567 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:23:00
2026-05-29T03:23:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70756, datetime.datetime(2026, 5, 29, 3, 23), datetime.datetime(2026, 5, 29, 3, 23), 'salt', 6.65, 88.58, None, 11.43, 111.68, 1.74, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:23:06.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:23:06.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:23:06.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:00, diff=6.574164s, valid=True
2026-05-29T03:23:06.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:23:06.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:23:06.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:12, diff=-5.42286s, valid=True
2026-05-29T03:23:06.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:23:06.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:23:06.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:22:55, diff=11.584758s, valid=True
2026-05-29T03:23:06.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:23:06.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:23:06.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:23:06.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:23:06.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:23:06.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:23:06.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:12, diff=-5.411628s, valid=True
2026-05-29T03:23:06.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:23:06.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:23:06.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:23:06.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950428.58917s, valid=True
2026-05-29T03:23:06.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:23:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:23:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:23:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:23:06.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:23:06.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:23:06.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:23:06.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:23:06.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:23:06.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:23:06.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:23:06.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:23:06.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-29T03:23:07.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:07.205 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:23:07.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:07.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:07.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:23:07.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:23:07.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-29T03:23:07.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-29T03:23:08.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:23:08.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:23:38.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:23:38.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:23:38.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:23:38.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:23:38.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:23:38.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:23: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-29T03:23:38.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:23: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-29T03:23:38.466 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:23:38.466 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:23:38.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:23:38.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-29T03:23:41.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-29T03:23:41.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:23:41.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:23:41.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:23:41.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:23:41.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:23:41.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:23:41.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:23:41.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:23:41.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:23:41.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:23:41.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:23:41.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:23:41.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:23:41.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:23:41.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:23:41.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:23:41.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:23:41.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:23:41.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:23:41.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:23:41.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:23:41.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:23:41.653 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:23:41.723 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:23:31
2026-05-29T03:23:41.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70757, datetime.datetime(2026, 5, 29, 3, 23, 31), datetime.datetime(2026, 5, 29, 3, 23, 30), 'salt', 6.59, 88.55, None, 11.05, 111.35, 1.75, 831.57, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:23:41.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:23:41.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:23:41.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:30, diff=11.731025s, valid=True
2026-05-29T03:23:41.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:23:41.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:23:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:12, diff=29.734521s, valid=True
2026-05-29T03:23:41.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:23:41.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:23:41.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:26, diff=15.742709s, valid=True
2026-05-29T03:23:41.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:23:41.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:23:41.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:23:41.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:23:41.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:23:41.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:23:41.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:12, diff=29.746405s, valid=True
2026-05-29T03:23:41.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:23:41.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:23:41.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:23:41.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950463.747249s, valid=True
2026-05-29T03:23:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:23:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:23:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:23:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:23:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:23:41.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:23:41.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:23:41.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:23:41.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:23:41.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:23:41.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:23:41.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:23:42.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-29T03:23:42.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:42.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:23:42.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:42.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:23:42.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:23:42.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:23:42.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-29T03:23:42.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-29T03:23:43.134 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:23:43.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:24:13.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:24:13.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:24:13.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:24:13.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:24:13.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:24:13.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:24:13.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-29T03:24:13.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:24:13.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:24:13.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:24:13.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:24:13.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:24:13.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-29T03:24:16.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-29T03:24:16.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:24:16.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:24:16.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:24:16.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:24:16.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:24:17.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:24:17.006 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:24:17.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:24:17.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:24:17.007 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:24:17.008 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:24:17.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:24:17.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:24:17.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:24:17.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:24:17.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:24:17.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:24:17.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:24:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:24:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:24:17.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:24:17.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:24:17.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:24:17.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:24:01
2026-05-29T03:24:17.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70758, datetime.datetime(2026, 5, 29, 3, 24, 1), datetime.datetime(2026, 5, 29, 3, 24, 1), 'salt', 6.52, 88.52, None, 11.26, 110.29, 1.75, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:24:17.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:24:17.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:24:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:01, diff=16.402275s, valid=True
2026-05-29T03:24:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:24:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:24:17.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=5.405671s, valid=True
2026-05-29T03:24:17.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:24:17.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:23:56, diff=21.413467s, valid=True
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:24:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:24:17.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:24:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=5.417065s, valid=True
2026-05-29T03:24:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:24:17.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:24:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:24:17.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950499.417849s, valid=True
2026-05-29T03:24:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:24:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:24:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:24:17.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:24:17.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:24:17.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:24:17.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:24:17.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:24:17.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:24:17.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:24:17.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:24:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:24:17.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-29T03:24:17.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:18.088 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:24:18.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:18.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:18.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:24:18.668 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:24:18.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-29T03:24:18.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-29T03:24:18.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:24:18.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:24:48.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:24:48.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:24:48.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:24:48.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:24:48.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:24:49.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:24:49.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-29T03:24:49.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:24: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-29T03:24:49.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:24:49.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:24:49.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:24:49.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-29T03:24:52.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-29T03:24:52.329 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:24:52.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:24:52.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:24:52.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:24:52.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:24:52.361 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:24:52.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:24:52.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:24:52.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:24:52.363 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:24:52.363 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:24:52.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:24:52.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:24:52.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:24:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:24:52.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:24:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:24:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:24:52.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:24:52.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:24:52.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:24:52.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:24:52.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:24:52.757 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:24:32
2026-05-29T03:24:52.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70759, datetime.datetime(2026, 5, 29, 3, 24, 32), datetime.datetime(2026, 5, 29, 3, 24, 32), 'salt', 6.46, 88.62, None, 10.34, 109.38, 1.74, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:24:52.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:24:52.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:24:52.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:32, diff=20.764708s, valid=True
2026-05-29T03:24:52.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:24:52.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:24:52.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=40.768179s, valid=True
2026-05-29T03:24:52.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:24:52.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:28, diff=24.776225s, valid=True
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:24:52.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:24:52.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=40.780001s, valid=True
2026-05-29T03:24:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:24:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:24:52.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:24:52.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950534.780823s, valid=True
2026-05-29T03:24:52.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:24:52.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:24:52.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:24:52.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:24:52.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:24:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:24:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:24:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:24:52.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:24:52.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:24:52.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:24:53.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:24:53.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-29T03:24:53.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:53.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:24:53.577 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:53.891 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:24:53.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:24:53.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:24:53.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-29T03:24:53.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-29T03:24:54.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:24:54.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:25:24.191 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:25:24.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:25:24.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:25:24.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:25:24.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:25:24.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:25:24.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:25:24.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:25:24.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-29T03:25:24.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:25:24.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:25:24.782 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:25:24.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-29T03:25:27.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-29T03:25:27.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:25:27.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:25:27.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:25:27.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:25:27.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:25:27.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:25:27.336 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:25:27.336 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:25:27.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:25:27.337 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:25:27.337 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:25:27.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:25:27.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:25:27.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:25:27.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:25:27.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:25:27.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:25:27.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:25:27.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:25:27.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:25:27.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:25:27.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:25:27.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:25:27.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:25:02
2026-05-29T03:25:27.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70760, datetime.datetime(2026, 5, 29, 3, 25, 2), datetime.datetime(2026, 5, 29, 3, 25, 2), 'salt', 6.42, 88.65, None, 10.76, 112.1, 1.73, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:25:27.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:25:27.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:25:27.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:25:02, diff=25.676671s, valid=True
2026-05-29T03:25:27.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:25:27.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:25:27.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=75.679832s, valid=True
2026-05-29T03:25:27.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:25:27.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:59, diff=28.68717s, valid=True
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:25:27.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:25:27.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=75.690573s, valid=True
2026-05-29T03:25:27.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:25:27.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:25:27.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:25:27.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950569.691321s, valid=True
2026-05-29T03:25:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:25:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:25:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:25:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:25:27.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:25:27.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:25:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:25:27.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:25:27.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:25:27.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:25:27.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:25:27.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:25:28.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Seeing data
2026-05-29T03:25:28.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:25:28.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:25:28.553 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:25:28.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:25:28.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:25:28.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:25:28.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:25:28.955 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:25:29.172 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:25:29.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:25:59.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:25:59.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:25:59.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:25:59.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:25:59.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:25:59.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:25:59.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-29T03:25:59.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:25:59.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-29T03:25:59.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:25:59.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:25:59.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:25:59.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-29T03:26:02.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-29T03:26:02.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:26:02.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:26:02.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:26:02.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:26:02.078 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:26:02.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:26:02.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:26:02.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:26:02.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:26:02.092 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:26:02.093 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:26:02.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:26:02.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:26:02.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:26:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:26:02.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:26:02.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:26:02.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:26:02.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:26:02.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:26:02.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:26:02.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:26:02.412 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:26:02.472 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:25:33
2026-05-29T03:26:02.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70761, datetime.datetime(2026, 5, 29, 3, 25, 33), datetime.datetime(2026, 5, 29, 3, 25, 32), 'salt', 6.42, 88.82, None, 10.87, 116.28, 1.7, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:26:02.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:26:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:26:02.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:25:32, diff=30.479862s, valid=True
2026-05-29T03:26:02.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:26:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:26:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=110.48322s, valid=True
2026-05-29T03:26:02.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:26:02.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:25:31, diff=31.491146s, valid=True
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:26:02.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:26:02.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=110.494801s, valid=True
2026-05-29T03:26:02.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:26:02.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:26:02.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:26:02.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950604.495596s, valid=True
2026-05-29T03:26:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:26:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:26:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:26:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:26:02.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:26:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:26:02.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:26:02.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:26:02.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:26:02.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:26:02.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:26:02.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:26:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:26:02.826 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:26:03.040 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:26:03.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:26:03.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:26:03.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:26: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-29T03:26: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-29T03:26:03.722 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:26:03.723 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:26:33.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:26:33.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:26:33.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:26:34.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:26:34.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:26:34.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:26:34.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-29T03:26:34.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:26:34.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-29T03:26:34.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:26:34.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:26:34.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:26:34.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-29T03:26:37.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-29T03:26:37.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:26:37.552 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:26:37.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:26:37.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:26:37.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:26:37.578 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:26:37.578 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:26:37.579 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:26:37.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:26:37.579 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:26:37.580 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:26:37.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:26:37.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:26:37.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:26:37.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:26:37.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:26:37.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:26:37.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:26:37.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:26:37.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:26:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:26:37.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:26:37.909 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:26:37.973 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:26:33
2026-05-29T03:26:37.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70763, datetime.datetime(2026, 5, 29, 3, 26, 33), datetime.datetime(2026, 5, 29, 3, 26, 33), 'salt', 6.49, 88.95, None, 10.66, 111.26, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:26:37.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:26:37.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:26:37.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:26:33, diff=4.980881s, valid=True
2026-05-29T03:26:37.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:26:37.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:26:37.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=145.984343s, valid=True
2026-05-29T03:26:37.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:26:37.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:26:27, diff=10.992401s, valid=True
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:26:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:26:37.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=145.996081s, valid=True
2026-05-29T03:26:37.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:26:37.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:26:37.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:26:37.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950639.996901s, valid=True
2026-05-29T03:26:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:26:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:26:37.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:26:37.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:26:37.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:26:38.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:26:38.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:26:38.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:26:38.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:26:38.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:26:38.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:26:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:26:38.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:26:38.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:26:38.537 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:26:38.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:26:38.977 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:26:38.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:26:38.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-29T03:26:38.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-29T03:26:39.157 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:26:39.157 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:27:09.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:27:09.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:27:09.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:27:09.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:27:09.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:27:09.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:27:09.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-29T03:27:09.705 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:27:09.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-29T03:27:09.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:27:09.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:27:09.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:27:09.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-29T03:27: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-29T03:27:12.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:27:12.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:27:12.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:27:12.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:27:12.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:27:12.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:27:12.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:27:12.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:27:12.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:27:12.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:27:12.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:27:12.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:27:12.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:27:12.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:27:12.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:27:12.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:27:12.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:27:12.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:27:12.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:27:12.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:27:12.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:27:12.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:27:12.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:27:12.458 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:27:03
2026-05-29T03:27:12.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70764, datetime.datetime(2026, 5, 29, 3, 27, 3), datetime.datetime(2026, 5, 29, 3, 27, 3), 'salt', 6.49, 88.95, None, 10.45, 113.44, 1.69, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:27:12.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:27:12.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:27:12.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:27:03, diff=9.465573s, valid=True
2026-05-29T03:27:12.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:27:12.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:27:12.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=180.468977s, valid=True
2026-05-29T03:27:12.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:27:12.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:27:12.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:26:57, diff=15.47687s, valid=True
2026-05-29T03:27:12.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:27:12.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:27:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:27:12.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:27:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:27:12.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:27:12.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=180.480463s, valid=True
2026-05-29T03:27:12.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:27:12.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:27:12.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:27:12.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950674.481264s, valid=True
2026-05-29T03:27:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:27:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:27:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:27:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:27:12.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:27:12.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:27:12.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:27:12.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:27:12.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:27:12.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:27:12.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:27:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:27:12.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:27:12.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:27:13.014 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:27:13.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:27:13.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:27:13.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:27:13.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:27:13.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-29T03:27:13.697 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:27:13.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:27:43.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:27:43.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:27:43.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:27:44.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:27:44.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:27:44.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:27:44.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-29T03:27:44.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:27:44.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-29T03:27:44.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:27:44.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:27:44.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:27:44.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-29T03:27:46.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:27:46.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:27:46.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:27:46.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:27:46.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:27:46.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:27:46.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:27:46.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:27:46.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:27:46.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:27:46.884 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:27:46.884 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:27:46.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:27:47.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:27:47.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:27:47.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:27:47.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:27:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:27:47.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:27:47.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:27:47.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:27:47.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:27:47.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:27:47.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:27:47.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:27:34
2026-05-29T03:27:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70765, datetime.datetime(2026, 5, 29, 3, 27, 34), datetime.datetime(2026, 5, 29, 3, 27, 33), 'salt', 6.42, 88.92, None, 9.85, 114.83, 1.69, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:27:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:27:47.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:27:47.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:27:33, diff=14.271234s, valid=True
2026-05-29T03:27:47.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:27:47.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:27:47.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=215.274645s, valid=True
2026-05-29T03:27:47.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:27:47.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:27:27, diff=20.282476s, valid=True
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:27:47.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:27:47.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:27:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=215.286077s, valid=True
2026-05-29T03:27:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:27:47.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:27:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:27:47.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950709.286867s, valid=True
2026-05-29T03:27:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:27:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:27:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:27:47.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:27:47.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:27:47.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:27:47.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:27:47.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:27:47.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:27:47.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:27:47.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:27:47.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:27:47.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:27:47.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:27:47.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:27:48.163 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:27:48.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:27:48.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:27:48.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-29T03:27:48.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-29T03:27:48.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:27:48.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:28:18.377 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:28:18.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:28:18.377 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:28:18.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:28:18.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:28:18.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:28:18.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-29T03:28:18.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:28:18.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-29T03:28:18.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:28:18.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:28:18.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:28:18.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-29T03:28:21.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-29T03:28:21.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:28:21.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:28:21.570 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:28:21.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:28:21.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:28:21.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:28:21.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:28:21.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:28:21.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:28:21.597 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:28:21.597 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:28:21.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:28:21.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:28:21.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:28:21.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:28:21.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:28:21.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:28:21.876 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:28:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:28:21.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:28:21.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:28:21.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:28:21.923 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:28:21.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:28:04
2026-05-29T03:28:21.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70766, datetime.datetime(2026, 5, 29, 3, 28, 4), datetime.datetime(2026, 5, 29, 3, 28, 3), 'salt', 6.49, 89.01, None, 11.4, 108.86, 1.67, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:28:21.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:28:21.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:28:21.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:28:03, diff=18.996479s, valid=True
2026-05-29T03:28:21.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:28:21.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:28:22.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=250.000038s, valid=True
2026-05-29T03:28:22.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:28:22.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:27:58, diff=24.008131s, valid=True
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:28:22.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:28:22.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:24:12, diff=250.011867s, valid=True
2026-05-29T03:28:22.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:28:22.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:28:22.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:28:22.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950744.012709s, valid=True
2026-05-29T03:28:22.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:28:22.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:28:22.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:28:22.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:28:22.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:28:22.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:28:22.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:28:22.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:28:22.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:28:22.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:28:22.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:28:22.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:28:22.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:28:22.335 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:28:22.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:28:22.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:28:23.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:28:23.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:28:23.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-29T03:28:23.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-29T03:28:23.154 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:28:23.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:28:53.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:28:53.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:28:53.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:28:53.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:28:53.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:28:53.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:28:53.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:28:53.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:28:53.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-29T03:28:53.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:28:53.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:28:53.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:28:53.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-29T03:28:56.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-29T03:28:56.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:28:56.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:28:56.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:28:56.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:28:56.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:28:56.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:28:56.225 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:28:56.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:28:56.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:28:56.226 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:28:56.227 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:28:56.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:28:56.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:28:56.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:28:56.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:28:56.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:28:56.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:28:56.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:28:56.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:28:56.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:28:56.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:28:56.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:28:56.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:28:56.617 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:28:34
2026-05-29T03:28:56.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70767, datetime.datetime(2026, 5, 29, 3, 28, 34), datetime.datetime(2026, 5, 29, 3, 28, 34), 'salt', 6.49, 89.05, None, 11.15, 116.52, 1.67, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:28:56.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:28:56.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:28:56.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:28:34, diff=22.625059s, valid=True
2026-05-29T03:28:56.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:28:56.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:28:56.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:12, diff=-15.371511s, valid=True
2026-05-29T03:28:56.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:28:56.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:28:29, diff=27.636376s, valid=True
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:28:56.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:28:56.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:12, diff=-15.360005s, valid=True
2026-05-29T03:28:56.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:28:56.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:28:56.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:28:56.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950778.64084s, valid=True
2026-05-29T03:28:56.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:28:56.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:28:56.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:28:56.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:28:56.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:28:56.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:28:56.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:28:56.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:28:56.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:28:56.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:28:56.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:28:56.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:28:56.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:28:56.964 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:28:57.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:28:57.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:28:57.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:28:57.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:28:57.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-29T03:28:57.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-29T03:28:57.882 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:28:57.882 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:29:27.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:29:27.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:29:27.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:29:28.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:29:28.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:29:28.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:29:28.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-29T03:29:28.429 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:29:28.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-29T03:29:28.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:29:28.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:29:28.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:29:28.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-29T03:29:30.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-29T03:29:30.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:29:30.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:29:30.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:29:30.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:29:30.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:29:30.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:29:30.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:29:30.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:29:30.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:29:30.879 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:29:30.879 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:29:30.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:29:31.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:29:31.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:29:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:29:31.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:29:31.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:29:31.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:29:31.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:29:31.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:29:31.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:29:31.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:29:31.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:29:31.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:29:04
2026-05-29T03:29:31.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70768, datetime.datetime(2026, 5, 29, 3, 29, 4), datetime.datetime(2026, 5, 29, 3, 29, 4), 'salt', 6.52, 89.08, None, 11.29, 113.02, 1.66, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:29:31.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:29:31.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:29:31.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:04, diff=27.263721s, valid=True
2026-05-29T03:29:31.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:29:31.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:29:31.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:12, diff=19.266742s, valid=True
2026-05-29T03:29:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:29:31.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:29:31.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:00, diff=31.273872s, valid=True
2026-05-29T03:29:31.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:29:31.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:29:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:29:31.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:29:31.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:29:31.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:29:31.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:29:12, diff=19.277107s, valid=True
2026-05-29T03:29:31.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:29:31.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:29:31.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:29:31.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950813.277829s, valid=True
2026-05-29T03:29:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:29:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:29:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:29:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:29:31.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:29:31.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:29:31.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:29:31.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:29:31.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:29:31.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:29:31.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:29:31.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:29:31.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:29:31.672 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:29:31.884 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:29:32.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:29:32.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:29:32.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:29:32.326 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:29:32.326 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:29:32.549 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:29:32.549 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:30:02.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:30:02.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:30:02.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:30:02.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:30:02.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:30:03.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:30:03.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-29T03:30:03.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:30:03.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-29T03:30:03.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:30:03.099 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:30:03.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:30:03.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-29T03:30:05.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-29T03:30:05.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:30:05.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:30:05.393 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:30:05.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:30:05.404 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:30:05.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:30:05.419 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:30:05.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:30:05.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:30:05.420 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:30:05.420 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:30:05.426 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:30:05.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:30:05.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:30:05.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:30:05.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:30:05.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:30:05.692 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:30:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:30:05.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:30:05.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:30:05.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:30:05.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:30:05.798 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:30:05
2026-05-29T03:30:05.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70770, datetime.datetime(2026, 5, 29, 3, 30, 5), datetime.datetime(2026, 5, 29, 3, 30, 4), 'salt', 6.59, 89.11, None, 12.92, 107.06, 1.66, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:30:05.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:30:05.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:30:05.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:04, diff=1.804864s, valid=True
2026-05-29T03:30:05.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:30:05.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:30:05.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:12, diff=-6.192232s, valid=True
2026-05-29T03:30:05.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:30:05.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:03, diff=2.814439s, valid=True
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:30:05.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:30:05.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:12, diff=-6.182505s, valid=True
2026-05-29T03:30:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:30:05.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:30:05.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:30:05.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950847.818159s, valid=True
2026-05-29T03:30:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:30:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:30:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:30:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:30:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:30:05.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:30:05.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:30:05.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:30:05.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:30:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:30:06.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:30:06.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:30:06.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:30:06.139 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:30:06.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:30:06.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:30:06.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:30:06.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:30:06.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-29T03:30:06.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-29T03:30:07.039 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:30:07.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:30:37.039 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:30:37.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:30:37.040 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:30:37.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:30:37.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:30:37.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:30:37.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-29T03:30:37.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:30: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-29T03:30:37.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:30:37.778 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:30:37.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:30: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-29T03:30:41.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-29T03:30:41.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:30:41.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:30:41.234 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:30:41.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:30:41.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:30:41.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:30:41.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:30:41.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:30:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:30:41.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:30:41.261 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:30:41.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:30:41.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:30:41.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:30:41.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:30:41.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:30:41.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:30:41.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:30:41.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:30:41.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:30:41.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:30:41.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:30:41.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:30:41.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:30:35
2026-05-29T03:30:41.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70771, datetime.datetime(2026, 5, 29, 3, 30, 35), datetime.datetime(2026, 5, 29, 3, 30, 35), 'salt', 6.62, 89.11, None, 11.79, 105.58, 1.66, 831.63, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:30:41.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:30:41.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:30:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:35, diff=6.648788s, valid=True
2026-05-29T03:30:41.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:30:41.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:30:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:12, diff=-30.347732s, valid=True
2026-05-29T03:30:41.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:30:41.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:34, diff=7.660239s, valid=True
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:30:41.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:30:41.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:12, diff=-30.336083s, valid=True
2026-05-29T03:30:41.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:30:41.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:30:41.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:30:41.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950883.664723s, valid=True
2026-05-29T03:30:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:30:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:30:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:30:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:30:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:30:41.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:30:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:30:41.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:30:41.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:30:41.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:30:41.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:30:41.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:30:42.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:30:42.055 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:30:42.270 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:30:42.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:30:42.718 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:30:42.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:30:42.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-29T03:30:42.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-29T03:30:42.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:30:42.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:31:12.910 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:31:12.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:31:12.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:31:13.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:31:13.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:31:13.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:31:13.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-29T03:31:13.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:31:13.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-29T03:31:13.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:31:13.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:31:13.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:31:13.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-29T03:31:15.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-29T03:31:15.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:31:15.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:31:15.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:31:15.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:31:15.765 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:31:15.784 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:31:15.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:31:15.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:31:15.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:31:15.786 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:31:15.786 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:31:15.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:31:15.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:31:15.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:31:16.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:31:16.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:31:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:31:16.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:31:16.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:31:16.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:31:16.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:31:16.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:31:16.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:31:16.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:31:06
2026-05-29T03:31:16.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70772, datetime.datetime(2026, 5, 29, 3, 31, 6), datetime.datetime(2026, 5, 29, 3, 31, 5), 'salt', 6.62, 89.11, None, 11.79, 105.06, 1.66, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:31:16.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:31:16.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:31:16.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:05, diff=11.194397s, valid=True
2026-05-29T03:31:16.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:31:16.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:31:16.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:12, diff=4.197283s, valid=True
2026-05-29T03:31:16.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:31:16.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:30:59, diff=17.204038s, valid=True
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:31:16.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:31:16.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:12, diff=4.207077s, valid=True
2026-05-29T03:31:16.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:31:16.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:31:16.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:31:16.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950918.207745s, valid=True
2026-05-29T03:31:16.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:31:16.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:31:16.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:31:16.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:31:16.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:31:16.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:31:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:31:16.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:31:16.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:31:16.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:31:16.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:31:16.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:31:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:31:16.644 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:31:16.859 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:31:17.205 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:31:17.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:31:17.304 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:31:17.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-29T03:31:17.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-29T03:31:18.387 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:31:18.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:31:48.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:31:48.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:31:48.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:31:48.742 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:31:48.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:31:48.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:31:48.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-29T03:31:48.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:31:48.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-29T03:31:48.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:31:48.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:31:48.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:31:48.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-29T03:31:51.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-29T03:31:51.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:31:51.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:31:51.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:31:51.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:31:51.454 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:31:51.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:31:51.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:31:51.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:31:51.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:31:51.462 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:31:51.462 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:31:51.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:31:51.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:31:51.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:31:51.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:31:51.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:31:51.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:31:51.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:31:51.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:31:51.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:31:51.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:31:51.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:31:51.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:31:51.839 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:31:36
2026-05-29T03:31:51.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70773, datetime.datetime(2026, 5, 29, 3, 31, 36), datetime.datetime(2026, 5, 29, 3, 31, 36), 'salt', 6.49, 88.92, None, 12.49, 107.22, 1.69, 831.64, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:31:51.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:31:51.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:31:51.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:36, diff=15.846482s, valid=True
2026-05-29T03:31:51.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:31:51.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:31:51.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:12, diff=-20.150129s, valid=True
2026-05-29T03:31:51.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:31:51.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:31:51.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:29, diff=22.85774s, valid=True
2026-05-29T03:31:51.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:31:51.857 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:31:51.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:31:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:31:51.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:31:51.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:31:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:12, diff=-20.138698s, valid=True
2026-05-29T03:31:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:31:51.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:31:51.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:31:51.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950953.8621s, valid=True
2026-05-29T03:31:51.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:31:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:31:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:31:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:31:51.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:31:51.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:31:51.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:31:51.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:31:51.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:31:52.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:31:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:31:52.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:31:52.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:31:52.248 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:31:52.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:31:52.802 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:31:52.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:31:52.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:31:52.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-29T03:31:52.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-29T03:31:53.082 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:31:53.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:32:23.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:32:23.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:32:23.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:32:23.237 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:32:23.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:32:23.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:32:23.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-29T03:32:23.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:32:23.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:32:23.493 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:32:23.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:32:23.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:32:23.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-29T03:32:25.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:32:25.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:32:25.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:32:25.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:32:25.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:32:25.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:32:26.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:32:26.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:32:26.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:32:26.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:32:26.017 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:32:26.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:32:26.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:32:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:32:26.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:32:26.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:32:26.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:32:26.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:32:26.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:32:26.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:32:26.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:32:26.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:32:26.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:32:26.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:32:26.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:32:06
2026-05-29T03:32:26.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70774, datetime.datetime(2026, 5, 29, 3, 32, 6), datetime.datetime(2026, 5, 29, 3, 32, 6), 'salt', 6.49, 89.02, None, 12.81, 106.56, 1.67, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:32:26.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:32:26.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:32:26.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:06, diff=20.412093s, valid=True
2026-05-29T03:32:26.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:32:26.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:32:26.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:12, diff=14.415528s, valid=True
2026-05-29T03:32:26.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:32:26.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:31:59, diff=27.425222s, valid=True
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:32:26.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:32:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:12, diff=14.428977s, valid=True
2026-05-29T03:32:26.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:32:26.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:32:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:32:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=950988.429779s, valid=True
2026-05-29T03:32:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:32:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:32:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:32:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:32:26.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:32:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:32:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:32:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:32:26.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:32:26.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:32:26.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:32:26.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:32:26.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:32:26.753 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:32:26.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:32:27.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:32:27.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:32:27.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:32: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-29T03:32: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-29T03:32:27.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:32:27.591 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:32:57.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:32:57.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:32:57.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:32:57.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:32:57.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:32:58.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:32:58.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-29T03:32:58.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:32:58.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-29T03:32:58.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:32:58.262 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:32:58.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:32:58.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-29T03:33:01.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-29T03:33:01.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:33:01.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:33:01.510 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:33:01.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:33:01.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:33:01.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:33:01.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:33:01.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:33:01.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:33:01.530 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:33:01.530 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:33:01.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:33:01.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:33:01.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:33:01.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:33:01.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:33:01.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:33:01.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:33:01.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:33:01.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:33:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:33:01.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:33:01.832 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:33:01.895 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:32:36
2026-05-29T03:33:01.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70775, datetime.datetime(2026, 5, 29, 3, 32, 36), datetime.datetime(2026, 5, 29, 3, 32, 36), 'salt', 6.42, 88.88, None, 12.7, 106.82, 1.69, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:33:01.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:33:01.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:33:01.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:36, diff=25.901464s, valid=True
2026-05-29T03:33:01.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:33:01.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:33:01.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:12, diff=-10.095559s, valid=True
2026-05-29T03:33:01.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:33:01.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:32:30, diff=31.911315s, valid=True
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:33:01.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:33:01.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:12, diff=-10.085572s, valid=True
2026-05-29T03:33:01.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:33:01.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:33:01.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:33:01.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951023.915126s, valid=True
2026-05-29T03:33:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:33:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:33:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:33:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:33:01.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:33:01.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:33:01.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:33:01.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:33:01.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:33:02.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:33:02.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:33:02.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:33:02.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:33:02.232 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:33:02.446 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:33:02.816 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:33:02.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:33:02.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:33:02.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-29T03:33:02.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-29T03:33:03.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:33:03.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:33:33.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:33:33.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:33:33.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:33:33.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:33:33.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:33:33.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:33: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-29T03:33:33.571 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:33:33.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-29T03:33:33.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:33:33.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:33:33.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:33:33.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-29T03:33:36.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-29T03:33:36.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:33:36.040 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:33:36.040 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:33:36.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:33:36.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:33:36.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:33:36.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:33:36.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:33:36.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:33:36.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:33:36.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:33:36.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:33:36.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:33:36.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:33:36.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:33:36.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:33:36.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:33:36.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:33:36.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:33:36.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:33:36.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:33:36.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:33:36.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:33:36.447 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:33:07
2026-05-29T03:33:36.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70776, datetime.datetime(2026, 5, 29, 3, 33, 7), datetime.datetime(2026, 5, 29, 3, 33, 6), 'salt', 6.46, 88.98, None, 13.45, 108.2, 1.68, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:33:36.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:33:36.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:33:36.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:06, diff=30.454943s, valid=True
2026-05-29T03:33:36.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:33:36.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:33:36.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:12, diff=24.458327s, valid=True
2026-05-29T03:33:36.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:33:36.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:01, diff=35.466142s, valid=True
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:33:36.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:33:36.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:33:12, diff=24.469742s, valid=True
2026-05-29T03:33:36.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:33:36.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:33:36.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:33:36.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951058.470514s, valid=True
2026-05-29T03:33:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:33:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:33:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:33:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:33:36.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:33:36.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:33:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:33:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:33:36.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:33:36.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:33:36.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:33:36.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:33:36.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:33:36.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:33:37.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:33:37.408 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:33:37.507 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:33:37.507 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:33:37.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-29T03:33:37.508 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:33:37.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:33:37.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:34:07.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:34:07.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:34:07.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:34:08.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:34:08.052 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:34:08.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:34: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-29T03:34:08.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:34:08.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-29T03:34:08.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:34:08.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:34:08.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:34: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-29T03:34:10.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-29T03:34:10.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:34:10.667 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:34:10.668 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:34:10.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:34:10.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:34:10.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:34:10.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:34:10.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:34:10.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:34:10.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:34:10.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:34:10.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:34:10.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:34:10.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:34:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:34:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:34:10.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:34:10.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:34:11.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:34:11.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:34:11.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:34:11.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:34:11.019 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:34:11.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:34:07
2026-05-29T03:34:11.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70778, datetime.datetime(2026, 5, 29, 3, 34, 7), datetime.datetime(2026, 5, 29, 3, 34, 7), 'salt', 6.46, 89.08, None, 12.63, 107.92, 1.67, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:34:11.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:34:11.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:34:11.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:07, diff=4.093297s, valid=True
2026-05-29T03:34:11.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:34:11.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:34:11.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:12, diff=-0.90326s, valid=True
2026-05-29T03:34:11.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:34:11.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:34:11.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:04, diff=7.10459s, valid=True
2026-05-29T03:34:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:34:11.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:34:11.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:34:11.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:34:11.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:34:11.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:34:11.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:12, diff=-0.891742s, valid=True
2026-05-29T03:34:11.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:34:11.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:34:11.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:34:11.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951093.109062s, valid=True
2026-05-29T03:34:11.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:34:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:34:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:34:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:34:11.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:34:11.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:34:11.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:34:11.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:34:11.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:34:11.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:34:11.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:34:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:34:11.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:34:11.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:34:11.671 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:34:12.015 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:34:12.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:34:12.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:34:12.118 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:34:12.118 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:34:12.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:34:12.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:34:42.318 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:34:42.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:34: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-29T03:34:42.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:34:42.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:34:42.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:34:42.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-29T03:34:42.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:34:42.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:34:42.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:34:42.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:34:42.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:34:42.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-29T03:34:45.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-29T03:34:45.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:34:45.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:34:45.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:34:45.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:34:45.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:34:45.300 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:34:45.300 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:34:45.300 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:34:45.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:34:45.301 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:34:45.301 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:34:45.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:34:45.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:34:45.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:34:45.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:34:45.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:34:45.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:34:45.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:34:45.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:34:45.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:34:45.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:34:45.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:34:45.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:34:45.744 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:34:38
2026-05-29T03:34:45.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70779, datetime.datetime(2026, 5, 29, 3, 34, 38), datetime.datetime(2026, 5, 29, 3, 34, 37), 'salt', 6.49, 89.11, None, 12.7, 107.62, 1.66, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:34:45.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:34:45.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:34:45.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:37, diff=8.75217s, valid=True
2026-05-29T03:34:45.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:34:45.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:34:45.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:12, diff=-26.244196s, valid=True
2026-05-29T03:34:45.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:34:45.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:34:36, diff=9.764269s, valid=True
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:34:45.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:34:45.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:12, diff=-26.231863s, valid=True
2026-05-29T03:34:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:34:45.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:34:45.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:34:45.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951127.769001s, valid=True
2026-05-29T03:34:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:34:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:34:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:34:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:34:45.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:34:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:34:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:34:45.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:34:45.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:34:45.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:34:45.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:34:46.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:34:46.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:34:46.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:34:46.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:34:46.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:34:46.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:34:46.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:34:46.823 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:34:46.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-29T03:34:47.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:34:47.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:35:17.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:35:17.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:35:17.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:35:17.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:35:17.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:35:17.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:35:17.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-29T03:35:17.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:35:17.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-29T03:35:17.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:35:17.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:35:17.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:35:17.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-29T03:35:19.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-29T03:35:19.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:35:19.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:35:19.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:35:19.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:35:19.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:35:19.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:35:19.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:35:19.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:35:19.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:35:19.911 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:35:19.911 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:35:19.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:35:20.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:35:20.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:35:20.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:35:20.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:35:20.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:35:20.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:35:20.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:35:20.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:35:20.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:35:20.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:35:20.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:35:20.250 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:35:08
2026-05-29T03:35:20.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70780, datetime.datetime(2026, 5, 29, 3, 35, 8), datetime.datetime(2026, 5, 29, 3, 35, 7), 'salt', 6.49, 89.15, None, 12.18, 104.99, 1.65, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:35:20.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:35:20.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:35:20.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:07, diff=13.257304s, valid=True
2026-05-29T03:35:20.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:35:20.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:35:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:12, diff=8.260524s, valid=True
2026-05-29T03:35:20.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:35:20.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:35:20.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:07, diff=13.2679s, valid=True
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:35:20.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:35:20.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:12, diff=8.271194s, valid=True
2026-05-29T03:35:20.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:35:20.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:35:20.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:35:20.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951162.271941s, valid=True
2026-05-29T03:35:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:35:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:35:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:35:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:35:20.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:35:20.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:35:20.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:35:20.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:35:20.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:35:20.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:35:20.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:35:20.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:35:20.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:35:20.594 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:35:20.804 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:35:21.147 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:35:21.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:35:21.248 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:35:21.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-29T03:35:21.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-29T03:35:21.433 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:35:21.433 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:35:51.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:35:51.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:35:51.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:35:51.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:35:51.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:35:51.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:35:51.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-29T03:35:51.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:35:51.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-29T03:35:51.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:35:51.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:35:51.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:35:51.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-29T03:35:54.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-29T03:35:54.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:35:54.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:35:54.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:35:54.433 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:35:54.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:35:54.456 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:35:54.456 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:35:54.457 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:35:54.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:35:54.457 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:35:54.458 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:35:54.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:35:54.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:35:54.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:35:54.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:35:54.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:35:54.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:35:54.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:35:54.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:35:54.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:35:54.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:35:54.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:35:54.804 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:35:54.863 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:35:38
2026-05-29T03:35:54.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70781, datetime.datetime(2026, 5, 29, 3, 35, 38), datetime.datetime(2026, 5, 29, 3, 35, 38), 'salt', 6.42, 89.18, None, 12.39, 107.76, 1.64, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:35:54.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:35:54.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:35:54.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:38, diff=16.871184s, valid=True
2026-05-29T03:35:54.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:35:54.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:35:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:12, diff=-17.125296s, valid=True
2026-05-29T03:35:54.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:35:54.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:35:54.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:35:31, diff=23.882874s, valid=True
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:35:54.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:35:54.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:12, diff=-17.113332s, valid=True
2026-05-29T03:35:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:35:54.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:35:54.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:35:54.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951196.887482s, valid=True
2026-05-29T03:35:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:35:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:35:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:35:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:35:54.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:35:54.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:35:54.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:35:54.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:35:54.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:35:55.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:35:55.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:35:55.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:35:55.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:35:55.283 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:35:55.491 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:35:55.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:35:55.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:35:55.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:35:55.929 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:35:55.929 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:35:56.118 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:35:56.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:36:26.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:36:26.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:36: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-29T03:36:26.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:36:26.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:36:26.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:36:26.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:36:26.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:36:26.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-29T03:36:26.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:36:26.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:36:26.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:36:26.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-29T03:36:29.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-29T03:36:29.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:36:29.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:36:29.196 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:36:29.196 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:36:29.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:36:29.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:36:29.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:36:29.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:36:29.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:36:29.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:36:29.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:36:29.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:36:29.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:36:29.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:36:29.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:36:29.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:36:29.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:36:29.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:36:29.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:36:29.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:36:29.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:36:29.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:36:29.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:36:29.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:36:08
2026-05-29T03:36:29.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70782, datetime.datetime(2026, 5, 29, 3, 36, 8), datetime.datetime(2026, 5, 29, 3, 36, 8), 'salt', 6.46, 89.21, None, 11.79, 108.49, 1.64, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:36:29.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:36:29.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:36:29.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:08, diff=21.618847s, valid=True
2026-05-29T03:36:29.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:36:29.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:36:29.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:12, diff=17.622362s, valid=True
2026-05-29T03:36:29.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:36:29.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:01, diff=28.630445s, valid=True
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:36:29.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:36:29.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:36:29.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:12, diff=17.634143s, valid=True
2026-05-29T03:36:29.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:36:29.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:36:29.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:36:29.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951231.634974s, valid=True
2026-05-29T03:36:29.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:36:29.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:36:29.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:36:29.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:36:29.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:36:29.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:36:29.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:36:29.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:36:29.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:36:29.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:36:29.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:36:29.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:36:29.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:36:29.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:36:30.196 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:36:30.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:36:30.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:36:30.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:36:30.644 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:36:30.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-29T03:36:30.730 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:36:30.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:37:00.747 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:37:00.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:37:00.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:37:00.877 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:37:00.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:37:01.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:37:01.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-29T03:37:01.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:37:01.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-29T03:37:01.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:37:01.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:37:01.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:37:01.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-29T03:37:03.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-29T03:37:03.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:37:03.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:37:03.588 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:37:03.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:37:03.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:37:03.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:37:03.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:37:03.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:37:03.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:37:03.614 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:37:03.615 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:37:03.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:37:03.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:37:03.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:37:03.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:37:03.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:37:03.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:37:03.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:37:03.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:37:03.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:37:03.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:37:03.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:37:03.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:37:03.975 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:36:39
2026-05-29T03:37:03.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70783, datetime.datetime(2026, 5, 29, 3, 36, 39), datetime.datetime(2026, 5, 29, 3, 36, 38), 'salt', 6.46, 89.28, None, 12.1, 111.0, 1.63, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:37:03.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:37:03.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:37:03.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:38, diff=25.982456s, valid=True
2026-05-29T03:37:03.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:37:03.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:37:03.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:12, diff=-8.014117s, valid=True
2026-05-29T03:37:03.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:37:03.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:37:03.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:36:32, diff=31.993736s, valid=True
2026-05-29T03:37:03.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:37:03.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:37:03.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:37:03.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:37:03.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:37:03.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:37:03.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:12, diff=-8.002678s, valid=True
2026-05-29T03:37:03.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:37:03.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:37:03.997 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:37:03.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951265.998103s, valid=True
2026-05-29T03:37:03.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:37:03.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:37:04.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:37:04.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:37:04.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:37:04.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:37:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:37:04.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:37:04.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:37:04.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:37:04.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:37:04.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:37:04.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:37:04.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:37:04.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:37:04.951 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:37:05.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:37:05.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:37:05.050 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:37:05.050 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:37:05.234 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:37:05.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:37:35.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:37:35.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:37:35.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:37:35.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:37:35.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:37:35.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:37:35.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-29T03:37:35.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:37:35.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-29T03:37:35.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:37:35.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:37:35.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:37:35.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-29T03:37:38.252 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:37:38.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:37:38.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:37:38.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:37:38.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:37:38.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:37:38.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:37:38.286 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:37:38.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:37:38.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:37:38.287 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:37:38.287 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:37:38.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:37:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:37:38.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:37:38.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:37:38.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:37:38.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:37:38.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:37:38.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T03:37:38.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:37:38.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:37:38.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:37:38.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:37:38.694 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:37:09
2026-05-29T03:37:38.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70784, datetime.datetime(2026, 5, 29, 3, 37, 9), datetime.datetime(2026, 5, 29, 3, 37, 9), 'salt', 6.46, 89.31, None, 11.79, 110.34, 1.63, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:37:38.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:37:38.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:37:38.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:09, diff=29.702431s, valid=True
2026-05-29T03:37:38.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:37:38.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:37:38.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:12, diff=26.705941s, valid=True
2026-05-29T03:37:38.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:37:38.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:02, diff=36.714091s, valid=True
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:37:38.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T03:37:38.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:37:12, diff=26.717798s, valid=True
2026-05-29T03:37:38.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:37:38.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:37:38.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:37:38.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951300.718641s, valid=True
2026-05-29T03:37:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:37:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:37:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:37:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:37:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:37:38.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:37:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:37:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:37:38.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:37:38.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:37:38.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:37:38.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:37:39.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:37:39.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:37:39.244 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:37:39.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:37:39.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:37:39.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:37:39.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-29T03:37:39.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-29T03:37:39.763 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:37:39.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:38:09.780 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:38:09.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:38:09.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:38:10.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:38:10.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:38:10.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:38:10.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-29T03:38:10.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:38:10.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:38:10.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:38:10.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:38:10.308 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:38:10.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:38:12.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-29T03:38:12.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:38:12.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:38:12.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:38:12.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:38:12.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:38:12.797 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:38:12.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:38:12.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:38:12.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:38:12.799 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:38:12.799 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:38:12.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:38:12.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:38:12.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:38:13.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:38:13.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:38:13.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:38:13.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:38:13.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T03:38:13.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:38:13.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:38:13.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:38:13.136 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:38:13.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:38:09
2026-05-29T03:38:13.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70786, datetime.datetime(2026, 5, 29, 3, 38, 9), datetime.datetime(2026, 5, 29, 3, 38, 9), 'salt', 6.42, 89.35, None, 11.58, 107.31, 1.62, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:38:13.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:38:13.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:38:13.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:09, diff=4.215022s, valid=True
2026-05-29T03:38:13.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:38:13.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:38:13.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:12, diff=1.218479s, valid=True
2026-05-29T03:38:13.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:38:13.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:06, diff=7.226362s, valid=True
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:38:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T03:38:13.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:12, diff=1.229996s, valid=True
2026-05-29T03:38:13.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:38:13.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:38:13.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:38:13.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951335.230814s, valid=True
2026-05-29T03:38:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:38:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:38:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:38:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:38:13.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:38:13.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:38:13.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:38:13.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:38:13.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:38:13.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:38:13.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:38:13.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:38:13.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:38:13.618 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:38:13.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:38:14.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:38:14.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:38:14.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:38:14.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-29T03:38:14.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-29T03:38:14.437 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:38:14.437 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:38:44.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:38:44.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:38:44.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:38:44.622 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:38:44.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:38:44.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:38:44.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-29T03:38:44.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:38:44.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-29T03:38:44.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:38:44.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:38:44.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:38:44.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-29T03:38:48.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-29T03:38:48.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:38:48.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:38:48.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:38:48.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:38:48.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:38:48.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:38:48.110 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:38:48.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:38:48.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:38:48.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:38:48.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:38:48.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:38:48.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:38:48.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:38:48.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:38:48.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:38:48.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:38:48.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:38:48.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:38:48.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:38:48.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:38:48.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:38:48.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:38:48.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:38:40
2026-05-29T03:38:48.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70787, datetime.datetime(2026, 5, 29, 3, 38, 40), datetime.datetime(2026, 5, 29, 3, 38, 39), 'salt', 6.46, 89.31, None, 11.58, 108.82, 1.63, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:38:48.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:38:48.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:38:48.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:39, diff=9.516647s, valid=True
2026-05-29T03:38:48.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:38:48.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:38:48.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:12, diff=-23.480018s, valid=True
2026-05-29T03:38:48.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:38:48.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:38:37, diff=11.528074s, valid=True
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:38:48.528 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:38:48.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:12, diff=-23.468327s, valid=True
2026-05-29T03:38:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:38:48.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:38:48.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:38:48.532 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951370.532454s, valid=True
2026-05-29T03:38:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:38:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:38:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:38:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:38:48.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:38:48.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:38:48.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:38:48.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:38:48.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:38:48.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:38:48.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:38:48.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:38:48.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:38:48.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:38:49.059 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:38:49.391 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:38:49.488 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:38:49.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:38:49.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-29T03:38:49.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-29T03:38:49.738 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:38:49.738 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:39:19.769 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:39:19.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:39:19.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:39:20.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:39:20.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:39:20.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:39:20.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-29T03:39:20.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:39:20.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-29T03:39:20.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:39:20.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:39:20.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:39:20.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-29T03:39:22.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:39:22.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:39:22.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:39:22.684 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:39:22.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:39:22.696 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:39:22.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:39:22.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:39:22.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:39:22.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:39:22.711 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:39:22.711 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:39:22.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:39:22.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:39:22.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:39:22.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:39:22.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:39:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:39:22.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:39:23.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T03:39:23.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:39:23.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:39:23.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:39:23.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:39:23.097 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:39:10
2026-05-29T03:39:23.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70788, datetime.datetime(2026, 5, 29, 3, 39, 10), datetime.datetime(2026, 5, 29, 3, 39, 10), 'salt', 6.46, 89.35, None, 11.36, 109.73, 1.62, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:39:23.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:39:23.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:39:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:10, diff=13.104561s, valid=True
2026-05-29T03:39:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:39:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:39:23.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:12, diff=11.108089s, valid=True
2026-05-29T03:39:23.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:39:23.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:08, diff=15.116152s, valid=True
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:39:23.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T03:39:23.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:12, diff=11.119889s, valid=True
2026-05-29T03:39:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:39:23.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:39:23.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:39:23.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951405.1207s, valid=True
2026-05-29T03:39:23.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:39:23.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:39:23.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:39:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:39:23.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:39:23.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:39:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:39:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:39:23.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:39:23.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:39:23.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:39:23.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:39:23.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:39:23.453 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:39:23.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:39:23.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:39:24.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:39:24.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:39:24.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-29T03:39:24.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-29T03:39:24.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:39:24.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:39:54.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:39:54.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:39:54.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:39:54.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:39:54.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:39:55.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:39:55.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-29T03:39:55.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:39: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-29T03:39:55.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:39:55.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:39:55.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:39:55.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-29T03:39:58.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-29T03:39:58.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:39:58.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:39:58.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:39:58.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:39:58.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:39:58.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:39:58.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:39:58.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:39:58.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:39:58.318 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:39:58.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:39:58.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:39:58.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:39:58.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:39:58.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:39:58.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:39:58.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:39:58.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:39:58.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:39:58.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:39:58.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:39:58.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:39:58.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:39:58.707 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:39:40
2026-05-29T03:39:58.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70789, datetime.datetime(2026, 5, 29, 3, 39, 40), datetime.datetime(2026, 5, 29, 3, 39, 40), 'salt', 6.39, 89.21, None, 11.19, 110.29, 1.64, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:39:58.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:39:58.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:39:58.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:40, diff=18.715198s, valid=True
2026-05-29T03:39:58.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:39:58.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:39:58.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:12, diff=-13.281423s, valid=True
2026-05-29T03:39:58.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:39:58.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:39:40, diff=18.726442s, valid=True
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:39:58.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:39:58.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:12, diff=-13.269976s, valid=True
2026-05-29T03:39:58.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:39:58.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:39:58.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:39:58.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951440.730811s, valid=True
2026-05-29T03:39:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:39:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:39:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:39:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:39:58.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:39:58.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:39:58.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:39:58.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:39:58.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:39:58.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:39:58.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:39:58.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:39:59.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:39:59.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:39:59.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:39:59.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:39:59.738 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:39:59.738 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:39:59.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-29T03:39:59.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-29T03:39:59.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:39:59.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:40:29.942 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:40:29.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:40:29.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:40:30.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:40:30.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:40:30.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:40:30.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-29T03:40:30.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:40:30.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-29T03:40:30.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:40:30.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:40:30.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:40:30.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-29T03:40: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-29T03:40:32.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:40:32.946 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:40:32.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:40:32.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:40:32.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:40:32.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:40:32.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:40:32.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:40:32.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:40:32.971 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:40:32.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:40:32.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:40:33.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:40:33.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:40:33.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:40:33.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:40:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:40:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:40:33.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T03:40:33.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:40:33.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:40:33.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:40:33.289 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:40:33.349 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:40:10
2026-05-29T03:40:33.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70790, datetime.datetime(2026, 5, 29, 3, 40, 10), datetime.datetime(2026, 5, 29, 3, 40, 10), 'salt', 6.36, 89.18, None, 11.4, 106.77, 1.65, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:40:33.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:40:33.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:40:33.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:10, diff=23.356231s, valid=True
2026-05-29T03:40:33.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:40:33.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:40:33.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:12, diff=21.359613s, valid=True
2026-05-29T03:40:33.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:40:33.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:03, diff=30.367408s, valid=True
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:40:33.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T03:40:33.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:12, diff=21.371016s, valid=True
2026-05-29T03:40:33.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:40:33.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:40:33.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:40:33.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951475.37181s, valid=True
2026-05-29T03:40:33.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:40:33.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:40:33.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:40:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:40:33.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:40:33.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:40:33.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:40:33.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:40:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:40:33.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:40:33.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:40:33.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:40:33.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:40:33.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:40:33.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:40:34.225 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:40:34.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:40:34.323 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:40:34.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-29T03:40:34.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-29T03:40:34.529 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:40:34.529 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:41:04.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:41:04.560 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:41:04.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:41:05.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:41:05.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:41:05.295 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:41:05.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-29T03:41:05.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:41:05.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-29T03:41:05.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:41:05.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:41:05.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:41:05.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-29T03:41:07.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-29T03:41:07.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:41:07.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:41:07.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:41:07.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:41:07.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:41:07.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:41:07.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:41:07.848 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:41:07.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:41:07.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:41:07.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:41:07.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:41:07.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:41:07.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:41:08.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:41:08.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:41:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:41:08.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:41:08.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T03:41:08.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:41:08.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:41:08.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:41:08.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:41:08.226 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:40:41
2026-05-29T03:41:08.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70791, datetime.datetime(2026, 5, 29, 3, 40, 41), datetime.datetime(2026, 5, 29, 3, 40, 40), 'salt', 6.46, 89.21, None, 11.75, 107.38, 1.65, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:41:08.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:41:08.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:41:08.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:40, diff=28.234073s, valid=True
2026-05-29T03:41:08.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:41:08.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:41:08.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:41:12, diff=-3.76249s, valid=True
2026-05-29T03:41:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:41:08.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:41:08.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:40:33, diff=35.245564s, valid=True
2026-05-29T03:41:08.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:41:08.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:41:08.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:41:08.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:41:08.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:41:08.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T03:41:08.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:41:12, diff=-3.750655s, valid=True
2026-05-29T03:41:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:41:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:41:08.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:41:08.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951510.250165s, valid=True
2026-05-29T03:41:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:41:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:41:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:41:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:41:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:41:08.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:41:08.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:41:08.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:41:08.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:41:08.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:41:08.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:41:08.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:41:08.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:41:08.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:41:08.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:41:09.184 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:41:09.282 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:41:09.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:41: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-29T03:41: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-29T03:41:09.466 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:41:09.466 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:41:39.496 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:41:39.496 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:41:39.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:41:39.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:41:39.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:41:40.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:41:40.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-29T03:41:40.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:41:40.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-29T03:41:40.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:41:40.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:41:40.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:41:40.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-29T03:41:42.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:41:42.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:41:42.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:41:42.888 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:41:42.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:41:42.898 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:41:42.911 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:41:42.912 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:41:42.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:41:42.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:41:42.913 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:41:42.913 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:41:42.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:41:43.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T03:41:43.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:41:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T03:41:43.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:41:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:41:43.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:41:43.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:41:43.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:41:43.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:41:43.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:41:43.228 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:41:43.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:41:41
2026-05-29T03:41:43.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70793, datetime.datetime(2026, 5, 29, 3, 41, 41), datetime.datetime(2026, 5, 29, 3, 41, 41), 'salt', 6.36, 89.11, None, 11.54, 108.68, 1.66, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:41:43.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:41:43.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T03:41:43.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:41:41, diff=2.298703s, valid=True
2026-05-29T03:41:43.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:41:43.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:41:43.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:12, diff=-28.697902s, valid=True
2026-05-29T03:41:43.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:41:43.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:41:36, diff=7.310026s, valid=True
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:41:43.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:41:43.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:12, diff=-28.686322s, valid=True
2026-05-29T03:41:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:41:43.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:41:43.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:41:43.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951545.314494s, valid=True
2026-05-29T03:41:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:41:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:41:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:41:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:41:43.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:41:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:41:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:41:43.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:41:43.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:41:43.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:41:43.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:41:43.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:41:43.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:41:43.636 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:41:43.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:41:44.168 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:41:44.265 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:41:44.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:41:44.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-29T03:41:44.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-29T03:41:44.445 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:41:44.445 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:42:14.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:42:14.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:42:14.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:42:14.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:42:14.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:42:14.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:42:14.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-29T03:42:14.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:42:14.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-29T03:42:15.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:42:15.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:42:15.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:42:15.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:42:17.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-29T03:42:17.309 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:42:17.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:42:17.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:42:17.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:42:17.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:42:17.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:42:17.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:42:17.343 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:42:17.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:42:17.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:42:17.344 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:42:17.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:42:17.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:42:17.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:42:17.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:42:17.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:42:17.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:42:17.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:42:17.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:42:17.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:42:17.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:42:17.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:42:17.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:42:17.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:42:11
2026-05-29T03:42:17.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70794, datetime.datetime(2026, 5, 29, 3, 42, 11), datetime.datetime(2026, 5, 29, 3, 42, 11), 'salt', 6.32, 89.01, None, 12.03, 110.81, 1.67, 831.69, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:42:17.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:42:17.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:42:17.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:11, diff=6.727041s, valid=True
2026-05-29T03:42:17.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:42:17.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:42:17.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:12, diff=5.730562s, valid=True
2026-05-29T03:42:17.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:42:17.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:07, diff=10.738481s, valid=True
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:42:17.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:42:17.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:42:17.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:12, diff=5.742149s, valid=True
2026-05-29T03:42:17.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:42:17.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:42:17.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:42:17.742 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951579.742954s, valid=True
2026-05-29T03:42:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:42:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:42:17.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:42:17.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:42:17.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:42:17.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:42:17.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:42:17.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:42:17.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:42:17.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:42:17.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:42:17.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:42:18.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:42:18.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:42:18.355 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:42:18.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:42:18.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:42:18.786 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:42:18.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-29T03:42:18.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-29T03:42:18.965 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:42:18.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:42:48.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:42:48.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:42:48.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:42:49.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:42:49.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:42:49.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:42:49.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-29T03:42:49.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:42:49.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-29T03:42:49.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:42:49.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:42:49.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:42:49.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-29T03:42:51.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-29T03:42:51.795 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:42:51.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:42:51.804 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:42:51.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:42:51.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:42:51.825 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:42:51.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:42:51.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:42:51.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:42:51.827 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:42:51.827 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:42:51.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:42:51.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:42:51.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:42:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:42:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:42:52.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:42:52.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:42:52.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:42:52.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:42:52.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:42:52.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:42:52.153 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:42:52.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:42:42
2026-05-29T03:42:52.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70795, datetime.datetime(2026, 5, 29, 3, 42, 42), datetime.datetime(2026, 5, 29, 3, 42, 41), 'salt', 6.42, 89.15, None, 11.58, 108.23, 1.65, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:42:52.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:42:52.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:42:52.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:41, diff=11.229067s, valid=True
2026-05-29T03:42:52.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:42:52.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:42:52.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:12, diff=-19.767524s, valid=True
2026-05-29T03:42:52.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:42:52.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:42:38, diff=14.240309s, valid=True
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:42:52.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:42:52.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:12, diff=-19.7561s, valid=True
2026-05-29T03:42:52.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:42:52.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:42:52.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:42:52.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951614.24469s, valid=True
2026-05-29T03:42:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:42:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:42:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:42:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:42:52.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:42:52.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:42:52.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:42:52.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:42:52.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:42:52.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:42:52.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:42:52.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:42:52.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:42:52.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:42:52.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:42:53.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:42:53.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:42:53.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:42:53.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:42:53.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:42:53.407 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:42:53.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:43:23.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:43:23.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:43:23.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:43:23.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:43:23.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:43:24.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:43:24.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-29T03:43:24.066 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:43:24.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-29T03:43:24.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:43:24.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:43:24.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:43:24.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-29T03:43:26.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-29T03:43:26.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:43:26.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:43:26.583 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:43:26.583 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:43:26.593 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:43:26.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:43:26.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:43:26.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:43:26.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:43:26.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:43:26.607 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:43:26.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:43:26.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:43:26.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:43:26.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:43:26.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:43:26.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:43:26.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:43:26.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:43:26.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:43:26.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:43:26.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:43:26.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:43:26.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:43:12
2026-05-29T03:43:26.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70796, datetime.datetime(2026, 5, 29, 3, 43, 12), datetime.datetime(2026, 5, 29, 3, 43, 12), 'salt', 6.36, 89.08, None, 11.75, 110.18, 1.67, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:43:26.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:43:26.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:43:27.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:12, diff=15.002629s, valid=True
2026-05-29T03:43:27.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:43:27.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:43:27.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:12, diff=15.006054s, valid=True
2026-05-29T03:43:27.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:43:27.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:43:27.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:10, diff=17.013912s, valid=True
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:43:27.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:43:27.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:12, diff=15.017521s, valid=True
2026-05-29T03:43:27.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:43:27.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:43:27.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:43:27.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951649.018319s, valid=True
2026-05-29T03:43:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:43:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:43:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:43:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:43:27.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:43:27.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:43:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:43:27.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:43:27.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:43:27.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:43:27.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:43:27.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:43:27.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:43:27.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:43:27.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:43:27.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:43:28.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:43:28.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:43:28.052 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:43:28.052 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:43:28.275 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:43:28.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:43:58.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:43:58.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:43:58.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:43:58.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:43:58.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:43:58.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:43:58.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-29T03:43:58.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:43:58.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-29T03:43:58.703 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:43:58.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:43:58.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:43:58.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-29T03:44:01.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:44:01.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:44:01.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:44:01.132 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:44:01.132 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:44:01.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:44:01.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:44:01.154 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:44:01.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:44:01.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:44:01.155 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:44:01.155 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:44:01.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:44:01.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:44:01.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:44:01.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:44:01.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:44:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:44:01.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:44:01.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:44:01.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:44:01.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:44:01.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:44:01.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:44:01.534 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:43:42
2026-05-29T03:44:01.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70797, datetime.datetime(2026, 5, 29, 3, 43, 42), datetime.datetime(2026, 5, 29, 3, 43, 41), 'salt', 6.36, 89.08, None, 11.89, 108.51, 1.66, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:44:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:44:01.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:44:01.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:41, diff=20.541514s, valid=True
2026-05-29T03:44:01.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:44:01.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:44:01.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:12, diff=-10.455472s, valid=True
2026-05-29T03:44:01.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:44:01.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:43:41, diff=20.551525s, valid=True
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:44:01.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:44:01.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:44:01.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:12, diff=-10.445275s, valid=True
2026-05-29T03:44:01.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:44:01.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:44:01.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:44:01.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951683.555441s, valid=True
2026-05-29T03:44:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:44:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:44:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:44:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:44:01.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:44:01.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:44:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:44:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:44:01.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:44:01.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:44:01.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:44:01.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:44:01.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:44:01.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:44:02.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:44:02.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:44:02.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:44:02.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:44:02.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:44:02.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-29T03:44:02.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:44:02.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:44:32.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:44:32.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:44:32.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:44:32.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:44:32.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:44:33.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:44:33.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-29T03:44:33.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:44:33.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-29T03:44:33.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:44:33.132 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:44:33.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:44:33.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:44:35.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-29T03:44:35.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:44:35.590 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:44:35.591 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:44:35.591 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:44:35.599 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:44:35.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:44:35.606 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:44:35.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:44:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:44:35.607 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:44:35.608 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:44:35.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:44:35.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:44:35.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:44:35.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:44:35.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:44:35.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:44:35.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:44:35.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:44:35.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:44:35.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:44:35.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:44:35.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:44:35.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:44:12
2026-05-29T03:44:35.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70798, datetime.datetime(2026, 5, 29, 3, 44, 12), datetime.datetime(2026, 5, 29, 3, 44, 12), 'salt', 6.32, 89.01, None, 12.03, 109.68, 1.67, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:44:35.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:44:35.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:44:35.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:12, diff=23.995133s, valid=True
2026-05-29T03:44:35.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:44:35.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:44:35.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:12, diff=23.9985s, valid=True
2026-05-29T03:44:35.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:44:35.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:05, diff=31.006403s, valid=True
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:44:36.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:44:36.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:12, diff=24.010028s, valid=True
2026-05-29T03:44:36.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:44:36.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:44:36.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:44:36.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951718.010831s, valid=True
2026-05-29T03:44:36.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:44:36.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:44:36.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:44:36.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:44:36.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:44:36.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:44:36.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:44:36.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:44:36.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:44:36.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:44:36.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:44:36.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:44:36.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:44:36.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:44:36.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:44:36.942 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:44:37.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:44:37.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:44:37.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-29T03:44:37.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-29T03:44:37.295 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:44:37.295 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:45:07.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:45:07.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:45:07.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:45:07.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:45:07.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:45:07.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:45:07.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:45:07.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:45:07.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-29T03:45:07.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:45:07.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:45:07.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:45:07.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-29T03:45:10.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-29T03:45:10.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:45:10.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:45:10.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:45:10.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:45:10.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:45:10.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:45:10.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:45:10.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:45:10.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:45:10.114 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:45:10.114 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:45:10.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:45:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:45:10.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:45:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:45:10.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:45:10.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:45:10.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:45:10.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:45:10.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:45:10.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:45:10.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:45:10.397 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:45:10.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:44:43
2026-05-29T03:45:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70799, datetime.datetime(2026, 5, 29, 3, 44, 43), datetime.datetime(2026, 5, 29, 3, 44, 42), 'salt', 6.32, 89.05, None, 11.89, 108.98, 1.66, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:45:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:45:10.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:45:10.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:42, diff=28.461467s, valid=True
2026-05-29T03:45:10.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:45:10.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:45:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:45:12, diff=-1.535594s, valid=True
2026-05-29T03:45:10.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:45:10.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:44:35, diff=35.471167s, valid=True
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:45:10.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:45:10.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:45:12, diff=-1.525479s, valid=True
2026-05-29T03:45:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:45:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:45:10.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:45:10.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951752.475307s, valid=True
2026-05-29T03:45:10.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:45:10.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:45:10.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:45:10.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:45:10.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:45:10.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:45:10.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:45:10.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:45:10.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:45:10.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:45:10.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:45:10.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:45:10.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:45:10.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:45:11.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:45:11.375 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:45:11.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:45:11.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:45:11.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-29T03:45:11.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-29T03:45:11.627 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:45:11.627 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:45:41.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:45:41.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:45:41.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:45:41.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:45:41.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:45:42.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:45:42.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-29T03:45:42.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:45:42.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-29T03:45:42.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:45:42.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:45:42.108 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:45:42.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-29T03:45: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-29T03:45:44.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:45:44.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:45:44.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:45:44.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:45:44.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:45:44.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:45:44.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:45:44.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:45:44.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:45:44.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:45:44.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:45:44.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:45:44.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:45:44.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:45:44.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:45:44.926 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:45:44.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:45:44.970 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:45:45.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:45:45.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:45:45.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:45:45.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:45:45.017 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:45:45.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:45:43
2026-05-29T03:45:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70801, datetime.datetime(2026, 5, 29, 3, 45, 43), datetime.datetime(2026, 5, 29, 3, 45, 43), 'salt', 6.19, 88.88, None, 12.25, 110.13, 1.69, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:45:45.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:45:45.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:45:45.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:45:43, diff=2.084184s, valid=True
2026-05-29T03:45:45.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:45:45.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:45:45.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:12, diff=-26.912427s, valid=True
2026-05-29T03:45:45.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:45:45.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:45:37, diff=8.095415s, valid=True
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:45:45.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:45:45.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:12, diff=-26.900977s, valid=True
2026-05-29T03:45:45.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:45:45.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:45:45.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:45:45.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951787.099811s, valid=True
2026-05-29T03:45:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:45:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:45:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:45:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:45:45.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:45:45.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:45:45.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:45:45.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:45:45.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:45:45.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:45:45.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:45:45.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:45:45.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:45:45.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:45:45.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:45:45.979 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:45:46.079 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:45:46.079 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:45:46.079 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:45:46.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-29T03:45:46.257 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:45:46.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:46:16.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:46:16.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:46:16.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:46:16.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:46:16.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:46:16.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:46:16.994 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:46:17.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:46:17.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:46:17.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:46:17.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:46:17.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:46:17.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-29T03:46:19.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-29T03:46:19.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:46:19.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:46:19.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:46:19.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:46:19.364 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:46:19.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:46:19.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:46:19.377 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:46:19.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:46:19.377 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:46:19.377 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:46:19.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:46:19.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:46:19.504 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:46:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:46:19.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:46:19.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:46:19.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:46:19.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:46:19.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:46:19.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:46:19.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:46:19.690 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:46:19.748 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:46:14
2026-05-29T03:46:19.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70802, datetime.datetime(2026, 5, 29, 3, 46, 14), datetime.datetime(2026, 5, 29, 3, 46, 13), 'salt', 6.42, 89.01, None, 13.06, 112.67, 1.67, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:46:19.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:46:19.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:46:19.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:13, diff=6.756181s, valid=True
2026-05-29T03:46:19.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:46:19.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:46:19.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:12, diff=7.759556s, valid=True
2026-05-29T03:46:19.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:46:19.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:08, diff=11.767414s, valid=True
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:46:19.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:46:19.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:12, diff=7.771069s, valid=True
2026-05-29T03:46:19.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:46:19.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:46:19.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:46:19.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951821.771873s, valid=True
2026-05-29T03:46:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:46:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:46:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:46:19.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:46:19.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:46:19.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:46:19.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:46:19.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:46:19.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:46:19.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:46:19.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:46:20.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:46:20.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:46:20.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:46:20.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:46:20.647 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:46:20.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:46:20.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:46:20.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-29T03:46:20.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-29T03:46:21.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:46:21.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:46:51.031 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:46:51.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:46:51.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:46:51.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:46:51.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:46:51.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:46:51.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:46:51.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:46: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-29T03:46:51.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:46:51.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:46:51.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:46:51.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-29T03:46:53.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-29T03:46:53.851 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:46:53.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:46:53.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:46:53.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:46:53.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:46:53.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:46:53.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:46:53.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:46:53.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:46:53.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:46:53.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:46:53.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:46:54.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:46:54.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:46:54.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:46:54.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:46:54.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:46:54.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:46:54.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:46:54.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:46:54.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:46:54.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:46:54.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:46:54.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:46:44
2026-05-29T03:46:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70803, datetime.datetime(2026, 5, 29, 3, 46, 44), datetime.datetime(2026, 5, 29, 3, 46, 43), 'salt', 6.42, 89.01, None, 12.77, 113.39, 1.67, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:46:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:46:54.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:46:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:43, diff=11.28046s, valid=True
2026-05-29T03:46:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:46:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:46:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:12, diff=-17.716169s, valid=True
2026-05-29T03:46:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:46:54.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:46:54.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:46:39, diff=15.29163s, valid=True
2026-05-29T03:46:54.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:46:54.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:46:54.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:46:54.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:46:54.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:46:54.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:46:54.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:12, diff=-17.704786s, valid=True
2026-05-29T03:46:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:46:54.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:46:54.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:46:54.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951856.296024s, valid=True
2026-05-29T03:46:54.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:46:54.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:46:54.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:46:54.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:46:54.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:46:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:46:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:46:54.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:46:54.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:46:54.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:46:54.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:46:54.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:46:54.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:46:54.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:46:54.819 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:46:55.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:46:55.249 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:46:55.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:46:55.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-29T03:46:55.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-29T03:46:55.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:46:55.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:47:25.435 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:47:25.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:47:25.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:47:25.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:47:25.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:47:25.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:47:25.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-29T03:47:25.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:47:25.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:47:25.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:47:25.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:47:25.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:47:25.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-29T03:47:28.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:47:28.177 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:47:28.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:47:28.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:47:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:47:28.189 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:47:28.201 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:47:28.201 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:47:28.201 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:47:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:47:28.202 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:47:28.202 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:47:28.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:47:28.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:47:28.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:47:28.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:47:28.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:47:28.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:47:28.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:47:28.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:47:28.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:47:28.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:47:28.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:47:28.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:47:28.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:47:14
2026-05-29T03:47:28.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70804, datetime.datetime(2026, 5, 29, 3, 47, 14), datetime.datetime(2026, 5, 29, 3, 47, 14), 'salt', 6.49, 88.88, None, 12.53, 113.96, 1.7, 831.75, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:47:28.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:47:28.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:47:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:14, diff=14.552512s, valid=True
2026-05-29T03:47:28.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:47:28.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:47:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:12, diff=16.555539s, valid=True
2026-05-29T03:47:28.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:47:28.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:47:28.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:11, diff=17.562585s, valid=True
2026-05-29T03:47:28.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:47:28.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:47:28.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:47:28.562 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:47:28.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:47:28.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:47:28.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:12, diff=16.565804s, valid=True
2026-05-29T03:47:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:47:28.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:47:28.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:47:28.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951890.566508s, valid=True
2026-05-29T03:47:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:47:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:47:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:47:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:47:28.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:47:28.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:47:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:47:28.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:47:28.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:47:28.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:47:28.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:47:28.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:47:28.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:47:28.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:47:29.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:47:29.507 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:47:29.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:47:29.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:47:29.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-29T03:47:29.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-29T03:47:29.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:47:29.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:47:59.865 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:47:59.865 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:47:59.865 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:48:00.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:48:00.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:48:00.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:48:00.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-29T03:48:00.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:48:00.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-29T03:48:00.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:48:00.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:48:00.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:48:00.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-29T03:48:03.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:48:03.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:48:03.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:48:03.251 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:48:03.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:48:03.262 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:48:03.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:48:03.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:48:03.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:48:03.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:48:03.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:48:03.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:48:03.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:48:03.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:48:03.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:48:03.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:48:03.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:48:03.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:48:03.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:48:03.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:48:03.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:48:03.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:48:03.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:48:03.600 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:48:03.660 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:47:44
2026-05-29T03:48:03.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70805, datetime.datetime(2026, 5, 29, 3, 47, 44), datetime.datetime(2026, 5, 29, 3, 47, 44), 'salt', 6.42, 88.78, None, 11.79, 117.72, 1.71, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:48:03.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:48:03.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:48:03.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:44, diff=19.668378s, valid=True
2026-05-29T03:48:03.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:48:03.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:48:03.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:12, diff=-8.328119s, valid=True
2026-05-29T03:48:03.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:48:03.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:47:42, diff=21.680169s, valid=True
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:48:03.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:48:03.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:12, diff=-8.316075s, valid=True
2026-05-29T03:48:03.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:48:03.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:48:03.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:48:03.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951925.684769s, valid=True
2026-05-29T03:48:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:48:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:48:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:48:03.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:48:03.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:48:03.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:48:03.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:48:03.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:48:03.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:48:03.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:48:03.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:48:03.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:48:03.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:48:04.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:48:04.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:48:04.555 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:48:04.656 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:48:04.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:48:04.657 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:48:04.657 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:48:04.948 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:48:04.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:48:34.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:48:34.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:48:34.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:48:35.428 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:48:35.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:48:35.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:48:35.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:48:35.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:48:35.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-29T03:48:35.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:48:35.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:48:35.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:48:35.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-29T03:48:38.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-29T03:48:38.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:48:38.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:48:38.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:48:38.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:48:38.150 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:48:38.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:48:38.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:48:38.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:48:38.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:48:38.164 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:48:38.165 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:48:38.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:48:38.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:48:38.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:48:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:48:38.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:48:38.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:48:38.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:48:38.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:48:38.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:48:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:48:38.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:48:38.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:48:38.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:48:15
2026-05-29T03:48:38.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70806, datetime.datetime(2026, 5, 29, 3, 48, 15), datetime.datetime(2026, 5, 29, 3, 48, 14), 'salt', 6.42, 88.88, None, 12.18, 112.88, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:48:38.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:48:38.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:48:38.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:14, diff=24.554144s, valid=True
2026-05-29T03:48:38.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:48:38.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:48:38.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:12, diff=26.557507s, valid=True
2026-05-29T03:48:38.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:48:38.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:14, diff=24.565361s, valid=True
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:48:38.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:48:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:12, diff=26.569018s, valid=True
2026-05-29T03:48:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:48:38.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:48:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:48:38.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951960.569838s, valid=True
2026-05-29T03:48:38.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:48:38.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:48:38.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:48:38.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:48:38.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:48:38.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:48:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:48:38.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:48:38.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:48:38.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:48:38.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:48:38.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:48:38.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:48:38.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:48:39.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:48:39.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:48:39.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:48:39.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:48:39.612 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:48:39.612 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:48:39.810 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:48:39.810 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:49:09.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:49:09.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:49:09.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:49:10.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:49:10.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:49:10.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:49:10.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:49:10.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:49:10.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-29T03:49:10.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:49:10.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:49:10.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:49:10.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-29T03:49:12.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-29T03:49:12.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:49:12.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:49:12.798 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:49:12.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:49:12.809 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:49:12.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:49:12.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:49:12.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:49:12.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:49:12.827 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:49:12.827 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:49:12.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:49:12.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:49:12.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:49:13.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:49:13.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:49:13.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:49:13.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:49:13.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:49:13.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:49:13.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:49:13.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:49:13.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:49:13.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:48:45
2026-05-29T03:49:13.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70807, datetime.datetime(2026, 5, 29, 3, 48, 45), datetime.datetime(2026, 5, 29, 3, 48, 45), 'salt', 6.42, 88.88, None, 12.1, 113.02, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:49:13.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:49:13.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:49:13.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:45, diff=28.214716s, valid=True
2026-05-29T03:49:13.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:49:13.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:49:13.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:49:12, diff=1.2183s, valid=True
2026-05-29T03:49:13.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:49:13.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:49:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:48:37, diff=36.226669s, valid=True
2026-05-29T03:49:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:49:13.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:49:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:49:13.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:49:13.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:49:13.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:49:13.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:49:12, diff=1.230451s, valid=True
2026-05-29T03:49:13.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:49:13.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:49:13.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:49:13.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=951995.231287s, valid=True
2026-05-29T03:49:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:49:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:49:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:49:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:49:13.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:49:13.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:49:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:49:13.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:49:13.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:49:13.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:49:13.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:49:13.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:49:13.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:49:13.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:49:13.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:49:14.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:49:14.192 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:49:14.192 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:49: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-29T03:49: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-29T03:49:14.457 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:49:14.457 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:49:44.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:49:44.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:49:44.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:49:44.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:49:44.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:49:45.185 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:49:45.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-29T03:49:45.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:49:45.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-29T03:49:45.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:49:45.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:49:45.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:49:45.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-29T03:49:47.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:49:47.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:49:47.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:49:47.673 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:49:47.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:49:47.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:49:47.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:49:47.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:49:47.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:49:47.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:49:47.699 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:49:47.699 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:49:47.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:49:47.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:49:47.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:49:47.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:49:47.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:49:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:49:47.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:49:48.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:49:48.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:49:48.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:49:48.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:49:48.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:49:48.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:49:46
2026-05-29T03:49:48.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70809, datetime.datetime(2026, 5, 29, 3, 49, 46), datetime.datetime(2026, 5, 29, 3, 49, 45), 'salt', 6.42, 88.78, None, 13.27, 114.43, 1.71, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:49:48.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:49:48.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:49:48.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:49:45, diff=3.095401s, valid=True
2026-05-29T03:49:48.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:49:48.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:49:48.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:12, diff=-23.901048s, valid=True
2026-05-29T03:49:48.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:49:48.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:49:48.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:49:37, diff=11.106874s, valid=True
2026-05-29T03:49:48.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:49:48.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:49:48.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:49:48.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:49:48.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:49:48.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:49:48.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:12, diff=-23.889488s, valid=True
2026-05-29T03:49:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:49:48.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:49:48.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:49:48.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952030.111313s, valid=True
2026-05-29T03:49:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:49:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:49:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:49:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:49:48.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:49:48.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:49:48.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:49:48.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:49:48.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:49:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:49:48.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:49:48.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:49:48.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:49:48.503 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:49:48.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:49:49.062 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:49:49.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:49:49.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:49:49.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-29T03:49:49.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-29T03:49:49.343 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:49:49.344 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:50:19.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:50:19.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:50:19.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:50:19.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:50:19.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:50:19.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:50:19.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:50:19.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:50:19.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-29T03:50:19.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:50:19.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:50:19.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:50:19.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-29T03:50:22.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-29T03:50:22.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:50:22.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:50:22.124 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:50:22.124 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:50:22.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:50:22.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:50:22.149 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:50:22.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:50:22.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:50:22.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:50:22.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:50:22.158 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:50:22.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:50:22.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:50:22.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:50:22.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:50:22.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:50:22.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:50:22.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:50:22.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:50:22.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:50:22.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:50:22.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:50:22.537 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:50:16
2026-05-29T03:50:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70810, datetime.datetime(2026, 5, 29, 3, 50, 16), datetime.datetime(2026, 5, 29, 3, 50, 15), 'salt', 6.42, 88.82, None, 11.96, 119.17, 1.7, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:50:22.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:50:22.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:50:22.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:15, diff=7.54512s, valid=True
2026-05-29T03:50:22.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:50:22.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:50:22.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:12, diff=10.548568s, valid=True
2026-05-29T03:50:22.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:50:22.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:50:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:09, diff=13.556572s, valid=True
2026-05-29T03:50:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:50:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:50:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:50:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:50:22.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:50:22.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:50:22.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:12, diff=10.560341s, valid=True
2026-05-29T03:50:22.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:50:22.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:50:22.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:50:22.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952064.561139s, valid=True
2026-05-29T03:50:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:50:22.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:50:22.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:50:22.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:50:22.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:50:22.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:50:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:50:22.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:50:22.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:50:22.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:50:22.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:50:22.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:50:22.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:50:22.886 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:50:23.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:50:23.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:50:23.547 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:50:23.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:50:23.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-29T03:50:23.548 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:50:23.734 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:50:23.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:50:53.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:50:53.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:50:53.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:50:54.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:50:54.148 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:50:54.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:50: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-29T03:50:54.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:50:54.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-29T03:50:54.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:50:54.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:50:54.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:50:54.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:50:57.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-29T03:50:57.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:50:57.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:50:57.463 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:50:57.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:50:57.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:50:57.488 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:50:57.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:50:57.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:50:57.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:50:57.490 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:50:57.490 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:50:57.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:50:57.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:50:57.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:50:57.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:50:57.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:50:57.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:50:57.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:50:57.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:50:57.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:50:57.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:50:57.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:50:57.822 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:50:57.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:50:46
2026-05-29T03:50:57.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70811, datetime.datetime(2026, 5, 29, 3, 50, 46), datetime.datetime(2026, 5, 29, 3, 50, 46), 'salt', 6.32, 88.75, None, 11.43, 115.53, 1.71, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:50:57.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:50:57.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:50:57.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:46, diff=11.91957s, valid=True
2026-05-29T03:50:57.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:50:57.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:50:57.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:12, diff=-14.077011s, valid=True
2026-05-29T03:50:57.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:50:57.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:50:40, diff=17.93106s, valid=True
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:50:57.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:50:57.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:12, diff=-14.065305s, valid=True
2026-05-29T03:50:57.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:50:57.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:50:57.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:50:57.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952099.93548s, valid=True
2026-05-29T03:50:57.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:50:57.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:50:57.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:50:57.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:50:57.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:50:58.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:50:58.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:50:58.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:50:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:50:58.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:50:58.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:50:58.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:50:58.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:50:58.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:50:58.534 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:50:58.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:50:58.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:50:58.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:50:58.973 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:50:58.973 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:50:59.159 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:50:59.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:51:29.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:51:29.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:51:29.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:51:29.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:51:29.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:51:29.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:51:29.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-29T03:51:29.909 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:51:29.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-29T03:51:29.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:51:29.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:51:29.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:51:29.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-29T03:51: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-29T03:51:32.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:51:32.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:51:32.228 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:51:32.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:51:32.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:51:32.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:51:32.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:51:32.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:51:32.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:51:32.250 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:51:32.250 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:51:32.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:51:32.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:51:32.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:51:32.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:51:32.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:51:32.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:51:32.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:51:32.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:51:32.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:51:32.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:51:32.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:51:32.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:51:32.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:51:17
2026-05-29T03:51:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70812, datetime.datetime(2026, 5, 29, 3, 51, 17), datetime.datetime(2026, 5, 29, 3, 51, 16), 'salt', 6.39, 88.78, None, 12.77, 116.05, 1.71, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:51:32.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:51:32.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:51:32.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:16, diff=16.638833s, valid=True
2026-05-29T03:51:32.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:51:32.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:51:32.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:12, diff=20.642275s, valid=True
2026-05-29T03:51:32.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:51:32.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:12, diff=20.650203s, valid=True
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:51:32.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:51:32.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:12, diff=20.653859s, valid=True
2026-05-29T03:51:32.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:51:32.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:51:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:51:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952134.654654s, valid=True
2026-05-29T03:51:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:51:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:51:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:51:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:51:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:51:32.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:51:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:51:32.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:51:32.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:51:32.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:51:32.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:51:32.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:51:32.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:51:32.978 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:51:33.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:51:33.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:51:33.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:51:33.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:51:33.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-29T03:51:33.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-29T03:51:33.779 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:51:33.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:52:03.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:52:03.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:52: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-29T03:52:04.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:52:04.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:52:04.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:52:04.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-29T03:52:04.387 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:52:04.387 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:52:04.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:52:04.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:52:04.403 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:52:04.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:52:07.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-29T03:52:07.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:52:07.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:52:07.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:52:07.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:52:07.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:52:07.170 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:52:07.171 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:52:07.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:52:07.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:52:07.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:52:07.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:52:07.179 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:52:07.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:52:07.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:52:07.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:52:07.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:52:07.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:52:07.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:52:07.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:52:07.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:52:07.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:52:07.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:52:07.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:52:07.549 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:51:47
2026-05-29T03:52:07.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70813, datetime.datetime(2026, 5, 29, 3, 51, 47), datetime.datetime(2026, 5, 29, 3, 51, 47), 'salt', 6.26, 88.82, None, 13.3, 117.53, 1.71, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:52:07.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:52:07.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:52:07.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:47, diff=20.556652s, valid=True
2026-05-29T03:52:07.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:52:07.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:52:07.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:12, diff=-4.439928s, valid=True
2026-05-29T03:52:07.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:52:07.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:52:07.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:51:44, diff=23.567846s, valid=True
2026-05-29T03:52:07.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:52:07.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:52:07.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:52:07.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:52:07.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:52:07.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:52:07.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:12, diff=-4.428609s, valid=True
2026-05-29T03:52:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:52:07.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:52:07.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:52:07.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952169.572173s, valid=True
2026-05-29T03:52:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:52:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:52:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:52:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:52:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:52:07.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:52:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:52:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:52:07.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:52:07.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:52:07.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:52:07.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:52:07.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:52:07.892 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:52:08.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:52:08.442 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:52:08.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:52:08.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:52:08.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-29T03:52:08.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-29T03:52:08.801 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:52:08.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:52:38.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:52:38.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:52:38.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:52:39.291 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:52:39.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:52:39.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:52: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-29T03:52:39.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:52:39.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-29T03:52:39.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:52:39.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:52:39.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:52:39.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-29T03:52:41.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-29T03:52:41.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:52:41.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:52:41.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:52:41.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:52:41.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:52:41.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:52:41.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:52:41.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:52:41.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:52:41.858 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:52:41.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:52:41.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:52:41.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:52:41.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:52:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:52:42.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:52:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:52:42.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:52:42.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:52:42.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:52:42.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:52:42.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:52:42.191 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:52:42.254 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:52:17
2026-05-29T03:52:42.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70814, datetime.datetime(2026, 5, 29, 3, 52, 17), datetime.datetime(2026, 5, 29, 3, 52, 17), 'salt', 6.39, 88.88, None, 13.09, 117.03, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:52:42.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:52:42.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:52:42.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:17, diff=25.262453s, valid=True
2026-05-29T03:52:42.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:52:42.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:12, diff=30.266027s, valid=True
2026-05-29T03:52:42.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:52:42.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:15, diff=27.274188s, valid=True
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:52:42.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:52:42.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:12, diff=30.277979s, valid=True
2026-05-29T03:52:42.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:52:42.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:52:42.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:52:42.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952204.27881s, valid=True
2026-05-29T03:52:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:52:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:52:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:52:42.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:52:42.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:52:42.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:52:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:52:42.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:52:42.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:52:42.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:52:42.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:52:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:52:42.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:52:42.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:52:42.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:52:43.156 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:52:43.275 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:52:43.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:52:43.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-29T03:52:43.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-29T03:52:43.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:52:43.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:53:13.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:53:13.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:53:13.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:53:13.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:53:13.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:53:13.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:53:13.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T03:53:13.921 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:53:13.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-29T03:53:13.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:53:13.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:53:13.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:53:13.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T03:53:16.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-29T03:53:16.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:53:16.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:53:16.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:53:16.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:53:16.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:53:16.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:53:16.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:53:16.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:53:16.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:53:16.393 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:53:16.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:53:16.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:53:16.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:53:16.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:53:16.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:53:16.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:53:16.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:53:16.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:53:16.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:53:16.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:53:16.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:53:16.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:53:16.712 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:53:16.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:52:48
2026-05-29T03:53:16.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70815, datetime.datetime(2026, 5, 29, 3, 52, 48), datetime.datetime(2026, 5, 29, 3, 52, 48), 'salt', 6.36, 88.92, None, 12.32, 117.55, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:53:16.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:53:16.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:53:16.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:48, diff=28.780655s, valid=True
2026-05-29T03:53:16.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:53:16.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:53:16.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:53:12, diff=4.784132s, valid=True
2026-05-29T03:53:16.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:53:16.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:53:16.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:52:46, diff=30.791959s, valid=True
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:53:16.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:53:16.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:53:12, diff=4.795555s, valid=True
2026-05-29T03:53:16.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:53:16.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:53:16.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:53:16.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952238.796348s, valid=True
2026-05-29T03:53:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:53:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:53:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:53:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:53:16.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:53:16.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:53:16.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:53:16.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:53:16.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:53:16.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:53:16.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:53:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:53:17.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:53:17.117 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:53:17.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:53:17.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:53:17.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:53:17.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:53:17.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-29T03:53:17.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-29T03:53:17.959 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:53:17.959 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:53:47.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:53:47.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:53:47.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:53:48.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:53:48.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:53:48.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:53:48.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-29T03:53:48.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:53:48.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-29T03:53:48.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:53:48.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:53:48.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:53:48.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-29T03:53:51.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-29T03:53:51.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:53:51.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:53:51.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:53:51.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:53:51.180 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:53:51.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:53:51.193 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:53:51.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:53:51.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:53:51.194 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:53:51.194 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:53:51.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:53:51.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:53:51.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:53:51.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:53:51.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:53:51.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:53:51.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:53:51.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:53:51.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:53:51.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:53:51.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:53:51.522 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:53:51.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:53:49
2026-05-29T03:53:51.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70817, datetime.datetime(2026, 5, 29, 3, 53, 49), datetime.datetime(2026, 5, 29, 3, 53, 48), 'salt', 6.39, 89.02, None, 11.61, 117.72, 1.67, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:53:51.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:53:51.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:53:51.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:53:48, diff=3.595079s, valid=True
2026-05-29T03:53:51.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:53:51.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:53:51.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:12, diff=-20.401327s, valid=True
2026-05-29T03:53:51.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:53:51.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:53:51.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:53:39, diff=12.606921s, valid=True
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:53:51.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:53:51.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:12, diff=-20.389329s, valid=True
2026-05-29T03:53:51.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:53:51.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:53:51.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:53:51.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952273.61148s, valid=True
2026-05-29T03:53:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:53:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:53:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:53:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:53:51.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:53:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:53:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:53:51.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:53:51.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:53:51.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:53:51.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:53:51.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:53:51.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:53:51.934 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:53:52.201 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:53:52.547 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:53:52.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:53:52.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:53:52.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-29T03:53:52.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-29T03:53:53.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:53:53.049 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:54:23.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:54:23.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:54: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-29T03:54:23.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:54:23.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:54:23.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:54:23.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-29T03:54:23.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:54:23.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-29T03:54:23.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:54:23.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:54:23.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:54:23.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-29T03:54:26.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-29T03:54:26.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:54:26.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:54:26.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:54:26.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:54:26.277 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:54:26.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:54:26.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:54:26.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:54:26.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:54:26.291 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:54:26.291 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:54:26.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:54:26.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:54:26.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:54:26.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:54:26.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:54:26.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:54:26.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:54:26.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:54:26.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:54:26.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:54:26.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:54:26.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:54:26.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:54:19
2026-05-29T03:54:26.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70818, datetime.datetime(2026, 5, 29, 3, 54, 19), datetime.datetime(2026, 5, 29, 3, 54, 18), 'salt', 6.32, 88.88, None, 12.49, 117.43, 1.69, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:54:26.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:54:26.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:54:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:18, diff=8.704159s, valid=True
2026-05-29T03:54:26.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:54:26.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:54:26.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:12, diff=14.707502s, valid=True
2026-05-29T03:54:26.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:54:26.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:10, diff=16.715415s, valid=True
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:54:26.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:54:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:12, diff=14.719025s, valid=True
2026-05-29T03:54:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:54:26.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:54:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:54:26.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952308.719816s, valid=True
2026-05-29T03:54:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:54:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:54:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:54:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:54:26.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:54:26.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:54:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:54:26.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:54:26.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:54:26.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:54:26.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:54:26.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:54:27.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:54:27.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:54:27.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:54:27.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:54:27.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:54:27.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:54:27.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-29T03:54:27.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-29T03:54:27.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:54:27.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:54:57.895 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:54:57.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:54:57.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:54:58.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:54:58.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:54:58.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:54:58.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-29T03:54:58.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:54:58.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:54:58.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:54:58.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:54:58.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:54:58.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-29T03:55:00.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-29T03:55:00.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:55:00.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:55:00.999 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:55:00.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:55:01.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:55:01.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:55:01.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:55:01.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:55:01.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:55:01.024 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:55:01.024 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:55:01.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:55:01.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:55:01.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:55:01.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:55:01.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:55:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:55:01.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:55:01.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:55:01.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:55:01.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:55:01.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:55:01.370 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:55:01.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:54:49
2026-05-29T03:55:01.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70819, datetime.datetime(2026, 5, 29, 3, 54, 49), datetime.datetime(2026, 5, 29, 3, 54, 49), 'salt', 6.39, 88.91, None, 13.48, 115.86, 1.69, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:55:01.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:55:01.434 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:55:01.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:49, diff=12.441273s, valid=True
2026-05-29T03:55:01.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:55:01.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:55:01.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:12, diff=-10.555191s, valid=True
2026-05-29T03:55:01.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:55:01.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:55:01.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:54:42, diff=19.452959s, valid=True
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:55:01.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:55:01.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:12, diff=-10.543305s, valid=True
2026-05-29T03:55:01.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:55:01.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:55:01.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:55:01.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952343.457502s, valid=True
2026-05-29T03:55:01.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:55:01.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:55:01.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:55:01.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:55:01.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:55:01.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:55:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:55:01.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:55:01.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:55:01.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:55:01.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:55:01.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:55:01.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:55:01.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:55:02.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:55:02.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:55:02.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:55:02.558 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:55: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-29T03:55: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-29T03:55:02.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:55:02.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:55:32.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:55:32.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:55:32.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:55:33.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:55:33.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:55:33.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:55:33.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-29T03:55:33.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:55:33.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-29T03:55:33.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:55:33.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:55:33.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:55:33.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-29T03:55:35.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-29T03:55:35.947 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:55:35.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:55:35.956 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:55:35.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:55:35.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:55:35.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:55:35.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:55:35.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:55:35.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:55:35.986 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:55:35.986 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:55:35.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:55:36.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:55:36.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:55:36.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:55:36.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:55:36.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:55:36.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:55:36.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:55:36.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:55:36.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:55:36.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:55:36.309 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:55:36.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:55:19
2026-05-29T03:55:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70820, datetime.datetime(2026, 5, 29, 3, 55, 19), datetime.datetime(2026, 5, 29, 3, 55, 19), 'salt', 6.36, 88.98, None, 12.81, 115.74, 1.68, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:55:36.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:55:36.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:55:36.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:19, diff=17.381018s, valid=True
2026-05-29T03:55:36.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:55:36.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:55:36.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:12, diff=24.384452s, valid=True
2026-05-29T03:55:36.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:55:36.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:13, diff=23.392448s, valid=True
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:55:36.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:55:36.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:12, diff=24.396092s, valid=True
2026-05-29T03:55:36.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:55:36.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:55:36.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:55:36.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952378.396891s, valid=True
2026-05-29T03:55:36.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:55:36.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:55:36.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:55:36.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:55:36.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:55:36.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:55:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:55:36.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:55:36.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:55:36.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:55:36.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:55:36.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:55:36.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:55:36.721 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:55:36.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:55:37.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:55:37.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:55:37.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:55:37.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-29T03:55:37.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-29T03:55:37.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:55:37.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:56:07.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:56:07.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:56:07.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:56:07.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:56:07.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:56:08.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:56:08.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-29T03:56:08.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:56:08.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-29T03:56:08.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:56:08.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:56:08.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:56:08.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-29T03:56:10.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-29T03:56:10.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:56:10.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:56:10.489 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:56:10.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:56:10.501 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:56:10.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:56:10.514 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:56:10.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:56:10.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:56:10.515 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:56:10.515 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:56:10.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:56:10.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:56:10.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:56:10.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:56:10.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:56:10.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:56:10.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:56:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:56:10.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:56:10.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:56:10.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:56:10.829 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:56:10.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:55:50
2026-05-29T03:56:10.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70821, datetime.datetime(2026, 5, 29, 3, 55, 50), datetime.datetime(2026, 5, 29, 3, 55, 49), 'salt', 6.32, 88.98, None, 12.25, 116.75, 1.67, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:56:10.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:56:10.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:56:10.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:49, diff=21.919798s, valid=True
2026-05-29T03:56:10.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:56:10.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:56:10.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:12, diff=-1.076757s, valid=True
2026-05-29T03:56:10.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:56:10.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:55:45, diff=25.931238s, valid=True
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:56:10.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:56:10.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:12, diff=-1.06515s, valid=True
2026-05-29T03:56:10.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:56:10.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:56:10.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:56:10.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952412.935652s, valid=True
2026-05-29T03:56:10.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:56:10.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:56:10.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:56:10.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:56:10.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:56:11.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:56:11.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:56:11.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:56:11.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:56:11.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:56:11.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:56:11.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:56:11.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:56:11.335 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:56:11.544 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:56:11.887 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:56:11.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:56:11.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:56:11.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-29T03:56:11.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-29T03:56:12.249 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:56:12.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:56:42.258 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:56:42.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:56:42.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:56:42.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:56:42.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:56:42.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:56:42.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-29T03:56:42.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:56:42.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T03:56:42.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:56:42.828 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:56:42.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:56:42.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-29T03:56:45.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T03:56:45.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:56:45.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:56:45.258 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:56:45.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:56:45.266 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:56:45.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:56:45.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:56:45.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:56:45.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:56:45.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:56:45.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:56:45.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:56:45.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:56:45.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:56:45.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:56:45.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:56:45.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:56:45.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:56:45.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:56:45.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:56:45.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:56:45.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:56:45.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:56:45.686 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:56:20
2026-05-29T03:56:45.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70822, datetime.datetime(2026, 5, 29, 3, 56, 20), datetime.datetime(2026, 5, 29, 3, 56, 19), 'salt', 6.39, 89.01, None, 12.67, 117.27, 1.67, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:56:45.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:56:45.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:56:45.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:19, diff=26.694279s, valid=True
2026-05-29T03:56:45.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:56:45.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:56:45.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:12, diff=33.697895s, valid=True
2026-05-29T03:56:45.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:56:45.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:16, diff=29.706088s, valid=True
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:56:45.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:56:45.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:12, diff=33.710016s, valid=True
2026-05-29T03:56:45.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:56:45.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:56:45.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:56:45.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952447.71086s, valid=True
2026-05-29T03:56:45.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:56:45.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:56:45.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:56:45.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:56:45.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:56:45.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:56:45.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:56:45.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:56:45.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:56:45.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:56:45.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:56:45.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:56:45.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:56:46.034 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:56:46.243 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:56:46.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:56:46.684 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:56:46.684 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:56:46.684 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T03:56:46.684 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T03:56:46.843 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:56:46.843 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:57:16.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:57:16.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:57:16.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:57:17.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:57:17.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:57:17.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:57:17.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-29T03:57:17.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:57:17.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-29T03:57:17.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:57:17.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:57:17.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:57:17.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-29T03:57:19.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-29T03:57:19.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:57:19.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:57:19.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:57:19.644 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:57:19.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:57:19.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:57:19.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:57:19.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:57:19.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:57:19.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:57:19.670 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:57:19.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:57:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T03:57:19.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:57:19.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T03:57:19.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:57:19.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:57:19.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:57:19.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:57:19.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:57:19.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:57:19.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:57:19.987 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:57:20.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:56:50
2026-05-29T03:57:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70823, datetime.datetime(2026, 5, 29, 3, 56, 50), datetime.datetime(2026, 5, 29, 3, 56, 50), 'salt', 6.42, 89.01, None, 13.3, 116.26, 1.67, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:57:20.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:57:20.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T03:57:20.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:50, diff=30.061924s, valid=True
2026-05-29T03:57:20.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:57:20.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:57:20.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:57:12, diff=8.065211s, valid=True
2026-05-29T03:57:20.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:57:20.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T03:57:20.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:56:47, diff=33.072642s, valid=True
2026-05-29T03:57:20.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:57:20.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:57:20.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:57:20.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:57:20.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:57:20.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:57:20.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:57:12, diff=8.076432s, valid=True
2026-05-29T03:57:20.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:57:20.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:57:20.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:57:20.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952482.077174s, valid=True
2026-05-29T03:57:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:57:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:57:20.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:57:20.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:57:20.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:57:20.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:57:20.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:57:20.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:57:20.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:57:20.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:57:20.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:57:20.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:57:20.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:57:20.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:57:20.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:57:21.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:57:21.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:57:21.138 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:57:21.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-29T03:57:21.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-29T03:57:21.328 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:57:21.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:57:51.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:57:51.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:57: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-29T03:57:51.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:57:51.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:57:51.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:57: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-29T03:57:51.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:57:51.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-29T03:57:51.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:57:51.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:57:51.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:57:51.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-29T03:57:54.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-29T03:57:54.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:57:54.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:57:54.602 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:57:54.602 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:57:54.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:57:54.625 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:57:54.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:57:54.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:57:54.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:57:54.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:57:54.627 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:57:54.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:57:54.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:57:54.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:57:54.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:57:54.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:57:54.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:57:54.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:57:54.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:57:54.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:57:54.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:57:54.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:57:54.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:57:55.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:57:51
2026-05-29T03:57:55.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70825, datetime.datetime(2026, 5, 29, 3, 57, 51), datetime.datetime(2026, 5, 29, 3, 57, 50), 'salt', 6.42, 88.91, None, 12.6, 120.58, 1.69, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:57:55.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:57:55.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:57:55.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:57:50, diff=5.020592s, valid=True
2026-05-29T03:57:55.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:57:55.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:57:55.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:12, diff=-16.976478s, valid=True
2026-05-29T03:57:55.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:57:55.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:57:50, diff=5.030287s, valid=True
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:57:55.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:57:55.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:12, diff=-16.966658s, valid=True
2026-05-29T03:57:55.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:57:55.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:57:55.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:57:55.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952517.03401s, valid=True
2026-05-29T03:57:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:57:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:57:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:57:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:57:55.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:57:55.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:57:55.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:57:55.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:57:55.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:57:55.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:57:55.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:57:55.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:57:55.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:57:55.484 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:57:55.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:57:56.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:57:56.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:57:56.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:57:56.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-29T03:57:56.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-29T03:57:56.325 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:57:56.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:58:26.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:58:26.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:58:26.342 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:58:26.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:58:26.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:58:27.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:58:27.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-29T03:58:27.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:58:27.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-29T03:58:27.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:58:27.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:58:27.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:58:27.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-29T03:58:29.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-29T03:58:29.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:58:29.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:58:29.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:58:29.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:58:29.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:58:29.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:58:29.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:58:29.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:58:29.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:58:29.678 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:58:29.678 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:58:29.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:58:29.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:58:29.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:58:29.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:58:29.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:58:29.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:58:29.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:58:30.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:58:30.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:58:30.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:58:30.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:58:30.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:58:30.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:58:21
2026-05-29T03:58:30.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70826, datetime.datetime(2026, 5, 29, 3, 58, 21), datetime.datetime(2026, 5, 29, 3, 58, 20), 'salt', 6.42, 88.85, None, 12.95, 117.83, 1.7, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:58:30.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:58:30.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:58:30.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:20, diff=10.072303s, valid=True
2026-05-29T03:58:30.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:58:30.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:58:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:12, diff=18.075718s, valid=True
2026-05-29T03:58:30.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:58:30.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:58:30.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:11, diff=19.08643s, valid=True
2026-05-29T03:58:30.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:58:30.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:58:30.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:58:30.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:58:30.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:58:30.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:58:30.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:12, diff=18.094255s, valid=True
2026-05-29T03:58:30.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:58:30.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:58:30.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:58:30.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952552.095774s, valid=True
2026-05-29T03:58:30.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:58:30.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:58:30.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:58:30.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:58:30.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:58:30.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:58:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:58:30.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:58:30.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:58:30.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:58:30.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:58:30.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:58:30.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:58:30.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:58:30.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:58:31.032 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:58:31.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:58:31.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:58:31.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-29T03:58:31.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-29T03:58:31.324 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:58:31.324 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:59:01.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:59:01.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:59:01.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:59:01.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:59:01.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:59:01.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:59:01.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-29T03:59:01.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:59:01.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-29T03:59:01.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:59:01.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:59:01.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:59:01.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-29T03:59:04.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-29T03:59:04.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:59:04.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:59:04.329 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:59:04.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:59:04.340 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:59:04.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:59:04.354 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:59:04.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:59:04.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:59:04.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:59:04.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:59:04.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:59:04.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:59:04.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:59:04.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:59:04.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:59:04.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:59:04.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:59:04.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:59:04.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:59:04.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:59:04.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:59:04.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:59:04.742 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:58:51
2026-05-29T03:59:04.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70827, datetime.datetime(2026, 5, 29, 3, 58, 51), datetime.datetime(2026, 5, 29, 3, 58, 51), 'salt', 6.49, 88.85, None, 11.22, 118.35, 1.7, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:59:04.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:59:04.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:59:04.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:51, diff=13.750257s, valid=True
2026-05-29T03:59:04.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:59:04.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:59:04.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:12, diff=-7.246276s, valid=True
2026-05-29T03:59:04.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:59:04.753 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:59:04.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:58:43, diff=21.761607s, valid=True
2026-05-29T03:59:04.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:59:04.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:59:04.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:59:04.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:59:04.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:59:04.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:59:04.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:12, diff=-7.234735s, valid=True
2026-05-29T03:59:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:59:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:59:04.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:59:04.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952586.766064s, valid=True
2026-05-29T03:59:04.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:59:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:59:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:59:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:59:04.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:59:04.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:59:04.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:59:04.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:59:04.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:59:04.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:59:04.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:59:04.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:59:05.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:59:05.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:59:05.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:59:05.692 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:59:05.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:59:05.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:59:05.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-29T03:59:05.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-29T03:59:06.049 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:59:06.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T03:59:36.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T03:59:36.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T03:59:36.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T03:59:36.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T03:59:36.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T03:59:36.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T03:59:36.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-29T03:59:36.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T03:59:36.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-29T03:59:36.806 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T03:59:36.806 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T03:59:36.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T03:59:36.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-29T03:59:39.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-29T03:59:39.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T03:59:39.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T03:59:39.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T03:59:39.140 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T03:59:39.152 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T03:59:39.164 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T03:59:39.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T03:59:39.166 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T03:59:39.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T03:59:39.166 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T03:59:39.166 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T03:59:39.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T03:59:39.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T03:59:39.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T03:59:39.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T03:59:39.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:59:39.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:59:39.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T03:59:39.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T03:59:39.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T03:59:39.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T03:59:39.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T03:59:39.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T03:59:39.546 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:59:21
2026-05-29T03:59:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70828, datetime.datetime(2026, 5, 29, 3, 59, 21), datetime.datetime(2026, 5, 29, 3, 59, 21), 'salt', 6.42, 88.72, None, 11.58, 124.43, 1.72, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T03:59:39.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T03:59:39.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T03:59:39.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:21, diff=18.553873s, valid=True
2026-05-29T03:59:39.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T03:59:39.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:59:39.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:12, diff=27.557284s, valid=True
2026-05-29T03:59:39.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T03:59:39.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:15, diff=24.565067s, valid=True
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T03:59:39.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T03:59:39.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:12, diff=27.568699s, valid=True
2026-05-29T03:59:39.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T03:59:39.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T03:59:39.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T03:59:39.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952621.56949s, valid=True
2026-05-29T03:59:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T03:59:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T03:59:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T03:59:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T03:59:39.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T03:59:39.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T03:59:39.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T03:59:39.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T03:59:39.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T03:59:39.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T03:59:39.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T03:59:39.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T03:59:39.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T03:59:39.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T03:59:40.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:59:40.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T03:59:40.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T03:59:40.565 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T03:59:40.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-29T03:59:40.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-29T03:59:40.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T03:59:40.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:00:10.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:00:10.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:00: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-29T04:00:10.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:00:10.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:00:11.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:00:11.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-29T04:00:11.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:00:11.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-29T04:00:11.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:00:11.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:00:11.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:00:11.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-29T04:00:13.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-29T04:00:13.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:00:13.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:00:13.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:00:13.727 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:00:13.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:00:13.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:00:13.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:00:13.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:00:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:00:13.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:00:13.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:00:13.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:00:13.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:00:13.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:00:13.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:00:13.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:00:14.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:00:14.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:00:14.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:00:14.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:00:14.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:00:14.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:00:14.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:00:14.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 03:59:52
2026-05-29T04:00:14.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70829, datetime.datetime(2026, 5, 29, 3, 59, 52), datetime.datetime(2026, 5, 29, 3, 59, 51), 'salt', 6.39, 88.68, None, 13.23, 119.83, 1.73, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:00:14.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:00:14.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:00:14.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:51, diff=23.140459s, valid=True
2026-05-29T04:00:14.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:00:14.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:00:14.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:12, diff=2.143934s, valid=True
2026-05-29T04:00:14.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:00:14.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:00:14.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 03:59:46, diff=28.151848s, valid=True
2026-05-29T04:00:14.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:00:14.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:00:14.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:00:14.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:00:14.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:00:14.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:00:14.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:12, diff=2.155437s, valid=True
2026-05-29T04:00:14.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:00:14.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:00:14.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:00:14.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952656.156236s, valid=True
2026-05-29T04:00:14.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:00:14.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:00:14.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:00:14.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:00:14.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:00:14.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:00:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:00:14.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:00:14.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:00:14.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:00:14.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:00:14.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:00:14.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:00:14.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:00:14.758 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:00:15.098 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:00:15.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:00:15.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:00:15.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:00:15.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:00:15.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:00:15.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:00:45.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:00:45.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:00:45.416 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:00:45.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:00:45.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:00:45.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:00:45.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-29T04:00:45.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:00:45.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-29T04:00:45.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:00:45.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:00:45.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:00:45.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-29T04:00:48.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-29T04:00:48.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:00:48.916 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:00:48.917 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:00:48.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:00:48.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:00:48.940 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:00:48.940 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:00:48.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:00:48.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:00:48.941 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:00:48.942 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:00:48.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:00:49.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:00:49.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:00:49.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:00:49.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:00:49.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:00:49.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:00:49.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:00:49.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:00:49.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:00:49.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:00:49.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:00:49.287 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:00:22
2026-05-29T04:00:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70830, datetime.datetime(2026, 5, 29, 4, 0, 22), datetime.datetime(2026, 5, 29, 4, 0, 22), 'salt', 6.36, 88.62, None, 12.03, 118.77, 1.74, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:00:49.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:00:49.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:00:49.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:22, diff=27.293452s, valid=True
2026-05-29T04:00:49.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:00:49.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:00:49.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:12, diff=37.296315s, valid=True
2026-05-29T04:00:49.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:00:49.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:00:49.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:18, diff=31.30293s, valid=True
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:00:49.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:00:49.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:00:12, diff=37.305952s, valid=True
2026-05-29T04:00:49.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:00:49.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:00:49.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:00:49.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952691.306595s, valid=True
2026-05-29T04:00:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:00:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:00:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:00:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:00:49.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:00:49.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:00:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:00:49.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:00:49.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:00:49.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:00:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:00:49.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:00:49.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:00:49.624 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:00:49.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:00:50.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:00:50.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:00:50.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:00:50.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-29T04:00:50.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-29T04:00:50.586 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:00:50.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:01:20.606 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:01:20.607 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:01:20.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:01:20.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:01:20.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:01:21.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:01:21.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-29T04:01:21.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:01:21.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-29T04:01:21.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:01:21.193 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:01:21.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:01:21.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-29T04:01: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-29T04:01:23.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:01:23.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:01:23.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:01:23.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:01:23.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:01:23.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:01:23.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:01:23.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:01:23.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:01:23.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:01:23.782 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:01:23.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:01:23.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:01:23.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:01:24.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:01:24.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:01:24.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:01:24.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:01:24.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:01:24.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:01:24.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:01:24.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:01:24.104 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:01:24.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:01:22
2026-05-29T04:01:24.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70832, datetime.datetime(2026, 5, 29, 4, 1, 22), datetime.datetime(2026, 5, 29, 4, 1, 21), 'salt', 6.52, 88.68, None, 11.89, 120.02, 1.73, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:01:24.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:01:24.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:01:24.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:21, diff=3.171258s, valid=True
2026-05-29T04:01:24.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:01:24.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:01:24.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:12, diff=12.174714s, valid=True
2026-05-29T04:01:24.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:01:24.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:01:24.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:21, diff=3.182555s, valid=True
2026-05-29T04:01:24.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:01:24.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:01:24.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:01:24.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:01:24.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:01:24.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:01:24.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:12, diff=12.186212s, valid=True
2026-05-29T04:01:24.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:01:24.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:01:24.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:01:24.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952726.187032s, valid=True
2026-05-29T04:01:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:01:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:01:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:01:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:01:24.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:01:24.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:01:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:01:24.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:01:24.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:01:24.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:01:24.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:01:24.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:01:24.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:01:24.578 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:01:24.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:01:25.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:01:25.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:01:25.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:01:25.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-29T04:01:25.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-29T04:01:25.417 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:01:25.417 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:01:55.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:01:55.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:01:55.423 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:01:55.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:01:55.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:01:55.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:01:55.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-29T04:01:55.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:01:55.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-29T04:01:55.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:01:55.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:01:55.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:01:55.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-29T04:01:58.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-29T04:01:58.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:01:58.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:01:58.356 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:01:58.356 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:01:58.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:01:58.380 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:01:58.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:01:58.381 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:01:58.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:01:58.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:01:58.382 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:01:58.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:01:58.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:01:58.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:01:58.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:01:58.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:01:58.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:01:58.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:01:58.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:01:58.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:01:58.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:01:58.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:01:58.701 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:01:58.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:01:53
2026-05-29T04:01:58.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70833, datetime.datetime(2026, 5, 29, 4, 1, 53), datetime.datetime(2026, 5, 29, 4, 1, 52), 'salt', 6.52, 88.58, None, 13.06, 120.65, 1.74, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:01:58.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:01:58.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:01:58.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:52, diff=6.770142s, valid=True
2026-05-29T04:01:58.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:01:58.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:01:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:12, diff=-13.22645s, valid=True
2026-05-29T04:01:58.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:01:58.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:01:52, diff=6.781474s, valid=True
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:01:58.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:01:58.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:01:58.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:12, diff=-13.214885s, valid=True
2026-05-29T04:01:58.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:01:58.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:01:58.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:01:58.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952760.785921s, valid=True
2026-05-29T04:01:58.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:01:58.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:01:58.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:01:58.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:01:58.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:01:58.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:01:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:01:58.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:01:58.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:01:58.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:01:58.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:01:59.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:01:59.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:01:59.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:01:59.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:01:59.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:01:59.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:01:59.758 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:01:59.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-29T04:01:59.758 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:01:59.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:01:59.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:02:29.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:02:29.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:02:29.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:02:30.093 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:02:30.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:02:30.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:02:30.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-29T04:02:30.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:02:30.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-29T04:02:30.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:02:30.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:02:30.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:02:30.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-29T04:02:32.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:02:32.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:02:32.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:02:32.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:02:32.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:02:32.762 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:02:32.773 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:02:32.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:02:32.774 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:02:32.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:02:32.775 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:02:32.775 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:02:32.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:02:32.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:02:32.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:02:33.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:02:33.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:02:33.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:02:33.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:02:33.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:02:33.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:02:33.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:02:33.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:02:33.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:02:33.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:02:23
2026-05-29T04:02:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70834, datetime.datetime(2026, 5, 29, 4, 2, 23), datetime.datetime(2026, 5, 29, 4, 2, 23), 'salt', 6.52, 88.55, None, 11.61, 116.28, 1.75, 831.97, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:02:33.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:02:33.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:02:33.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:23, diff=10.15991s, valid=True
2026-05-29T04:02:33.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:02:33.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:02:33.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:12, diff=21.163403s, valid=True
2026-05-29T04:02:33.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:02:33.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:14, diff=19.171512s, valid=True
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:02:33.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:02:33.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:02:33.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:12, diff=21.175183s, valid=True
2026-05-29T04:02:33.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:02:33.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:02:33.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:02:33.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952795.175987s, valid=True
2026-05-29T04:02:33.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:02:33.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:02:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:02:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:02:33.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:02:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:02:33.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:02:33.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:02:33.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:02:33.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:02:33.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:02:33.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:02:33.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:02:33.577 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:02:33.797 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:02:34.142 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:02:34.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:02:34.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:02:34.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:02:34.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:02:34.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:02:34.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:03:04.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:03:04.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:03:04.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:03:04.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:03:04.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:03:05.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:03:05.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-29T04:03:05.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:03:05.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:03:05.164 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:03:05.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:03:05.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:03:05.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-29T04:03:07.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-29T04:03:07.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:03:07.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:03:07.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:03:07.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:03:07.610 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:03:07.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:03:07.623 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:03:07.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:03:07.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:03:07.624 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:03:07.624 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:03:07.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:03:07.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:03:07.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:03:07.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:03:07.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:03:07.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:03:07.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:03:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:03:07.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:03:07.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:03:08.005 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:02:53
2026-05-29T04:03:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70835, datetime.datetime(2026, 5, 29, 4, 2, 53), datetime.datetime(2026, 5, 29, 4, 2, 53), 'salt', 6.36, 88.35, None, 12.81, 122.25, 1.78, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:03:08.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:03:08.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:03:08.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:53, diff=15.01304s, valid=True
2026-05-29T04:03:08.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:03:08.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:03:08.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:12, diff=-3.983525s, valid=True
2026-05-29T04:03:08.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:03:08.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:02:45, diff=23.024282s, valid=True
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:03:08.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:03:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:12, diff=-3.971906s, valid=True
2026-05-29T04:03:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:03:08.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:03:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:03:08.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952830.028917s, valid=True
2026-05-29T04:03:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:03:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:03:08.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:03:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:03:08.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:03:08.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:03:08.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:03:08.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:03:08.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:03:08.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:03:08.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:03:08.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:03:08.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:03:08.358 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:03:08.568 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:03:08.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:03:09.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:03:09.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:03:09.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-29T04:03:09.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-29T04:03:09.202 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:03:09.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:03:39.232 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:03:39.232 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:03:39.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:03:39.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:03:39.718 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:03:39.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:03:39.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-29T04:03:39.955 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:03:39.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-29T04:03:39.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:03:39.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:03:39.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:03:39.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-29T04:03:42.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-29T04:03:42.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:03:42.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:03:42.386 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:03:42.387 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:03:42.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:03:42.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:03:42.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:03:42.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:03:42.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:03:42.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:03:42.412 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:03:42.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:03:42.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:03:42.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:03:42.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:03:42.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:03:42.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:03:42.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:03:42.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:03:42.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:03:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:03:42.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:03:42.729 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:03:42.789 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:03:23
2026-05-29T04:03:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70836, datetime.datetime(2026, 5, 29, 4, 3, 23), datetime.datetime(2026, 5, 29, 4, 3, 23), 'salt', 6.42, 88.42, None, 12.7, 122.25, 1.77, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:03:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:03:42.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:03:42.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:23, diff=19.804284s, valid=True
2026-05-29T04:03:42.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:03:42.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:03:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:12, diff=30.807662s, valid=True
2026-05-29T04:03:42.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:03:42.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:03:42.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:17, diff=25.815775s, valid=True
2026-05-29T04:03:42.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:03:42.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:03:42.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:03:42.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:03:42.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:03:42.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:03:42.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:12, diff=30.819413s, valid=True
2026-05-29T04:03:42.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:03:42.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:03:42.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:03:42.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952864.820227s, valid=True
2026-05-29T04:03:42.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:03:42.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:03:42.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:03:42.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:03:42.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:03:42.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:03:42.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:03:42.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:03:42.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:03:43.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:03:43.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:03:43.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:03:43.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:03:43.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:03:43.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:03:43.777 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:03:43.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:03:43.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:03:43.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-29T04:03:43.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-29T04:03:44.035 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:03:44.035 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:04:14.065 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:04:14.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:04:14.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:04:14.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:04:14.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:04:14.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:04:14.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-29T04:04:14.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:04:14.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-29T04:04:14.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:04:14.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:04:14.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:04:14.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-29T04:04:17.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-29T04:04:17.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:04:17.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:04:17.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:04:17.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:04:17.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:04:17.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:04:17.266 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:04:17.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:04:17.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:04:17.267 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:04:17.267 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:04:17.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:04:17.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:04:17.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:04:17.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:04:17.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:04:17.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:04:17.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:04:17.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:04:17.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:04:17.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:04:17.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:04:17.604 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:04:17.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:03:54
2026-05-29T04:04:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70837, datetime.datetime(2026, 5, 29, 4, 3, 54), datetime.datetime(2026, 5, 29, 4, 3, 53), 'salt', 6.12, 88.48, None, 10.94, 123.58, 1.75, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:04:17.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:04:17.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:04:17.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:53, diff=24.673238s, valid=True
2026-05-29T04:04:17.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:04:17.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:04:17.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:12, diff=5.676736s, valid=True
2026-05-29T04:04:17.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:04:17.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:04:17.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:03:48, diff=29.684719s, valid=True
2026-05-29T04:04:17.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:04:17.684 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:04:17.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:04:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:04:17.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:04:17.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:04:17.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:12, diff=5.688412s, valid=True
2026-05-29T04:04:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:04:17.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:04:17.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:04:17.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952899.689242s, valid=True
2026-05-29T04:04:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:04:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:04:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:04:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:04:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:04:17.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:04:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:04:17.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:04:17.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:04:17.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:04:17.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:04:17.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:04:17.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:04:18.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:04:18.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:04:18.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:04:18.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:04:18.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:04:18.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-29T04:04:18.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-29T04:04:18.849 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:04:18.849 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:04:48.866 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:04:48.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:04:48.867 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:04:49.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:04:49.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:04:49.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:04:49.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-29T04:04:49.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:04:49.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-29T04:04:49.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:04:49.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:04:49.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:04:49.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-29T04:04:52.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-29T04:04:52.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:04:52.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:04:52.058 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:04:52.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:04:52.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:04:52.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:04:52.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:04:52.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:04:52.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:04:52.084 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:04:52.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:04:52.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:04:52.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:04:52.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:04:52.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:04:52.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:04:52.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:04:52.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:04:52.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:04:52.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:04:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:04:52.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:04:52.402 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:04:52.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:04:24
2026-05-29T04:04:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70838, datetime.datetime(2026, 5, 29, 4, 4, 24), datetime.datetime(2026, 5, 29, 4, 4, 24), 'salt', 6.39, 88.45, None, 11.82, 123.28, 1.76, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:04:52.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:04:52.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:04:52.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:24, diff=28.468411s, valid=True
2026-05-29T04:04:52.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:04:52.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:04:52.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:12, diff=40.471795s, valid=True
2026-05-29T04:04:52.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:04:52.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:04:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:19, diff=33.479589s, valid=True
2026-05-29T04:04:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:04:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:04:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:04:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:04:52.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:04:52.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:04:52.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:04:12, diff=40.483169s, valid=True
2026-05-29T04:04:52.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:04:52.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:04:52.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:04:52.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952934.483954s, valid=True
2026-05-29T04:04:52.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:04:52.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:04:52.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:04:52.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:04:52.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:04:52.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:04:52.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:04:52.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:04:52.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:04:52.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:04:52.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:04:52.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:04:52.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:04:52.804 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:04:53.031 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:04:53.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:04:53.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:04:53.472 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:04: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-29T04:04: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-29T04:04:53.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:04:53.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:05:23.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:05:23.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:05:23.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:05:23.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:05:23.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:05:24.081 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:05:24.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-29T04:05:24.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:05:24.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-29T04:05:24.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:05:24.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:05:24.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:05:24.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:05:27.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-29T04:05:27.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:05:27.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:05:27.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:05:27.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:05:27.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:05:27.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:05:27.549 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:05:27.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:05:27.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:05:27.550 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:05:27.551 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:05:27.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:05:27.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:05:27.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:05:27.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:05:27.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:05:27.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:05:27.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:05:27.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:05:27.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:05:27.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:05:27.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:05:27.826 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:05:27.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:05:24
2026-05-29T04:05:27.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70840, datetime.datetime(2026, 5, 29, 4, 5, 24), datetime.datetime(2026, 5, 29, 4, 5, 24), 'salt', 6.39, 88.45, None, 9.81, 122.81, 1.76, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:05:27.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:05:27.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:05:27.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:24, diff=3.891881s, valid=True
2026-05-29T04:05:27.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:05:27.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:05:27.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:12, diff=15.895092s, valid=True
2026-05-29T04:05:27.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:05:27.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:22, diff=5.902518s, valid=True
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:05:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:05:27.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:05:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:12, diff=15.905979s, valid=True
2026-05-29T04:05:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:05:27.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:05:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:05:27.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=952969.906723s, valid=True
2026-05-29T04:05:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:05:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:05:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:05:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:05:27.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:05:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:05:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:05:27.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:05:27.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:05:28.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:05:28.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:05:28.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:05:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:05:28.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:05:28.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:05:28.851 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:05:28.950 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:05:28.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:05:28.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-29T04:05:28.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-29T04:05:29.220 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:05:29.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:05:59.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:05:59.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:05:59.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:05:59.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:05:59.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:05:59.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:05:59.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-29T04:05:59.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:05:59.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-29T04:05:59.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:05:59.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:05:59.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:05:59.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:06:02.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-29T04:06:02.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:06:02.313 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:06:02.314 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:06:02.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:06:02.325 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:06:02.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:06:02.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:06:02.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:06:02.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:06:02.341 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:06:02.341 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:06:02.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:06:02.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:06:02.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:06:02.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:06:02.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:06:02.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:06:02.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:06:02.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:06:02.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:06:02.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:06:02.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:06:02.665 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:06:02.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:05:55
2026-05-29T04:06:02.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70841, datetime.datetime(2026, 5, 29, 4, 5, 55), datetime.datetime(2026, 5, 29, 4, 5, 54), 'salt', 6.36, 88.42, None, 11.54, 122.15, 1.77, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:06:02.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:06:02.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:06:02.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:54, diff=8.734055s, valid=True
2026-05-29T04:06:02.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:06:02.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:06:02.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:12, diff=-9.262435s, valid=True
2026-05-29T04:06:02.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:06:02.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:06:02.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:05:54, diff=8.745716s, valid=True
2026-05-29T04:06:02.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:06:02.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:06:02.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:06:02.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:06:02.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:06:02.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:06:02.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:12, diff=-9.250505s, valid=True
2026-05-29T04:06:02.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:06:02.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:06:02.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:06:02.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953004.750355s, valid=True
2026-05-29T04:06:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:06:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:06:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:06:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:06:02.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:06:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:06:02.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:06:02.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:06:02.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:06:02.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:06:02.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:06:02.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:06:03.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:06:03.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:06:03.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:06:03.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:06:03.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:06:03.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:06:03.728 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:06:03.728 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:06:03.993 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:06:03.993 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:06:33.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:06:33.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:06:33.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:06:34.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:06:34.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:06:34.714 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:06:34.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-29T04:06:34.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:06:34.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-29T04:06:34.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:06:34.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:06:34.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:06:34.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-29T04:06:37.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-29T04:06:37.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:06:37.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:06:37.823 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:06:37.823 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:06:37.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:06:37.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:06:37.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:06:37.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:06:37.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:06:37.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:06:37.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:06:37.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:06:37.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:06:37.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:06:38.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:06:38.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:06:38.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:06:38.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:06:38.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:06:38.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:06:38.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:06:38.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:06:38.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:06:38.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:06:25
2026-05-29T04:06:38.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70842, datetime.datetime(2026, 5, 29, 4, 6, 25), datetime.datetime(2026, 5, 29, 4, 6, 25), 'salt', 6.29, 88.42, None, 11.15, 124.69, 1.77, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:06:38.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:06:38.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:06:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:25, diff=13.23207s, valid=True
2026-05-29T04:06:38.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:06:38.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:06:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:12, diff=26.235038s, valid=True
2026-05-29T04:06:38.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:06:38.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:06:38.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:15, diff=23.241815s, valid=True
2026-05-29T04:06:38.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:06:38.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:06:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:06:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:06:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:06:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:06:38.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:12, diff=26.244906s, valid=True
2026-05-29T04:06:38.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:06:38.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:06:38.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:06:38.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953040.245557s, valid=True
2026-05-29T04:06:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:06:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:06:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:06:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:06:38.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:06:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:06:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:06:38.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:06:38.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:06:38.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:06:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:06:38.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:06:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:06:38.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:06:39.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:06:39.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:06:39.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:06:39.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:06:39.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-29T04:06:39.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-29T04:06:39.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:06:39.717 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:07:09.724 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:07:09.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:07:09.724 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:07:09.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:07:09.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:07:10.107 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:07:10.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-29T04:07:10.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:07:10.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-29T04:07:10.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:07:10.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:07:10.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:07: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-29T04:07:12.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-29T04:07:12.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:07:12.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:07:12.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:07:12.569 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:07:12.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:07:12.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:07:12.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:07:12.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:07:12.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:07:12.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:07:12.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:07:12.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:07:12.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:07:12.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:07:12.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:07:12.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:07:12.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:07:12.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:07:12.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:07:12.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:07:12.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:07:12.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:07:12.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:07:12.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:06:55
2026-05-29T04:07:12.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70843, datetime.datetime(2026, 5, 29, 4, 6, 55), datetime.datetime(2026, 5, 29, 4, 6, 55), 'salt', 6.29, 88.52, None, 10.73, 122.76, 1.75, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:07:12.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:07:12.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:07:12.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:55, diff=17.98003s, valid=True
2026-05-29T04:07:12.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:07:12.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:07:12.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:12, diff=0.983448s, valid=True
2026-05-29T04:07:12.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:07:12.983 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:06:46, diff=26.991346s, valid=True
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:07:12.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:07:12.994 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:12, diff=0.994946s, valid=True
2026-05-29T04:07:12.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:07:12.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:07:12.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:07:12.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953074.995745s, valid=True
2026-05-29T04:07:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:07:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:07:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:07:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:07:12.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:07:13.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:07:13.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:07:13.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:07:13.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:07:13.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:07:13.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:07:13.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:07:13.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:07:13.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:07:13.528 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:07:13.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:07:13.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:07:13.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:07:13.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-29T04:07:13.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-29T04:07:14.230 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:07:14.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:07:44.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:07:44.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:07:44.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:07:44.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:07:44.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:07:44.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:07:44.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-29T04:07:44.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:07:44.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-29T04:07:44.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:07:44.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:07:44.661 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:07:44.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-29T04:07:47.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-29T04:07:47.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:07:47.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:07:47.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:07:47.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:07:47.662 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:07:47.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:07:47.675 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:07:47.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:07:47.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:07:47.676 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:07:47.676 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:07:47.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:07:47.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:07:47.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:07:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:07:47.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:07:47.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:07:47.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:07:47.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:07:47.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:07:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:07:47.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:07:47.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:07:48.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:07:26
2026-05-29T04:07:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70844, datetime.datetime(2026, 5, 29, 4, 7, 26), datetime.datetime(2026, 5, 29, 4, 7, 25), 'salt', 6.32, 88.55, None, 12.0, 122.22, 1.74, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:07:48.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:07:48.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:07:48.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:25, diff=23.059608s, valid=True
2026-05-29T04:07:48.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:07:48.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:07:48.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:12, diff=36.063108s, valid=True
2026-05-29T04:07:48.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:07:48.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:18, diff=30.071221s, valid=True
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:07:48.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:07:48.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:12, diff=36.07488s, valid=True
2026-05-29T04:07:48.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:07:48.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:07:48.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:07:48.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953110.075691s, valid=True
2026-05-29T04:07:48.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:07:48.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:07:48.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:07:48.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:07:48.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:07:48.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:07:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:07:48.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:07:48.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:07:48.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:07:48.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:07:48.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:07:48.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:07:48.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:07:48.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:07:49.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:07:49.119 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:07:49.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:07:49.119 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:07:49.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-29T04:07:49.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:07:49.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:08:19.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:08:19.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:08:19.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:08:19.763 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:08:19.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:08:19.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:08:19.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-29T04:08:19.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:08:19.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-29T04:08:20.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:08:20.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:08:20.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:08:20.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-29T04:08:22.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-29T04:08:22.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:08:22.481 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:08:22.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:08:22.483 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:08:22.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:08:22.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:08:22.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:08:22.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:08:22.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:08:22.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:08:22.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:08:22.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:08:22.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:08:22.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:08:22.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:08:22.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:08:22.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:08:22.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:08:22.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:08:22.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:08:22.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:08:22.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:08:22.846 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:08:22.918 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:07:56
2026-05-29T04:08:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70845, datetime.datetime(2026, 5, 29, 4, 7, 56), datetime.datetime(2026, 5, 29, 4, 7, 55), 'salt', 6.26, 88.55, None, 12.18, 126.78, 1.75, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:08:22.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:08:22.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:08:22.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:55, diff=27.924566s, valid=True
2026-05-29T04:08:22.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:08:22.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:08:22.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:08:12, diff=10.927429s, valid=True
2026-05-29T04:08:22.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:08:22.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:07:49, diff=33.934132s, valid=True
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:08:22.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:08:22.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:08:12, diff=10.937221s, valid=True
2026-05-29T04:08:22.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:08:22.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:08:22.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:08:22.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953144.937888s, valid=True
2026-05-29T04:08:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:08:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:08:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:08:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:08:22.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:08:23.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:08:23.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:08:23.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:08:23.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:08:23.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:08:23.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:08:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:08:23.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:08:23.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:08:23.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:08:23.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:08:23.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:08:23.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:08:23.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-29T04:08:23.911 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:08:24.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:08:24.106 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:08:54.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:08:54.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:08:54.136 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:08:54.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:08:54.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:08:54.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:08:54.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:08:54.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:08:54.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-29T04:08:54.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:08:54.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:08:54.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:08:54.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-29T04:08:57.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-29T04:08:57.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:08:57.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:08:57.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:08:57.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:08:57.657 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:08:57.670 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:08:57.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:08:57.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:08:57.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:08:57.672 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:08:57.672 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:08:57.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:08:57.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:08:57.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:08:57.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:08:57.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:08:57.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:08:57.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:08:57.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:08:57.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:08:57.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:08:57.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:08:57.990 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:08:58.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:08:56
2026-05-29T04:08:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70847, datetime.datetime(2026, 5, 29, 4, 8, 56), datetime.datetime(2026, 5, 29, 4, 8, 56), 'salt', 6.46, 88.55, None, 11.19, 116.66, 1.75, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:08:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:08:58.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:08:58.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:08:56, diff=2.057439s, valid=True
2026-05-29T04:08:58.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:08:58.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:08:58.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:12, diff=-13.939189s, valid=True
2026-05-29T04:08:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:08:58.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:08:58.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:08:52, diff=6.068584s, valid=True
2026-05-29T04:08:58.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:08:58.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:08:58.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:08:58.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:08:58.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:08:58.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:08:58.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:12, diff=-13.927761s, valid=True
2026-05-29T04:08:58.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:08:58.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:08:58.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:08:58.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953180.073037s, valid=True
2026-05-29T04:08:58.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:08:58.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:08:58.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:08:58.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:08:58.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:08:58.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:08:58.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:08:58.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:08:58.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:08:58.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:08:58.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:08:58.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:08:58.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:08:58.469 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:08:58.698 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:08:59.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:08:59.148 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:08:59.148 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:08:59.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-29T04:08:59.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-29T04:08:59.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:08:59.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:09:29.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:09:29.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:09:29.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:09:29.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:09:29.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:09:29.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:09:29.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-29T04:09:29.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:09:29.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-29T04:09:29.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:09:29.833 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:09:29.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:09:29.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-29T04:09:32.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-29T04:09:32.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:09:32.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:09:32.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:09:32.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:09:32.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:09:32.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:09:32.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:09:32.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:09:32.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:09:32.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:09:32.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:09:32.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:09:32.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:09:32.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:09:32.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:09:32.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:09:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:09:32.574 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:09:32.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:09:32.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:09:32.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:09:32.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:09:32.621 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:09:32.682 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:09:27
2026-05-29T04:09:32.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70848, datetime.datetime(2026, 5, 29, 4, 9, 27), datetime.datetime(2026, 5, 29, 4, 9, 26), 'salt', 6.62, 88.38, None, 11.26, 117.74, 1.78, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:09:32.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:09:32.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:09:32.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:26, diff=6.689746s, valid=True
2026-05-29T04:09:32.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:09:32.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:09:32.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:12, diff=20.693135s, valid=True
2026-05-29T04:09:32.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:09:32.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:24, diff=8.701046s, valid=True
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:09:32.701 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:09:32.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:12, diff=20.704761s, valid=True
2026-05-29T04:09:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:09:32.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:09:32.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:09:32.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953214.705556s, valid=True
2026-05-29T04:09:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:09:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:09:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:09:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:09:32.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:09:32.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:09:32.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:09:32.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:09:32.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:09:32.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:09:32.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:09:32.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:09:32.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:09:33.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:09:33.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:09:33.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:09:33.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:09:33.678 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:09:33.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-29T04:09:33.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-29T04:09:33.836 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:09:33.836 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:10:03.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:10:03.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:10:03.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:10:04.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:10:04.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:10:04.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:10:04.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:10:04.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:10:04.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-29T04:10:04.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:10:04.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:10:04.599 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:10:04.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-29T04:10:06.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-29T04:10:06.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:10:06.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:10:06.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:10:06.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:10:06.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:10:06.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:10:06.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:10:06.956 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:10:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:10:06.957 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:10:06.957 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:10:06.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:10:07.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:10:07.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:10:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:10:07.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:10:07.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:10:07.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:10:07.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:10:07.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:10:07.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:10:07.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:10:07.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:10:07.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:09:57
2026-05-29T04:10:07.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70849, datetime.datetime(2026, 5, 29, 4, 9, 57), datetime.datetime(2026, 5, 29, 4, 9, 56), 'salt', 6.59, 88.28, None, 11.47, 123.09, 1.79, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:10:07.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:10:07.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:10:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:56, diff=11.354054s, valid=True
2026-05-29T04:10:07.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:10:07.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:10:07.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:12, diff=-4.642373s, valid=True
2026-05-29T04:10:07.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:10:07.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:10:07.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:09:55, diff=12.365665s, valid=True
2026-05-29T04:10:07.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:10:07.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:10:07.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:10:07.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:10:07.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:10:07.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:10:07.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:12, diff=-4.630635s, valid=True
2026-05-29T04:10:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:10:07.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:10:07.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:10:07.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953249.370188s, valid=True
2026-05-29T04:10:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:10:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:10:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:10:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:10:07.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:10:07.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:10:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:10:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:10:07.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:10:07.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:10:07.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:10:07.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:10:07.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:10:07.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:10:07.973 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:10:08.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:10:08.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:10:08.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:10:08.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-29T04:10:08.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-29T04:10:10.018 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:10:10.018 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:10:40.048 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:10:40.048 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:10:40.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:10:40.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:10:40.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:10:40.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:10:40.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-29T04:10:40.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:10:40.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-29T04:10:40.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:10:40.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:10:40.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:10:40.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-29T04:10:43.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-29T04:10:43.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:10:43.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:10:43.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:10:43.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:10:43.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:10:43.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:10:43.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:10:43.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:10:43.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:10:43.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:10:43.167 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:10:43.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:10:43.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:10:43.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:10:43.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:10:43.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:10:43.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:10:43.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:10:43.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:10:43.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:10:43.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:10:43.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:10:43.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:10:43.576 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:10:27
2026-05-29T04:10:43.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70850, datetime.datetime(2026, 5, 29, 4, 10, 27), datetime.datetime(2026, 5, 29, 4, 10, 27), 'salt', 6.56, 88.05, None, 11.01, 127.06, 1.83, 832.0, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:10:43.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:10:43.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:10:43.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:27, diff=16.583729s, valid=True
2026-05-29T04:10:43.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:10:43.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:10:43.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:12, diff=31.587121s, valid=True
2026-05-29T04:10:43.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:10:43.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:10:43.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:26, diff=17.594965s, valid=True
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:10:43.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:10:43.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:12, diff=31.598597s, valid=True
2026-05-29T04:10:43.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:10:43.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:10:43.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:10:43.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953285.599405s, valid=True
2026-05-29T04:10:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:10:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:10:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:10:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:10:43.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:10:43.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:10:43.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:10:43.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:10:43.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:10:43.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:10:43.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:10:43.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:10:43.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:10:43.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:10:44.136 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:10:44.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:10:44.582 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:10:44.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:10:44.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-29T04:10:44.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-29T04:10:44.774 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:10:44.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:11:14.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:11:14.785 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:11:14.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:11:14.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:11:14.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:11:15.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:11: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-29T04:11:15.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:11:15.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-29T04:11:15.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:11:15.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:11:15.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:11:15.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:11:17.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:11:17.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:11:17.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:11:17.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:11:17.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:11:17.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:11:17.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:11:17.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:11:17.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:11:17.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:11:17.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:11:17.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:11:17.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:11:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:11:17.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:11:17.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:11:17.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:11:18.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:11:18.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:11:18.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:11:18.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:11:18.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:11:18.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:11:18.063 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:11:18.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:10:57
2026-05-29T04:11:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70851, datetime.datetime(2026, 5, 29, 4, 10, 57), datetime.datetime(2026, 5, 29, 4, 10, 57), 'salt', 6.49, 87.92, None, 12.07, 122.93, 1.85, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:11:18.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:11:18.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:11:18.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:57, diff=21.130197s, valid=True
2026-05-29T04:11:18.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:11:18.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:11:18.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:12, diff=6.13377s, valid=True
2026-05-29T04:11:18.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:11:18.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:11:18.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:10:47, diff=31.141929s, valid=True
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:11:18.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:11:18.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:12, diff=6.145694s, valid=True
2026-05-29T04:11:18.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:11:18.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:11:18.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:11:18.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953320.146555s, valid=True
2026-05-29T04:11:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:11:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:11:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:11:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:11:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:11:18.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:11:18.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:11:18.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:11:18.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:11:18.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:11:18.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:11:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:11:18.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:11:18.470 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:11:18.681 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:11:19.021 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:11:19.120 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:11:19.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:11:19.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-29T04:11:19.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-29T04:11:19.308 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:11:19.308 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:11:49.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:11:49.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:11:49.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:11:49.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:11:49.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:11:49.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:11:49.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-29T04:11:49.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:11:49.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-29T04:11:49.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:11:49.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:11:49.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:11:49.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-29T04:11:52.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-29T04:11:52.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:11:52.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:11:52.372 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:11:52.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:11:52.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:11:52.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:11:52.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:11:52.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:11:52.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:11:52.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:11:52.399 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:11:52.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:11:52.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:11:52.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:11:52.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:11:52.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:11:52.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:11:52.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:11:52.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:11:52.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:11:52.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:11:52.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:11:52.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:11:52.788 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:11:28
2026-05-29T04:11:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70852, datetime.datetime(2026, 5, 29, 4, 11, 28), datetime.datetime(2026, 5, 29, 4, 11, 27), 'salt', 6.49, 87.95, None, 11.26, 132.7, 1.85, 832.06, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:11:52.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:11:52.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:11:52.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:27, diff=25.796009s, valid=True
2026-05-29T04:11:52.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:11:52.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:11:52.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:12, diff=40.799434s, valid=True
2026-05-29T04:11:52.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:11:52.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:19, diff=33.807256s, valid=True
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:11:52.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:11:52.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:12, diff=40.810894s, valid=True
2026-05-29T04:11:52.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:11:52.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:11:52.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:11:52.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953354.811685s, valid=True
2026-05-29T04:11:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:11:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:11:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:11:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:11:52.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:11:52.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:11:52.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:11:52.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:11:52.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:11:52.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:11:53.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:11:53.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:11:53.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:11:53.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:11:53.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:11:53.741 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:11:53.840 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:11:53.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:11:53.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-29T04:11:53.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-29T04:11:54.029 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:11:54.029 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:12:24.059 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:12:24.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:12: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-29T04:12:24.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:12:24.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:12:24.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:12:24.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-29T04:12:24.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:12:24.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:12:24.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:12:24.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:12:24.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:12:24.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-29T04:12:27.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:12:27.033 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:12:27.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:12:27.042 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:12:27.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:12:27.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:12:27.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:12:27.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:12:27.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:12:27.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:12:27.066 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:12:27.067 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:12:27.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:12:27.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:12:27.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:12:27.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:12:27.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:12:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:12:27.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:12:27.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:12:27.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:12:27.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:12:27.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:12:27.378 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:12:27.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:11:58
2026-05-29T04:12:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70853, datetime.datetime(2026, 5, 29, 4, 11, 58), datetime.datetime(2026, 5, 29, 4, 11, 58), 'salt', 6.42, 87.92, None, 11.12, 131.52, 1.85, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:12:27.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:12:27.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:12:27.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:58, diff=29.446779s, valid=True
2026-05-29T04:12:27.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:12:27.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:12:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:12:12, diff=15.450056s, valid=True
2026-05-29T04:12:27.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:12:27.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:12:27.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:11:58, diff=29.457628s, valid=True
2026-05-29T04:12:27.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:12:27.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:12:27.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:12:27.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:12:27.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:12:27.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:12:27.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:12:12, diff=15.461131s, valid=True
2026-05-29T04:12:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:12:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:12:27.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:12:27.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953389.461895s, valid=True
2026-05-29T04:12:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:12:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:12:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:12:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:12:27.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:12:27.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:12:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:12:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:12:27.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:12:27.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:12:27.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:12:27.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:12:27.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:12:27.784 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:12:27.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:12:28.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:12:28.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:12:28.435 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:12:28.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-29T04:12:28.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-29T04:12:28.622 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:12:28.622 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:12:58.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:12:58.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:12:58.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:12:59.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:12:59.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:12:59.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:12:59.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:12:59.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:12:59.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-29T04:12:59.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:12:59.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:12:59.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:12:59.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-29T04:13:01.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-29T04:13:01.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:13:01.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:13:01.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:13:01.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:13:01.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:13:01.764 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:13:01.764 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:13:01.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:13:01.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:13:01.765 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:13:01.765 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:13:01.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:13:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:13:01.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:13:01.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:13:01.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:13:02.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:13:02.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:13:02.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:13:02.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:13:02.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:13:02.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:13:02.072 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:13:02.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:12:59
2026-05-29T04:13:02.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70855, datetime.datetime(2026, 5, 29, 4, 12, 59), datetime.datetime(2026, 5, 29, 4, 12, 59), 'salt', 6.42, 87.99, None, 11.4, 123.94, 1.84, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:13:02.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:13:02.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:13:02.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:12:59, diff=3.142238s, valid=True
2026-05-29T04:13:02.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:13:02.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:13:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:12, diff=-9.854586s, valid=True
2026-05-29T04:13:02.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:13:02.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:13:02.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:12:58, diff=4.152889s, valid=True
2026-05-29T04:13:02.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:13:02.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:13:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:13:02.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:13:02.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:13:02.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:13:02.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:12, diff=-9.84377s, valid=True
2026-05-29T04:13:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:13:02.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:13:02.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:13:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953424.156994s, valid=True
2026-05-29T04:13:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:13:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:13:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:13:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:13:02.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:13:02.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:13:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:13:02.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:13:02.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:13:02.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:13:02.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:13:02.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:13:02.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:13:02.477 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:13:02.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:13:03.135 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:13:03.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:13:03.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:13:03.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-29T04:13:03.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-29T04:13:03.448 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:13:03.449 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:13:33.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:13:33.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:13:33.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:13:33.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:13:33.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:13:33.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:13:33.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:13:33.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:13:33.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-29T04:13:33.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:13:33.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:13:33.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:13:33.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:13:36.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-29T04:13:36.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:13:36.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:13:36.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:13:36.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:13:36.445 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:13:36.458 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:13:36.459 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:13:36.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:13:36.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:13:36.460 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:13:36.460 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:13:36.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:13:36.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:13:36.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:13:36.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:13:36.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:13:36.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:13:36.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:13:36.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:13:36.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:13:36.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:13:36.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:13:36.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:13:36.862 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:13:29
2026-05-29T04:13:36.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70856, datetime.datetime(2026, 5, 29, 4, 13, 29), datetime.datetime(2026, 5, 29, 4, 13, 29), 'salt', 6.32, 87.99, None, 12.99, 119.01, 1.83, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:13:36.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:13:36.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:13:36.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:29, diff=7.870157s, valid=True
2026-05-29T04:13:36.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:13:36.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:13:36.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:12, diff=24.873695s, valid=True
2026-05-29T04:13:36.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:13:36.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:13:36.881 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:29, diff=7.881834s, valid=True
2026-05-29T04:13:36.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:13:36.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:13:36.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:13:36.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:13:36.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:13:36.882 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:13:36.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:12, diff=24.885666s, valid=True
2026-05-29T04:13:36.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:13:36.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:13:36.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:13:36.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953458.886503s, valid=True
2026-05-29T04:13:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:13:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:13:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:13:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:13:36.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:13:36.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:13:36.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:13:36.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:13:36.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:13:37.028 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:13:37.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:13:37.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:13:37.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:13:37.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:13:37.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:13:37.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:13:37.862 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:13:37.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:13:37.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-29T04:13:37.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-29T04:13:38.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:13:38.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:14:08.134 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:14:08.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:14:08.135 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:14:08.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:14:08.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:14:08.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:14:08.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-29T04:14:08.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:14:08.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-29T04:14:08.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:14:08.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:14:08.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:14:08.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-29T04:14:11.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-29T04:14:11.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:14:11.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:14:11.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:14:11.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:14:11.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:14:11.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:14:11.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:14:11.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:14:11.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:14:11.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:14:11.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:14:11.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:14:11.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:14:11.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:14:12.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:14:12.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:14:12.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:14:12.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:14:12.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:14:12.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:14:12.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:14:12.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:14:12.164 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:14:12.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:14:00
2026-05-29T04:14:12.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70857, datetime.datetime(2026, 5, 29, 4, 14), datetime.datetime(2026, 5, 29, 4, 13, 59), 'salt', 6.36, 87.99, None, 13.09, 122.69, 1.84, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:14:12.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:14:12.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:14:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:59, diff=13.232563s, valid=True
2026-05-29T04:14:12.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:14:12.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:14:12.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:12, diff=0.23593s, valid=True
2026-05-29T04:14:12.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:14:12.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:14:12.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:13:59, diff=13.243709s, valid=True
2026-05-29T04:14:12.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:14:12.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:14:12.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:14:12.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:14:12.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:14:12.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:14:12.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:12, diff=0.247337s, valid=True
2026-05-29T04:14:12.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:14:12.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:14:12.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:14:12.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953494.248132s, valid=True
2026-05-29T04:14:12.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:14:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:14:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:14:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:14:12.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:14:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:14:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:14:12.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:14:12.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:14:12.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:14:12.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:14:12.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:14:12.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:14:12.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:14:12.847 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:14:13.188 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:14:13.287 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:14:13.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:14:13.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-29T04:14:13.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-29T04:14:13.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:14:13.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:14:43.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:14:43.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:14:43.517 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:14:43.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:14:43.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:14:43.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:14:43.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-29T04:14:43.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:14:43.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-29T04:14:43.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:14:43.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:14:43.936 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:14:43.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-29T04:14:46.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-29T04:14:46.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:14:46.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:14:46.281 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:14:46.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:14:46.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:14:46.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:14:46.310 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:14:46.310 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:14:46.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:14:46.311 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:14:46.311 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:14:46.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:14:46.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:14:46.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:14:46.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:14:46.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:14:46.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:14:46.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:14:46.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:14:46.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:14:46.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:14:46.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:14:46.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:14:46.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:14:30
2026-05-29T04:14:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70858, datetime.datetime(2026, 5, 29, 4, 14, 30), datetime.datetime(2026, 5, 29, 4, 14, 30), 'salt', 6.26, 87.95, None, 12.99, 121.26, 1.85, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:14:46.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:14:46.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:14:46.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:30, diff=16.703253s, valid=True
2026-05-29T04:14:46.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:14:46.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:14:46.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:12, diff=34.706863s, valid=True
2026-05-29T04:14:46.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:14:46.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:29, diff=17.715265s, valid=True
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:14:46.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:14:46.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:14:12, diff=34.719087s, valid=True
2026-05-29T04:14:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:14:46.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:14:46.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:14:46.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953528.719935s, valid=True
2026-05-29T04:14:46.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:14:46.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:14:46.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:14:46.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:14:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:14:46.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:14:46.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:14:46.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:14:46.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:14:46.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:14:47.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:14:47.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:14:47.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:14:47.591 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:14:47.690 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:14:47.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:14:47.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-29T04:14:47.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-29T04:14:47.927 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:14:47.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:15:17.957 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:15:17.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:15:17.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:15:18.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:15:18.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:15:18.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:15:18.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-29T04:15:18.682 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:15:18.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-29T04:15:18.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:15:18.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:15:18.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:15:18.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-29T04:15:21.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-29T04:15:21.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:15:21.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:15:21.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:15:21.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:15:21.228 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:15:21.241 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:15:21.241 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:15:21.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:15:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:15:21.243 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:15:21.243 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:15:21.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:15:21.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:15:21.378 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:15:21.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:15:21.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:15:21.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:15:21.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:15:21.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:15:21.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:15:21.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:15:21.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:15:21.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:15:21.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:15:00
2026-05-29T04:15:21.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70859, datetime.datetime(2026, 5, 29, 4, 15), datetime.datetime(2026, 5, 29, 4, 15), 'salt', 6.29, 88.02, None, 12.67, 124.31, 1.83, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:15:21.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:15:21.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:15:21.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:00, diff=21.645856s, valid=True
2026-05-29T04:15:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:15:21.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:15:21.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:12, diff=9.649496s, valid=True
2026-05-29T04:15:21.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:15:21.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:15:21.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:00, diff=21.657763s, valid=True
2026-05-29T04:15:21.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:15:21.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:15:21.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:15:21.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:15:21.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:15:21.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:15:21.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:12, diff=9.661675s, valid=True
2026-05-29T04:15:21.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:15:21.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:15:21.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:15:21.662 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953563.662522s, valid=True
2026-05-29T04:15:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:15:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:15:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:15:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:15:21.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:15:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:15:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:15:21.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:15:21.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:15:21.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:15:21.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:15:21.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:15:22.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:15:22.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:15:22.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:15:22.624 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:15:22.724 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:15:22.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:15:22.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-29T04:15:22.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-29T04:15:22.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:15:22.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:15:52.968 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:15:52.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:15:52.968 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:15:53.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:15:53.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:15:53.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:15:53.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-29T04:15:53.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:15:53.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-29T04:15:53.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:15:53.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:15:53.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:15:53.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:15:55.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-29T04:15:55.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:15:55.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:15:55.820 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:15:55.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:15:55.831 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:15:55.843 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:15:55.844 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:15:55.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:15:55.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:15:55.845 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:15:55.845 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:15:55.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:15:55.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:15:55.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:15:56.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:15:56.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:15:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:15:56.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:15:56.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:15:56.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:15:56.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:15:56.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:15:56.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:15:56.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:15:30
2026-05-29T04:15:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70860, datetime.datetime(2026, 5, 29, 4, 15, 30), datetime.datetime(2026, 5, 29, 4, 15, 30), 'salt', 6.39, 88.05, None, 11.4, 130.84, 1.83, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:15:56.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:15:56.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:15:56.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:30, diff=26.239675s, valid=True
2026-05-29T04:15:56.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:15:56.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:15:56.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:12, diff=44.243113s, valid=True
2026-05-29T04:15:56.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:15:56.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:15:56.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:30, diff=26.250976s, valid=True
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:15:56.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:15:56.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:15:12, diff=44.254573s, valid=True
2026-05-29T04:15:56.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:15:56.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:15:56.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:15:56.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953598.255367s, valid=True
2026-05-29T04:15:56.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:15:56.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:15:56.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:15:56.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:15:56.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:15:56.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:15:56.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:15:56.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:15:56.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:15:56.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:15:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:15:56.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:15:56.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:15:56.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:15:56.786 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:15:57.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:15:57.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:15:57.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:15: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-29T04:15: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-29T04:15:57.421 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:15:57.422 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:16:27.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:16:27.451 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:16:27.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:16:27.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:16:27.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:16:27.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:16:27.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-29T04:16:27.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:16:27.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-29T04:16:27.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:16:27.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:16:27.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:16:27.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-29T04:16:30.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-29T04:16:30.251 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:16:30.255 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:16:30.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:16:30.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:16:30.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:16:30.276 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:16:30.276 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:16:30.276 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:16:30.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:16:30.277 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:16:30.277 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:16:30.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:16:30.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:16:30.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:16:30.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:16:30.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:16:30.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:16:30.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:16:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:16:30.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:16:30.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:16:30.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:16:30.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:16:30.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:16:01
2026-05-29T04:16:30.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70861, datetime.datetime(2026, 5, 29, 4, 16, 1), datetime.datetime(2026, 5, 29, 4, 16), 'salt', 6.32, 87.92, None, 10.98, 121.47, 1.85, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:16:30.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:16:30.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:16:30.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:16:00, diff=30.624732s, valid=True
2026-05-29T04:16:30.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:16:30.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:16:30.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:16:12, diff=18.627634s, valid=True
2026-05-29T04:16:30.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:16:30.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:16:00, diff=30.634375s, valid=True
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:16:30.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:16:30.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:16:12, diff=18.637421s, valid=True
2026-05-29T04:16:30.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:16:30.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:16:30.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:16:30.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953632.638089s, valid=True
2026-05-29T04:16:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:16:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:16:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:16:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:16:30.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:16:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:16:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:16:30.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:16:30.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:16:30.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:16:31.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:16:31.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:16:32.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:16:32.056 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:16:32.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:16:32.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:16:32.708 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:16:32.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:16:32.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-29T04:16:32.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-29T04:16:34.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:16:34.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:17:04.907 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:17:04.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:17:04.908 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:17:05.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:17:05.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:17:05.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:17:05.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-29T04:17:05.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:17:05.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-29T04:17:05.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:17:05.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:17:05.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:17:05.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-29T04:17:08.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-29T04:17:08.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:17:08.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:17:08.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:17:08.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:17:08.581 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:17:08.594 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:17:08.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:17:08.595 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:17:08.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:17:08.596 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:17:08.596 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:17:08.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:17:08.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:17:08.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:17:08.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:17:08.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:17:08.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T04:17:08.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:17:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T04:17:08.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:17:08.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:17:08.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:17:08.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:17:09.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:17:01
2026-05-29T04:17:09.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70863, datetime.datetime(2026, 5, 29, 4, 17, 1), datetime.datetime(2026, 5, 29, 4, 17, 1), 'salt', 6.26, 87.72, None, 10.41, 127.04, 1.88, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:17:09.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:17:09.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:17:09.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:01, diff=8.011968s, valid=True
2026-05-29T04:17:09.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:17:09.012 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T04:17:09.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=-2.984455s, valid=True
2026-05-29T04:17:09.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:17:09.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:17:09.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:16:54, diff=15.023824s, valid=True
2026-05-29T04:17:09.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:17:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:17:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:17:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:17:09.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:17:09.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T04:17:09.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=-2.972383s, valid=True
2026-05-29T04:17:09.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:17:09.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:17:09.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:17:09.028 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953671.028435s, valid=True
2026-05-29T04:17:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:17:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:17:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:17:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:17:09.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:17:09.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:17:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:17:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:17:09.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:17:09.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:17:09.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:17:09.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:17:09.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:17:09.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:17:09.562 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:17:09.914 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:17:10.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:17:10.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:17:10.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:17:10.030 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:17:10.223 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:17:10.224 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:17:40.233 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:17:40.233 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:17:40.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:17:40.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:17:40.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:17:40.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:17:40.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-29T04:17:40.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:17:40.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-29T04:17:41.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:17:41.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:17:41.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:17:41.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:17:43.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-29T04:17:43.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:17:43.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:17:43.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:17:43.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:17:43.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:17:43.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:17:43.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:17:43.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:17:43.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:17:43.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:17:43.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:17:43.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:17:43.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:17:43.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:17:43.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:17:43.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:17:43.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T04:17:43.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:17:43.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 669 rows from lcogt
2026-05-29T04:17:43.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:17:43.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:17:43.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:17:44.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:17:44.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:17:31
2026-05-29T04:17:44.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70864, datetime.datetime(2026, 5, 29, 4, 17, 31), datetime.datetime(2026, 5, 29, 4, 17, 31), 'salt', 6.39, 87.82, None, 9.64, 125.49, 1.87, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:17:44.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:17:44.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:17:44.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:31, diff=13.066183s, valid=True
2026-05-29T04:17:44.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:17:44.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T04:17:44.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=32.06941s, valid=True
2026-05-29T04:17:44.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:17:44.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:31, diff=13.07733s, valid=True
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:17:44.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 669 rows. Structure expected: 10 fields
2026-05-29T04:17:44.080 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=32.080765s, valid=True
2026-05-29T04:17:44.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:17:44.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:17:44.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:17:44.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953706.081507s, valid=True
2026-05-29T04:17:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:17:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:17:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:17:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:17:44.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:17:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:17:44.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:17:44.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:17:44.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:17:44.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:17:44.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:17:44.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:17:44.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:17:44.400 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:17:44.613 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:17:44.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:17:45.051 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:17:45.052 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:17:45.052 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:17:45.052 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:17:45.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:17:45.268 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:18:15.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:18:15.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:18:15.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:18:15.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:18:15.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:18:15.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:18:15.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-29T04:18:16.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:18:16.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-29T04:18:16.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:18:16.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:18:16.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:18: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-29T04:18:18.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-29T04:18:18.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:18:18.454 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:18:18.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:18:18.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:18:18.467 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:18:18.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:18:18.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:18:18.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:18:18.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:18:18.484 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:18:18.484 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:18:18.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:18:18.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:18:18.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:18:18.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:18:18.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:18:18.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:18:18.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:18:18.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 668 rows from lcogt
2026-05-29T04:18:18.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:18:18.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:18:18.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:18:18.811 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:18:18.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:18:02
2026-05-29T04:18:18.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70865, datetime.datetime(2026, 5, 29, 4, 18, 2), datetime.datetime(2026, 5, 29, 4, 18, 1), 'salt', 6.32, 87.85, None, 9.95, 131.87, 1.86, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:18:18.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:18:18.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:18:18.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:18:01, diff=17.886006s, valid=True
2026-05-29T04:18:18.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:18:18.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:18:18.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=66.889426s, valid=True
2026-05-29T04:18:18.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:18:18.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:18:01, diff=17.897252s, valid=True
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:18:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 668 rows. Structure expected: 10 fields
2026-05-29T04:18:18.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=66.900892s, valid=True
2026-05-29T04:18:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:18:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:18:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:18:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953740.90169s, valid=True
2026-05-29T04:18:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:18:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:18:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:18:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:18:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:18:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:18:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:18:18.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:18:18.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:18:19.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:18:19.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:18:19.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:18:19.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:18:19.224 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:18:19.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:18:19.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:18:19.947 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:18:19.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:18:19.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-29T04:18:19.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-29T04:18:20.125 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:18:20.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:18:50.156 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:18:50.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:18:50.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:18:50.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:18:50.652 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:18:50.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:18:50.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-29T04:18:50.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:18:50.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-29T04:18:50.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:18:50.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:18:50.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:18:50.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:18:53.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:18:53.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:18:53.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:18:53.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:18:53.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:18:53.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:18:53.431 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:18:53.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:18:53.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:18:53.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:18:53.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:18:53.433 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:18:53.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:18:53.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:18:53.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:18:53.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:18:53.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:18:53.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:18:53.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:18:53.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:18:53.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:18:53.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:18:53.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:18:53.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:18:53.817 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:18:32
2026-05-29T04:18:53.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70866, datetime.datetime(2026, 5, 29, 4, 18, 32), datetime.datetime(2026, 5, 29, 4, 18, 32), 'salt', 6.39, 87.85, None, 10.02, 125.86, 1.86, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:18:53.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:18:53.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:18:53.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:18:32, diff=21.824954s, valid=True
2026-05-29T04:18:53.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:18:53.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:18:53.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=101.828371s, valid=True
2026-05-29T04:18:53.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:18:53.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:18:32, diff=21.836416s, valid=True
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:18:53.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:18:53.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:18:53.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=101.840062s, valid=True
2026-05-29T04:18:53.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:18:53.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:18:53.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:18:53.840 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953775.84085s, valid=True
2026-05-29T04:18:53.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:18:53.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:18:53.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:18:53.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:18:53.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:18:53.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:18:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:18:53.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:18:53.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:18:53.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:18:54.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:18:54.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:18:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:18:54.179 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:18:54.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:18:54.729 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:18:54.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:18:54.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:18:54.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-29T04:18:54.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-29T04:18:55.079 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:18:55.079 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:19:25.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:19:25.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:19:25.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:19:25.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:19:25.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:19:25.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:19: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-29T04:19:25.474 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:19:25.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-29T04:19:25.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:19:25.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:19:25.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:19:25.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-29T04:19:27.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-29T04:19:27.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:19:27.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:19:27.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:19:27.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:19:27.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:19:27.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:19:27.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:19:27.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:19:27.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:19:27.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:19:27.887 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:19:27.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:19:28.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:19:28.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:19:28.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:19:28.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:19:28.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:19:28.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:19:28.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 667 rows from lcogt
2026-05-29T04:19:28.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:19:28.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:19:28.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:19:28.217 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:19:28.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:19:02
2026-05-29T04:19:28.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70867, datetime.datetime(2026, 5, 29, 4, 19, 2), datetime.datetime(2026, 5, 29, 4, 19, 2), 'salt', 6.39, 87.85, None, 11.43, 123.54, 1.86, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:19:28.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:19:28.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:19:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:19:02, diff=26.284101s, valid=True
2026-05-29T04:19:28.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:19:28.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:19:28.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=136.287507s, valid=True
2026-05-29T04:19:28.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:19:28.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:19:02, diff=26.295355s, valid=True
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:19:28.295 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 667 rows. Structure expected: 10 fields
2026-05-29T04:19:28.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=136.299036s, valid=True
2026-05-29T04:19:28.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:19:28.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:19:28.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:19:28.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953810.299845s, valid=True
2026-05-29T04:19:28.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:19:28.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:19:28.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:19:28.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:19:28.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:19:28.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:19:28.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:19:28.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:19:28.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:19:28.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:19:28.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:19:28.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:19:28.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:19:28.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:19:28.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:19:29.240 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:19:29.340 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:19:29.340 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:19:29.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-29T04:19:29.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-29T04:19:29.526 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:19:29.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:19:59.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:19:59.557 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:19:59.557 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:20:00.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:20:00.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:20:00.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:20:00.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-29T04:20:00.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:20:00.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-29T04:20:00.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:20:00.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:20:00.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:20:00.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-29T04:20:02.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-29T04:20:02.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:20:02.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:20:02.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:20:02.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:20:02.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:20:02.669 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:20:02.670 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:20:02.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:20:02.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:20:02.671 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:20:02.671 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:20:02.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:20:02.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:20:02.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:20:02.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:20:02.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:20:02.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T04:20:02.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:20:02.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T04:20:02.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:20:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:20:02.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:20:02.986 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:20:03.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:19:32
2026-05-29T04:20:03.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70868, datetime.datetime(2026, 5, 29, 4, 19, 32), datetime.datetime(2026, 5, 29, 4, 19, 32), 'salt', 6.32, 87.75, None, 11.65, 122.03, 1.87, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:20:03.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:20:03.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:20:03.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:19:32, diff=31.051764s, valid=True
2026-05-29T04:20:03.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:20:03.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T04:20:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=171.055214s, valid=True
2026-05-29T04:20:03.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:20:03.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:20:03, diff=0.063216s, valid=True
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:20:03.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T04:20:03.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=171.066893s, valid=True
2026-05-29T04:20:03.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:20:03.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:20:03.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:20:03.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953845.067719s, valid=True
2026-05-29T04:20:03.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:20:03.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:20:03.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:20:03.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:20:03.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:20:03.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:20:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:20:03.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:20:03.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:20:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:20:03.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:20:03.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:20:03.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:20:03.391 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:20:03.601 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:20:03.985 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:20:04.085 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:20:04.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:20:04.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-29T04:20:04.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-29T04:20:04.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:20:04.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:20:34.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:20:34.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:20:34.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:20:34.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:20:34.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:20:34.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:20:34.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:20:34.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:20:34.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-29T04:20:34.913 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:20:34.913 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:20:34.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:20:34.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-29T04:20:37.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-29T04:20:37.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:20:37.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:20:37.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:20:37.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:20:37.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:20:37.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:20:37.296 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:20:37.296 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:20:37.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:20:37.297 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:20:37.297 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:20:37.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:20:37.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:20:37.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:20:37.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:20:37.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:20:37.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T04:20:37.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:20:37.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T04:20:37.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:20:37.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:20:37.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:20:37.630 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:20:37.692 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:20:33
2026-05-29T04:20:37.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70870, datetime.datetime(2026, 5, 29, 4, 20, 33), datetime.datetime(2026, 5, 29, 4, 20, 33), 'salt', 6.36, 87.69, None, 12.42, 130.23, 1.89, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:20:37.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:20:37.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:20:37.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:20:33, diff=4.699873s, valid=True
2026-05-29T04:20:37.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:20:37.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T04:20:37.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=205.703332s, valid=True
2026-05-29T04:20:37.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:20:37.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:20:33, diff=4.711261s, valid=True
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:20:37.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T04:20:37.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=205.714881s, valid=True
2026-05-29T04:20:37.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:20:37.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:20:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:20:37.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953879.715682s, valid=True
2026-05-29T04:20:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:20:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:20:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:20:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:20:37.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:20:37.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:20:37.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:20:37.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:20:37.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:20:37.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:20:37.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:20:37.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:20:38.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:20:38.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:20:38.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:20:38.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:20:38.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:20:38.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:20:38.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-29T04:20:38.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-29T04:20:38.951 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:20:38.951 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:21:08.981 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:21:08.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:21:08.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:21:09.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:21:09.310 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:21:09.519 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:21:09.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-29T04:21:09.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:21:09.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-29T04:21:09.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:21:09.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:21:09.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:21:09.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:21:11.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-29T04:21:11.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:21:11.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:21:11.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:21:11.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:21:11.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:21:12.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:21:12.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:21:12.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:21:12.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:21:12.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:21:12.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:21:12.013 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:21:12.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:21:12.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:21:12.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:21:12.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:21:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:21:12.282 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:21:12.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:21:12.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:21:12.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:21:12.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:21:12.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:21:12.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:21:03
2026-05-29T04:21:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70871, datetime.datetime(2026, 5, 29, 4, 21, 3), datetime.datetime(2026, 5, 29, 4, 21, 3), 'salt', 6.36, 87.69, None, 12.25, 131.78, 1.89, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:21:12.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:21:12.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:21:12.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:21:03, diff=9.401645s, valid=True
2026-05-29T04:21:12.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:21:12.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:21:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=240.405201s, valid=True
2026-05-29T04:21:12.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:21:12.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:21:03, diff=9.413339s, valid=True
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:21:12.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:21:12.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=240.417082s, valid=True
2026-05-29T04:21:12.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:21:12.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:21:12.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:21:12.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953914.417903s, valid=True
2026-05-29T04:21:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:21:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:21:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:21:12.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:21:12.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:21:12.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:21:12.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:21:12.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:21:12.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:21:12.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:21:12.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:21:12.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:21:12.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:21:12.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:21:12.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:21:13.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:21:13.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:21:13.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:21:13.432 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:21:13.432 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:21:13.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:21:13.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:21:43.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:21:43.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:21:43.643 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:21:43.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:21:43.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:21:44.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:21:44.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-29T04:21:44.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:21:44.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-29T04:21:44.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:21:44.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:21:44.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:21:44.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-29T04:21:46.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-29T04:21:46.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:21:46.567 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:21:46.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:21:46.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:21:46.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:21:46.592 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:21:46.593 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:21:46.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:21:46.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:21:46.594 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:21:46.594 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:21:46.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:21:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:21:46.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:21:46.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:21:46.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:21:46.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:21:46.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:21:46.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:21:46.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:21:46.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:21:46.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:21:46.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:21:46.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:21:34
2026-05-29T04:21:46.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70872, datetime.datetime(2026, 5, 29, 4, 21, 34), datetime.datetime(2026, 5, 29, 4, 21, 33), 'salt', 6.32, 87.62, None, 12.03, 128.61, 1.89, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:21:46.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:21:46.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:21:46.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:21:33, diff=13.987505s, valid=True
2026-05-29T04:21:46.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:21:46.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:21:46.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=274.991003s, valid=True
2026-05-29T04:21:46.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:21:46.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:21:46.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:21:33, diff=13.998877s, valid=True
2026-05-29T04:21:46.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:21:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:21:46.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:21:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:21:46.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:21:46.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:21:47.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=275.002495s, valid=True
2026-05-29T04:21:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:21:47.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:21:47.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:21:47.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953949.003289s, valid=True
2026-05-29T04:21:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:21:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:21:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:21:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:21:47.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:21:47.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:21:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:21:47.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:21:47.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:21:47.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:21:47.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:21:47.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:21:47.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:21:47.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:21:47.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:21:47.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:21:48.072 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:21:48.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:21:48.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-29T04:21:48.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-29T04:21:48.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:21:48.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:22:18.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:22:18.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:22:18.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:22:18.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:22:18.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:22:18.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:22:18.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:22:18.672 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:22:18.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-29T04:22:18.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:22:18.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:22:18.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:22:18.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:22:20.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-29T04:22:20.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:22:20.987 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:22:20.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:22:20.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:22:20.999 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:22:21.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:22:21.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:22:21.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:22:21.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:22:21.014 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:22:21.014 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:22:21.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:22:21.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:22:21.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:22:21.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:22:21.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:22:21.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:22:21.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:22:21.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:22:21.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:22:21.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:22:21.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:22:21.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:22:21.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:22:04
2026-05-29T04:22:21.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70873, datetime.datetime(2026, 5, 29, 4, 22, 4), datetime.datetime(2026, 5, 29, 4, 22, 3), 'salt', 6.39, 87.66, None, 12.49, 127.79, 1.89, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:22:21.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:22:21.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:22:21.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:22:03, diff=18.407591s, valid=True
2026-05-29T04:22:21.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:22:21.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:22:21.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=309.411069s, valid=True
2026-05-29T04:22:21.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:22:21.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:22:21.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:22:03, diff=18.4189s, valid=True
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:22:21.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:22:21.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:17:12, diff=309.422499s, valid=True
2026-05-29T04:22:21.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:22:21.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:22:21.422 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:22:21.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=953983.423674s, valid=True
2026-05-29T04:22:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:22:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:22:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:22:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:22:21.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:22:21.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:22:21.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:22:21.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:22:21.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:22:21.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:22:21.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:22:21.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:22:21.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:22:21.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:22:21.957 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:22:22.298 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:22:22.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:22:22.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:22:22.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-29T04:22:22.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-29T04:22:22.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:22:22.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:22:52.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:22:52.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:22:52.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:22:53.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:22:53.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:22:53.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:22:53.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-29T04:22:53.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:22:53.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-29T04:22:53.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:22:53.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:22:53.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:22:53.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-29T04:22:55.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-29T04:22:55.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:22:55.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:22:55.719 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:22:55.720 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:22:55.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:22:55.744 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:22:55.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:22:55.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:22:55.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:22:55.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:22:55.746 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:22:55.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:22:55.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:22:55.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:22:55.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:22:55.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:22:56.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:22:56.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:22:56.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:22:56.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:22:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:22:56.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:22:56.064 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:22:56.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:22:34
2026-05-29T04:22:56.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70874, datetime.datetime(2026, 5, 29, 4, 22, 34), datetime.datetime(2026, 5, 29, 4, 22, 34), 'salt', 6.32, 87.62, None, 13.83, 122.69, 1.89, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:22:56.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:22:56.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:22:56.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:22:34, diff=22.133011s, valid=True
2026-05-29T04:22:56.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:22:56.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:22:56.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:12, diff=-15.863403s, valid=True
2026-05-29T04:22:56.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:22:56.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:22:56.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:22:34, diff=22.144545s, valid=True
2026-05-29T04:22:56.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:22:56.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:22:56.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:22:56.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:22:56.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:22:56.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:22:56.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:12, diff=-15.851845s, valid=True
2026-05-29T04:22:56.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:22:56.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:22:56.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:22:56.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954018.148948s, valid=True
2026-05-29T04:22:56.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:22:56.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:22:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:22:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:22:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:22:56.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:22:56.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:22:56.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:22:56.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:22:56.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:22:56.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:22:56.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:22:56.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:22:56.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:22:56.750 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:22:57.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:22:57.200 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:22:57.200 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:22:57.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-29T04:22:57.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-29T04:22:57.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:22:57.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:23:27.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:23:27.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:23:27.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:23:27.698 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:23:27.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:23:27.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:23:27.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-29T04:23:27.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:23:27.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-29T04:23:27.951 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:23:27.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:23:27.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:23:27.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:23: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-29T04:23:31.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:23:31.011 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:23:31.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:23:31.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:23:31.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:23:31.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:23:31.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:23:31.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:23:31.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:23:31.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:23:31.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:23:31.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:23:31.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:23:31.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:23:31.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:23:31.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:23:31.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:23:31.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:23:31.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:23:31.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:23:31.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:23:31.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:23:31.306 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:23:31.364 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:23:04
2026-05-29T04:23:31.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70875, datetime.datetime(2026, 5, 29, 4, 23, 4), datetime.datetime(2026, 5, 29, 4, 23, 4), 'salt', 6.42, 87.66, None, 14.01, 122.29, 1.89, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:23:31.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:23:31.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:23:31.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:04, diff=27.371723s, valid=True
2026-05-29T04:23:31.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:23:31.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:23:31.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:12, diff=19.374826s, valid=True
2026-05-29T04:23:31.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:23:31.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:04, diff=27.382099s, valid=True
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:23:31.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:23:31.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:23:12, diff=19.385349s, valid=True
2026-05-29T04:23:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:23:31.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:23:31.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:23:31.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954053.38608s, valid=True
2026-05-29T04:23:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:23:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:23:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:23:31.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:23:31.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:23:31.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:23:31.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:23:31.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:23:31.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:23:31.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:23:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:23:31.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:23:31.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:23:31.712 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:23:31.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:23:32.272 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:23:32.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:23:32.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:23:32.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-29T04:23:32.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-29T04:23:32.644 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:23:32.644 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:24:02.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:24:02.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:24:02.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:24:03.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:24:03.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:24:03.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:24:03.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-29T04:24:03.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:24:03.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-29T04:24:03.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:24:03.481 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:24:03.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:24:03.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-29T04:24:05.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-29T04:24:05.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:24:05.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:24:05.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:24:05.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:24:05.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:24:05.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:24:05.955 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:24:05.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:24:05.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:24:05.955 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:24:05.955 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:24:05.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:24:06.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:24:06.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:24:06.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:24:06.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:24:06.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:24:06.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:24:06.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:24:06.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:24:06.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:24:06.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:24:06.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:24:06.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:24:05
2026-05-29T04:24:06.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70877, datetime.datetime(2026, 5, 29, 4, 24, 5), datetime.datetime(2026, 5, 29, 4, 24, 4), 'salt', 6.26, 87.59, None, 12.56, 124.08, 1.9, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:24:06.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:24:06.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:24:06.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:04, diff=2.267848s, valid=True
2026-05-29T04:24:06.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:24:06.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:24:06.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:12, diff=-5.729108s, valid=True
2026-05-29T04:24:06.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:24:06.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:04, diff=2.278044s, valid=True
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:24:06.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:24:06.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:12, diff=-5.718731s, valid=True
2026-05-29T04:24:06.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:24:06.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:24:06.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:24:06.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954088.281989s, valid=True
2026-05-29T04:24:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:24:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:24:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:24:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:24:06.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:24:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:24:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:24:06.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:24:06.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:24:06.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:24:06.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:24:06.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:24:06.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:24:06.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:24:06.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:24:07.151 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:24:07.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:24:07.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:24:07.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-29T04:24:07.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-29T04:24:07.403 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:24:07.403 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:24:37.407 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:24:37.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:24:37.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:24:38.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:24:38.157 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:24:38.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:24:38.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-29T04:24:38.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:24:38.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-29T04:24:38.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:24:38.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:24:38.413 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:24:38.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-29T04:24:40.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-29T04:24:40.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:24:40.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:24:40.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:24:40.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:24:40.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:24:40.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:24:40.792 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:24:40.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:24:40.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:24:40.793 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:24:40.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:24:40.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:24:40.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:24:40.924 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:24:41.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:24:41.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:24:41.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:24:41.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:24:41.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:24:41.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:24:41.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:24:41.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:24:41.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:24:41.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:24:35
2026-05-29T04:24:41.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70878, datetime.datetime(2026, 5, 29, 4, 24, 35), datetime.datetime(2026, 5, 29, 4, 24, 35), 'salt', 6.16, 87.56, None, 13.87, 123.35, 1.91, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:24:41.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:24:41.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:24:41.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:35, diff=6.181509s, valid=True
2026-05-29T04:24:41.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:24:41.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:24:41.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:12, diff=-30.81502s, valid=True
2026-05-29T04:24:41.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:24:41.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:24:41.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:24:35, diff=6.192919s, valid=True
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:24:41.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:24:41.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:12, diff=-30.803425s, valid=True
2026-05-29T04:24:41.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:24:41.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:24:41.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:24:41.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954123.197378s, valid=True
2026-05-29T04:24:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:24:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:24:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:24:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:24:41.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:24:41.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:24:41.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:24:41.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:24:41.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:24:41.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:24:41.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:24:41.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:24:41.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:24:41.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:24:41.732 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:24:42.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:24:42.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:24:42.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:24:42.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:24:42.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:24:42.515 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:24:42.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:25:12.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:25:12.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:25:12.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:25:13.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:25:13.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:25:13.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:25:13.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-29T04:25:13.430 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:25:13.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-29T04:25:13.443 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:25:13.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:25:13.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:25:13.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-29T04:25:15.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-29T04:25:15.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:25:15.871 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:25:15.872 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:25:15.872 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:25:15.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:25:15.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:25:15.897 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:25:15.897 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:25:15.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:25:15.898 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:25:15.898 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:25:15.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:25:16.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:25:16.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:25:16.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:25:16.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:25:16.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:25:16.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:25:16.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:25:16.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:25:16.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:25:16.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:25:16.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:25:16.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:25:05
2026-05-29T04:25:16.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70879, datetime.datetime(2026, 5, 29, 4, 25, 5), datetime.datetime(2026, 5, 29, 4, 25, 5), 'salt', 6.39, 87.72, None, 11.33, 127.08, 1.88, 831.89, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:25:16.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:25:16.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:25:16.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:05, diff=11.275051s, valid=True
2026-05-29T04:25:16.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:25:16.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:25:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:12, diff=4.278325s, valid=True
2026-05-29T04:25:16.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:25:16.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:05, diff=11.285997s, valid=True
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:25:16.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:25:16.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:12, diff=4.289503s, valid=True
2026-05-29T04:25:16.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:25:16.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:25:16.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:25:16.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954158.290274s, valid=True
2026-05-29T04:25:16.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:25:16.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:25:16.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:25:16.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:25:16.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:25:16.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:25:16.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:25:16.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:25:16.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:25:16.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:25:16.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:25:16.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:25:16.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:25:16.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:25:16.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:25:17.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:25:17.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:25:17.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:25:17.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-29T04:25:17.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-29T04:25:17.514 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:25:17.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:25:47.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:25:47.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:25:47.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:25:47.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:25:47.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:25:47.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:25:47.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:25:47.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:25:47.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-29T04:25:47.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:25:47.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:25:47.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:25:47.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-29T04:25:50.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-29T04:25:50.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:25:50.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:25:50.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:25:50.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:25:50.289 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:25:50.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:25:50.302 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:25:50.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:25:50.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:25:50.303 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:25:50.303 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:25:50.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:25:50.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:25:50.438 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:25:50.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:25:50.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:25:50.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:25:50.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:25:50.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:25:50.617 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:25:50.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:25:50.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:25:50.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:25:50.681 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:25:36
2026-05-29T04:25:50.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70880, datetime.datetime(2026, 5, 29, 4, 25, 36), datetime.datetime(2026, 5, 29, 4, 25, 35), 'salt', 6.32, 87.36, None, 12.85, 126.68, 1.94, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:25:50.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:25:50.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:25:50.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:35, diff=15.688897s, valid=True
2026-05-29T04:25:50.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:25:50.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:25:50.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:12, diff=-21.307701s, valid=True
2026-05-29T04:25:50.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:25:50.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:25:35, diff=15.700173s, valid=True
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:25:50.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:25:50.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:12, diff=-21.296182s, valid=True
2026-05-29T04:25:50.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:25:50.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:25:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:25:50.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954192.704599s, valid=True
2026-05-29T04:25:50.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:25:50.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:25:50.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:25:50.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:25:50.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:25:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:25:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:25:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:25:50.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:25:50.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:25:50.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:25:50.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:25:50.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:25:51.025 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:25:51.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:25:51.646 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:25:51.746 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:25:51.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:25:51.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-29T04:25:51.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-29T04:25:51.998 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:25:51.999 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:26:22.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:26:22.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:26:22.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:26:22.334 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:26:22.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:26:22.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:26:22.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-29T04:26:22.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:26:22.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-29T04:26:22.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:26:22.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:26:22.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:26:22.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-29T04:26:25.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:26:25.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:26:25.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:26:25.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:26:25.010 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:26:25.022 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:26:25.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:26:25.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:26:25.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:26:25.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:26:25.036 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:26:25.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:26:25.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:26:25.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:26:25.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:26:25.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:26:25.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:26:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:26:25.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:26:25.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:26:25.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:26:25.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:26:25.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:26:25.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:26:25.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:26:06
2026-05-29T04:26:25.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70881, datetime.datetime(2026, 5, 29, 4, 26, 6), datetime.datetime(2026, 5, 29, 4, 26, 6), 'salt', 6.32, 87.22, None, 14.47, 120.72, 1.96, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:26:25.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:26:25.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:26:25.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:06, diff=19.425926s, valid=True
2026-05-29T04:26:25.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:26:25.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:26:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:12, diff=13.429309s, valid=True
2026-05-29T04:26:25.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:26:25.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:05, diff=20.437272s, valid=True
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:26:25.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:26:25.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:12, diff=13.44083s, valid=True
2026-05-29T04:26:25.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:26:25.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:26:25.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:26:25.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954227.441604s, valid=True
2026-05-29T04:26:25.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:26:25.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:26:25.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:26:25.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:26:25.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:26:25.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:26:25.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:26:25.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:26:25.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:26:25.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:26:25.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:26:25.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:26:25.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:26:25.764 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:26:25.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:26:26.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:26:26.413 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:26:26.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:26:26.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-29T04:26:26.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-29T04:26:26.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:26:26.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:26:56.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:26:56.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:26:56.633 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:26:56.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:26:56.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:26:57.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:26:57.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-29T04:26:57.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:26:57.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-29T04:26:57.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:26:57.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:26:57.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:26:57.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-29T04:26:59.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-29T04:26:59.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:26:59.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:26:59.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:26:59.671 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:26:59.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:26:59.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:26:59.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:26:59.695 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:26:59.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:26:59.695 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:26:59.696 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:26:59.702 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:26:59.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:26:59.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:26:59.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:26:59.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:26:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:26:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:27:00.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:27:00.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:27:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:27:00.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:27:00.014 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:27:00.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:26:36
2026-05-29T04:27:00.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70882, datetime.datetime(2026, 5, 29, 4, 26, 36), datetime.datetime(2026, 5, 29, 4, 26, 36), 'salt', 6.39, 87.16, None, 12.63, 122.67, 1.97, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:27:00.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:27:00.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:27:00.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:36, diff=24.081595s, valid=True
2026-05-29T04:27:00.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:27:00.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:27:00.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:12, diff=-11.915441s, valid=True
2026-05-29T04:27:00.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:27:00.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:26:36, diff=24.091377s, valid=True
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:27:00.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:27:00.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:12, diff=-11.905564s, valid=True
2026-05-29T04:27:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:27:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:27:00.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:27:00.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954262.095109s, valid=True
2026-05-29T04:27:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:27:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:27:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:27:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:27:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:27:00.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:27:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:27:00.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:27:00.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:27:00.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:27:00.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:27:00.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:27:00.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:27:00.483 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:27:00.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:27:01.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:27:01.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:27:01.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:27:01.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-29T04:27:01.134 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:27:01.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:27:01.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:27:31.820 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:27:31.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:27:31.821 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:27:31.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:27:31.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:27:32.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:27:32.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:27:32.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:27:32.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-29T04:27:32.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:27:32.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:27:32.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:27:32.220 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:27:34.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-29T04:27:34.949 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:27:34.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:27:34.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:27:34.958 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:27:34.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:27:34.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:27:34.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:27:34.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:27:34.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:27:34.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:27:34.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:27:34.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:27:35.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:27:35.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:27:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:27:35.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:27:35.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:27:35.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:27:35.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:27:35.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:27:35.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:27:35.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:27:35.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:27:35.384 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:27:06
2026-05-29T04:27:35.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70883, datetime.datetime(2026, 5, 29, 4, 27, 6), datetime.datetime(2026, 5, 29, 4, 27, 6), 'salt', 6.39, 87.16, None, 13.2, 123.54, 1.97, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:27:35.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:27:35.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:27:35.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:06, diff=29.391702s, valid=True
2026-05-29T04:27:35.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:27:35.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:27:35.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:12, diff=23.395168s, valid=True
2026-05-29T04:27:35.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:27:35.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:06, diff=29.403123s, valid=True
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:27:35.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:27:35.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:27:12, diff=23.406819s, valid=True
2026-05-29T04:27:35.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:27:35.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:27:35.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:27:35.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954297.407591s, valid=True
2026-05-29T04:27:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:27:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:27:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:27:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:27:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:27:35.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:27:35.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:27:35.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:27:35.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:27:35.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:27:35.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:27:35.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:27:35.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:27:35.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:27:35.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:27:36.277 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:27:36.376 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:27:36.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:27:36.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-29T04:27:36.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-29T04:27:36.468 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:27:36.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:28:06.497 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:28:06.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:28:06.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:28:06.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:28:06.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:28:07.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:28:07.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-29T04:28:07.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:28:07.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-29T04:28:07.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:28:07.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:28:07.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:28:07.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-29T04:28:09.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-29T04:28:09.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:28:09.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:28:09.808 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:28:09.808 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:28:09.820 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:28:09.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:28:09.832 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:28:09.832 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:28:09.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:28:09.833 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:28:09.833 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:28:09.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:28:09.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:28:09.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:28:10.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:28:10.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:28:10.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:28:10.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:28:10.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:28:10.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:28:10.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:28:10.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:28:10.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:28:10.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:28:07
2026-05-29T04:28:10.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70885, datetime.datetime(2026, 5, 29, 4, 28, 7), datetime.datetime(2026, 5, 29, 4, 28, 7), 'salt', 6.46, 87.16, None, 14.01, 121.21, 1.98, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:28:10.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:28:10.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:28:10.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:07, diff=3.172241s, valid=True
2026-05-29T04:28:10.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:28:10.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:28:10.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:12, diff=-1.824783s, valid=True
2026-05-29T04:28:10.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:28:10.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:28:10.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:06, diff=4.181951s, valid=True
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:28:10.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:28:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:12, diff=-1.814971s, valid=True
2026-05-29T04:28:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:28:10.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:28:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:28:10.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954332.185714s, valid=True
2026-05-29T04:28:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:28:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:28:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:28:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:28:10.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:28:10.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:28:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:28:10.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:28:10.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:28:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:28:10.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:28:10.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:28:10.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:28:10.580 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:28:10.794 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:28:11.140 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:28:11.242 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:28:11.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:28:11.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-29T04:28:11.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-29T04:28:11.488 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:28:11.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:28:41.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:28:41.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:28:41.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:28:41.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:28:41.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:28:42.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:28:42.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-29T04:28:42.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:28:42.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-29T04:28:42.076 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:28:42.076 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:28:42.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:28:42.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-29T04:28:44.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-29T04:28:44.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:28:44.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:28:44.525 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:28:44.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:28:44.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:28:44.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:28:44.551 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:28:44.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:28:44.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:28:44.552 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:28:44.552 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:28:44.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:28:44.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:28:44.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:28:44.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:28:44.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:28:44.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:28:44.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:28:44.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:28:44.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:28:44.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:28:44.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:28:44.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:28:44.929 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:28:37
2026-05-29T04:28:44.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70886, datetime.datetime(2026, 5, 29, 4, 28, 37), datetime.datetime(2026, 5, 29, 4, 28, 37), 'salt', 6.42, 87.06, None, 13.3, 125.06, 1.99, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:28:44.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:28:44.929 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:28:44.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:37, diff=7.936389s, valid=True
2026-05-29T04:28:44.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:28:44.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:28:44.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:12, diff=-27.060155s, valid=True
2026-05-29T04:28:44.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:28:44.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:28:44.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:28:37, diff=7.947737s, valid=True
2026-05-29T04:28:44.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:28:44.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:28:44.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:28:44.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:28:44.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:28:44.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:28:44.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:12, diff=-27.048684s, valid=True
2026-05-29T04:28:44.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:28:44.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:28:44.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:28:44.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954366.952125s, valid=True
2026-05-29T04:28:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:28:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:28:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:28:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:28:44.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:28:45.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:28:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:28:45.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:28:45.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:28:45.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:28:45.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:28:45.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:28:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:28:45.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:28:45.482 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:28:45.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:28:45.920 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:28:45.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:28:45.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-29T04:28:45.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-29T04:28:46.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:28:46.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:29:16.121 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:29:16.121 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:29: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-29T04:29:16.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:29:16.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:29:16.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:29:16.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-29T04:29:16.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:29:16.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-29T04:29:16.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:29:16.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:29:16.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:29:16.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-29T04:29:19.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-29T04:29:19.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:29:19.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:29:19.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:29:19.548 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:29:19.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:29:19.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:29:19.574 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:29:19.574 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:29:19.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:29:19.575 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:29:19.575 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:29:19.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:29:19.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:29:19.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:29:19.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:29:19.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:29:19.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:29:19.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:29:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:29:19.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:29:19.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:29:19.896 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:29:19.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:29:19.954 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:29:08
2026-05-29T04:29:19.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70887, datetime.datetime(2026, 5, 29, 4, 29, 8), datetime.datetime(2026, 5, 29, 4, 29, 7), 'salt', 6.32, 87.09, None, 13.66, 114.22, 1.98, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:29:19.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:29:19.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:29:19.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:07, diff=12.960803s, valid=True
2026-05-29T04:29:19.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:29:19.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:29:19.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:12, diff=7.964239s, valid=True
2026-05-29T04:29:19.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:29:19.964 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:29:19.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:07, diff=12.971795s, valid=True
2026-05-29T04:29:19.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:29:19.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:29:19.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:29:19.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:29:19.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:29:19.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:29:19.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:12, diff=7.975175s, valid=True
2026-05-29T04:29:19.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:29:19.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:29:19.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:29:19.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954401.975913s, valid=True
2026-05-29T04:29:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:29:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:29:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:29:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:29:19.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:29:20.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:29:20.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:29:20.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:29:20.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:29:20.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:29:20.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:29:20.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:29:20.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:29:20.377 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:29:20.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:29:20.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:29:21.030 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:29:21.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:29:21.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:29:21.030 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:29:21.216 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:29:21.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:29:51.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:29:51.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:29:51.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:29:51.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:29:51.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:29:51.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:29:51.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-29T04:29:51.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:29:51.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-29T04:29:51.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:29:51.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:29:51.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:29:51.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-29T04:29:54.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-29T04:29:54.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:29:54.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:29:54.275 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:29:54.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:29:54.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:29:54.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:29:54.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:29:54.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:29:54.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:29:54.300 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:29:54.300 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:29:54.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:29:54.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:29:54.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:29:54.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:29:54.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:29:54.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:29:54.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:29:54.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:29:54.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:29:54.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:29:54.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:29:54.625 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:29:54.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:29:38
2026-05-29T04:29:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70888, datetime.datetime(2026, 5, 29, 4, 29, 38), datetime.datetime(2026, 5, 29, 4, 29, 37), 'salt', 6.39, 87.16, None, 14.72, 119.8, 1.97, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:29:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:29:54.685 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:29:54.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:37, diff=17.693149s, valid=True
2026-05-29T04:29:54.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:29:54.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:29:54.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:12, diff=-17.303359s, valid=True
2026-05-29T04:29:54.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:29:54.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:29:54.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:29:37, diff=17.704801s, valid=True
2026-05-29T04:29:54.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:29:54.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:29:54.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:29:54.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:29:54.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:29:54.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:29:54.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:12, diff=-17.291448s, valid=True
2026-05-29T04:29:54.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:29:54.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:29:54.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:29:54.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954436.709364s, valid=True
2026-05-29T04:29:54.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:29:54.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:29:54.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:29:54.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:29:54.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:29:54.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:29:54.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:29:54.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:29:54.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:29:54.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:29:54.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:29:54.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:29:54.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:29:55.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:29:55.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:29:55.615 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:29:55.714 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:29:55.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:29:55.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-29T04:29:55.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-29T04:29:55.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:29:55.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:30:25.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:30:25.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:30:25.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:30:26.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:30:26.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:30:26.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:30:26.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-29T04:30:26.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:30:26.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-29T04:30:26.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:30:26.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:30:26.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:30:26.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-29T04:30:29.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-29T04:30:29.185 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:30:29.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:30:29.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:30:29.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:30:29.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:30:29.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:30:29.218 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:30:29.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:30:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:30:29.219 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:30:29.219 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:30:29.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:30:29.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:30:29.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:30:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:30:29.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:30:29.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:30:29.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:30:29.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:30:29.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:30:29.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:30:29.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:30:29.561 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:30:29.648 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:30:08
2026-05-29T04:30:29.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70889, datetime.datetime(2026, 5, 29, 4, 30, 8), datetime.datetime(2026, 5, 29, 4, 30, 8), 'salt', 6.42, 87.19, None, 15.39, 121.14, 1.97, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:30:29.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:30:29.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:30:29.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:08, diff=21.655884s, valid=True
2026-05-29T04:30:29.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:30:29.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:30:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:12, diff=17.659229s, valid=True
2026-05-29T04:30:29.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:30:29.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:07, diff=22.66709s, valid=True
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:30:29.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:30:29.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:12, diff=17.670693s, valid=True
2026-05-29T04:30:29.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:30:29.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:30:29.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:30:29.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954471.671476s, valid=True
2026-05-29T04:30:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:30:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:30:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:30:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:30:29.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:30:29.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:30:29.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:30:29.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:30:29.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:30:29.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:30:29.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:30:29.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:30:29.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:30:30.018 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:30:30.237 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:30:30.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:30:30.688 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:30:30.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:30:30.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-29T04:30:30.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-29T04:30:30.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:30:30.872 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:31:00.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:31:00.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:31:00.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:31:01.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:31:01.059 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:31:01.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:31:01.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-29T04:31:01.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:31:01.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-29T04:31:01.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:31:01.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:31:01.305 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:31: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-29T04:31:03.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-29T04:31:03.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:31:03.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:31:03.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:31:03.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:31:03.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:31:03.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:31:03.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:31:03.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:31:03.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:31:03.791 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:31:03.791 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:31:03.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:31:03.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:31:03.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:31:03.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:31:03.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:31:04.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:31:04.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:31:04.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:31:04.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:31:04.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:31:04.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:31:04.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:31:04.121 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:30:38
2026-05-29T04:31:04.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70890, datetime.datetime(2026, 5, 29, 4, 30, 38), datetime.datetime(2026, 5, 29, 4, 30, 38), 'salt', 6.62, 87.19, None, 15.56, 123.7, 1.97, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:31:04.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:31:04.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:31:04.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:38, diff=26.128664s, valid=True
2026-05-29T04:31:04.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:31:04.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:31:04.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:12, diff=-7.867971s, valid=True
2026-05-29T04:31:04.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:31:04.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:31:04.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:30:38, diff=26.140644s, valid=True
2026-05-29T04:31:04.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:31:04.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:31:04.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:31:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:31:04.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:31:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:31:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:12, diff=-7.855473s, valid=True
2026-05-29T04:31:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:31:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:31:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:31:04.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954506.145465s, valid=True
2026-05-29T04:31:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:31:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:31:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:31:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:31:04.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:31:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:31:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:31:04.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:31:04.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:31:04.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:31:04.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:31:04.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:31:04.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:31:04.486 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:31:04.696 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:31:05.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:31:05.194 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:31:05.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:31:05.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-29T04:31:05.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-29T04:31:05.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:31:05.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:31:35.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:31:35.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:31:35.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:31:35.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:31:35.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:31:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:31:35.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:31:35.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:31:35.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-29T04:31:35.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:31:35.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:31:35.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:31:35.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-29T04:31:38.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-29T04:31:38.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:31:38.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:31:38.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:31:38.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:31:38.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:31:38.258 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:31:38.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:31:38.259 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:31:38.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:31:38.260 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:31:38.260 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:31:38.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:31:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:31:38.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:31:38.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:31:38.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:31:38.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:31:38.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:31:38.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:31:38.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:31:38.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:31:38.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:31:38.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:31:38.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:31:09
2026-05-29T04:31:38.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70891, datetime.datetime(2026, 5, 29, 4, 31, 9), datetime.datetime(2026, 5, 29, 4, 31, 8), 'salt', 6.56, 86.79, None, 15.63, 120.2, 2.04, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:31:38.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:31:38.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:31:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:08, diff=30.678744s, valid=True
2026-05-29T04:31:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:31:38.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:31:38.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:12, diff=26.682223s, valid=True
2026-05-29T04:31:38.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:31:38.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:08, diff=30.690307s, valid=True
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:31:38.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:31:38.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:31:12, diff=26.694067s, valid=True
2026-05-29T04:31:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:31:38.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:31:38.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:31:38.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954540.694883s, valid=True
2026-05-29T04:31:38.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:31:38.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:31:38.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:31:38.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:31:38.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:31:38.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:31:38.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:31:38.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:31:38.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:31:38.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:31:38.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:31:38.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:31:38.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:31:39.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:31:39.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:31:39.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:31:39.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:31:39.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:31:39.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-29T04:31:39.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-29T04:31:39.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:31:39.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:32:09.899 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:32:09.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:32:09.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:32:10.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:32:10.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:32:10.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:32:10.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-29T04:32:10.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:32:10.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-29T04:32:10.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:32:10.570 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:32:10.575 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:32:10.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-29T04:32:13.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-29T04:32:13.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:32:13.024 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:32:13.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:32:13.025 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:32:13.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:32:13.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:32:13.048 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:32:13.049 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:32:13.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:32:13.049 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:32:13.050 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:32:13.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:32:13.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:32:13.186 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:32:13.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:32:13.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:32:13.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:32:13.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:32:13.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:32:13.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:32:13.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:32:13.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:32:13.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:32:13.449 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:32:09
2026-05-29T04:32:13.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70893, datetime.datetime(2026, 5, 29, 4, 32, 9), datetime.datetime(2026, 5, 29, 4, 32, 9), 'salt', 6.56, 86.63, None, 15.03, 121.4, 2.07, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:32:13.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:32:13.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:32:13.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:09, diff=4.456944s, valid=True
2026-05-29T04:32:13.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:32:13.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:32:13.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:12, diff=1.460533s, valid=True
2026-05-29T04:32:13.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:32:13.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:32:13.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:09, diff=4.468742s, valid=True
2026-05-29T04:32:13.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:32:13.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:32:13.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:32:13.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:32:13.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:32:13.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:32:13.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:12, diff=1.472514s, valid=True
2026-05-29T04:32:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:32:13.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:32:13.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:32:13.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954575.47334s, valid=True
2026-05-29T04:32:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:32:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:32:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:32:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:32:13.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:32:13.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:32:13.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:32:13.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:32:13.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:32:13.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:32:13.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:32:13.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:32:13.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:32:13.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:32:14.081 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:32:14.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:32:14.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:32:14.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:32:14.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-29T04:32:14.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-29T04:32:14.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:32:14.948 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:32:44.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:32:44.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:32:44.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:32:45.132 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:32:45.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:32:45.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:32:45.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-29T04:32:45.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:32:45.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-29T04:32:45.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:32:45.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:32:45.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:32:45.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-29T04:32:47.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-29T04:32:47.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:32:47.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:32:47.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:32:47.855 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:32:47.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:32:47.876 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:32:47.877 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:32:47.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:32:47.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:32:47.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:32:47.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:32:47.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:32:47.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:32:47.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:32:48.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:32:48.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:32:48.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:32:48.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:32:48.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:32:48.146 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:32:48.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:32:48.151 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:32:48.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:32:48.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:32:39
2026-05-29T04:32:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70894, datetime.datetime(2026, 5, 29, 4, 32, 39), datetime.datetime(2026, 5, 29, 4, 32, 39), 'salt', 6.56, 86.66, None, 13.2, 119.85, 2.06, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:32:48.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:32:48.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:32:48.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:39, diff=9.218122s, valid=True
2026-05-29T04:32:48.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:32:48.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:32:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:12, diff=-23.778669s, valid=True
2026-05-29T04:32:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:32:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:32:48.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:32:39, diff=9.228813s, valid=True
2026-05-29T04:32:48.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:32:48.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:32:48.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:32:48.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:32:48.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:32:48.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:32:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:12, diff=-23.767772s, valid=True
2026-05-29T04:32:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:32:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:32:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:32:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954610.232976s, valid=True
2026-05-29T04:32:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:32:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:32:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:32:48.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:32:48.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:32:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:32:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:32:48.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:32:48.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:32:48.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:32:48.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:32:48.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:32:48.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:32:48.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:32:48.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:32:49.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:32:49.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:32:49.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:32:49.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-29T04:32:49.205 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:32:49.798 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:32:49.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:33:19.828 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:33:19.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:33:19.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:33:20.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:33:20.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:33:20.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:33:20.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-29T04:33:20.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:33:20.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-29T04:33:20.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:33:20.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:33:20.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:33:20.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-29T04:33:23.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-29T04:33:23.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:33:23.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:33:23.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:33:23.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:33:23.050 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:33:23.063 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:33:23.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:33:23.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:33:23.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:33:23.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:33:23.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:33:23.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:33:23.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:33:23.201 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:33:23.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:33:23.299 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:33:23.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:33:23.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:33:23.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:33:23.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:33:23.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:33:23.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:33:23.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:33:23.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:33:10
2026-05-29T04:33:23.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70895, datetime.datetime(2026, 5, 29, 4, 33, 10), datetime.datetime(2026, 5, 29, 4, 33, 9), 'salt', 6.56, 86.73, None, 16.8, 121.54, 2.05, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:33:23.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:33:23.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:33:23.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:09, diff=14.470356s, valid=True
2026-05-29T04:33:23.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:33:23.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:33:23.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:12, diff=11.473771s, valid=True
2026-05-29T04:33:23.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:33:23.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:33:23.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:09, diff=14.48177s, valid=True
2026-05-29T04:33:23.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:33:23.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:33:23.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:33:23.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:33:23.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:33:23.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:33:23.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:12, diff=11.485405s, valid=True
2026-05-29T04:33:23.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:33:23.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:33:23.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:33:23.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954645.486238s, valid=True
2026-05-29T04:33:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:33:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:33:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:33:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:33:23.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:33:23.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:33:23.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:33:23.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:33:23.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:33:23.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:33:23.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:33:23.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:33:23.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:33:23.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:33:24.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:33:24.429 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:33:24.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:33:24.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:33:24.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-29T04:33:24.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-29T04:33:24.799 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:33:24.799 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:33:54.819 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:33:54.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:33:54.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:33:55.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:33:55.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:33:55.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:33:55.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-29T04:33:55.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:33:55.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-29T04:33:55.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:33:55.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:33:55.410 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:33:55.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-29T04:33:58.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:33:58.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:33:58.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:33:58.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:33:58.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:33:58.098 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:33:58.110 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:33:58.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:33:58.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:33:58.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:33:58.112 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:33:58.112 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:33:58.119 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:33:58.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:33:58.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:33:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:33:58.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:33:58.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:33:58.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:33:58.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:33:58.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:33:58.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:33:58.439 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:33:58.439 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:33:58.499 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:33:40
2026-05-29T04:33:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70896, datetime.datetime(2026, 5, 29, 4, 33, 40), datetime.datetime(2026, 5, 29, 4, 33, 39), 'salt', 6.46, 86.73, None, 16.55, 122.34, 2.05, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:33:58.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:33:58.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:33:58.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:39, diff=19.506996s, valid=True
2026-05-29T04:33:58.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:33:58.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:33:58.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:12, diff=-13.489451s, valid=True
2026-05-29T04:33:58.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:33:58.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:33:58.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:33:39, diff=19.51857s, valid=True
2026-05-29T04:33:58.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:33:58.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:33:58.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:33:58.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:33:58.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:33:58.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:33:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:12, diff=-13.477698s, valid=True
2026-05-29T04:33:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:33:58.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:33:58.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:33:58.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954680.523125s, valid=True
2026-05-29T04:33:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:33:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:33:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:33:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:33:58.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:33:58.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:33:58.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:33:58.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:33:58.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:33:58.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:33:58.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:33:58.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:33:58.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:33:58.848 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:33:59.060 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:33:59.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:33:59.505 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:33:59.505 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:33:59.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-29T04:33:59.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-29T04:33:59.700 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:33:59.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:34:29.731 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:34:29.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:34:29.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:34:29.867 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:34:29.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:34:30.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:34:30.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-29T04:34:30.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:34:30.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-29T04:34:30.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:34:30.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:34:30.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:34:30.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-29T04:34: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-29T04:34:32.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:34:32.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:34:32.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:34:32.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:34:32.473 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:34:32.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:34:32.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:34:32.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:34:32.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:34:32.485 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:34:32.485 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:34:32.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:34:32.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:34:32.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:34:32.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:34:32.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:34:32.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:34:32.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:34:32.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:34:32.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:34:32.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:34:32.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:34:32.739 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:34:32.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:34:10
2026-05-29T04:34:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70897, datetime.datetime(2026, 5, 29, 4, 34, 10), datetime.datetime(2026, 5, 29, 4, 34, 10), 'salt', 6.46, 86.76, None, 13.9, 119.55, 2.04, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:34:32.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:34:32.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:34:32.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:10, diff=22.80259s, valid=True
2026-05-29T04:34:32.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:34:32.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:34:32.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:12, diff=20.805628s, valid=True
2026-05-29T04:34:32.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:34:32.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:10, diff=22.812303s, valid=True
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:34:32.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:34:32.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:12, diff=20.815393s, valid=True
2026-05-29T04:34:32.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:34:32.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:34:32.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:34:32.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954714.81606s, valid=True
2026-05-29T04:34:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:34:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:34:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:34:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:34:32.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:34:32.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:34:32.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:34:32.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:34:32.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:34:32.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:34:33.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:34:33.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:34:33.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:34:33.226 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:34:33.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:34:33.803 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:34:33.903 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:34:33.903 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:34:33.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-29T04:34:33.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-29T04:34:34.186 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:34:34.186 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:35:04.216 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:35:04.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:35:04.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:35:04.539 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:35:04.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:35:04.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:35:04.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-29T04:35:04.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:35:04.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-29T04:35:04.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:35:04.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:35:04.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:35:04.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-29T04:35:07.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-29T04:35:07.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:35:07.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:35:07.143 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:35:07.143 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:35:07.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:35:07.167 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:35:07.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:35:07.168 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:35:07.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:35:07.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:35:07.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:35:07.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:35:07.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:35:07.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:35:07.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:35:07.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:35:07.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:35:07.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:35:07.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:35:07.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:35:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:35:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:35:07.490 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:35:07.551 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:34:40
2026-05-29T04:35:07.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70898, datetime.datetime(2026, 5, 29, 4, 34, 40), datetime.datetime(2026, 5, 29, 4, 34, 40), 'salt', 6.46, 86.69, None, 14.22, 119.31, 2.05, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:35:07.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:35:07.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:35:07.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:40, diff=27.558326s, valid=True
2026-05-29T04:35:07.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:35:07.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:35:07.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:35:12, diff=-4.438328s, valid=True
2026-05-29T04:35:07.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:35:07.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:35:07.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:34:40, diff=27.569499s, valid=True
2026-05-29T04:35:07.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:35:07.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:35:07.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:35:07.569 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:35:07.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:35:07.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:35:07.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:35:12, diff=-4.42687s, valid=True
2026-05-29T04:35:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:35:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:35:07.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:35:07.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954749.573917s, valid=True
2026-05-29T04:35:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:35:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:35:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:35:07.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:35:07.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:35:07.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:35:07.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:35:07.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:35:07.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:35:07.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:35:07.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:35:07.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:35:07.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:35:07.897 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:35:08.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:35:08.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:35:08.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:35:08.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:35:08.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-29T04:35:08.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-29T04:35:08.777 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:35:08.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:35:38.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:35:38.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:35: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-29T04:35:39.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:35:39.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:35:39.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:35:39.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-29T04:35:39.323 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:35:39.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-29T04:35:39.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:35:39.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:35:39.339 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:35: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-29T04:35:42.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-29T04:35:42.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:35:42.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:35:42.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:35:42.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:35:42.629 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:35:42.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:35:42.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:35:42.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:35:42.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:35:42.643 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:35:42.644 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:35:42.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:35:42.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:35:42.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:35:42.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:35:42.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:35:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:35:42.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:35:42.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:35:42.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:35:42.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:35:42.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:35:42.963 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:35:43.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:35:41
2026-05-29T04:35:43.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70900, datetime.datetime(2026, 5, 29, 4, 35, 41), datetime.datetime(2026, 5, 29, 4, 35, 41), 'salt', 6.49, 86.63, None, 13.62, 121.12, 2.06, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:35:43.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:35:43.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:35:43.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:35:41, diff=2.037599s, valid=True
2026-05-29T04:35:43.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:35:43.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:35:43.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:12, diff=-28.959028s, valid=True
2026-05-29T04:35:43.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:35:43.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:35:43.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:35:40, diff=3.048735s, valid=True
2026-05-29T04:35:43.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:35:43.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:35:43.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:35:43.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:35:43.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:35:43.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:35:43.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:12, diff=-28.947754s, valid=True
2026-05-29T04:35:43.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:35:43.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:35:43.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:35:43.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954785.053026s, valid=True
2026-05-29T04:35:43.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:35:43.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:35:43.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:35:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:35:43.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:35:43.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:35:43.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:35:43.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:35:43.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:35:43.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:35:43.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:35:43.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:35:43.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:35:43.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:35:43.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:35:44.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:35:44.107 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:35:44.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:35:44.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-29T04:35:44.108 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:35:44.303 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:35:44.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:36:14.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:36:14.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:36:14.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:36:14.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:36:14.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:36:15.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:36:15.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-29T04:36:15.039 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:36:15.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-29T04:36:15.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:36:15.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:36:15.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:36:15.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:36:17.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-29T04:36:17.921 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:36:17.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:36:17.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:36:17.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:36:17.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:36:17.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:36:17.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:36:17.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:36:17.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:36:17.946 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:36:17.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:36:17.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:36:18.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:36:18.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:36:18.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:36:18.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:36:18.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:36:18.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:36:18.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:36:18.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:36:18.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:36:18.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:36:18.257 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:36:18.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:36:11
2026-05-29T04:36:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70901, datetime.datetime(2026, 5, 29, 4, 36, 11), datetime.datetime(2026, 5, 29, 4, 36, 11), 'salt', 6.49, 86.69, None, 13.2, 122.41, 2.05, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:36:18.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:36:18.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:36:18.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:11, diff=7.328298s, valid=True
2026-05-29T04:36:18.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:36:18.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:36:18.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:12, diff=6.331699s, valid=True
2026-05-29T04:36:18.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:36:18.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:36:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:10, diff=8.339693s, valid=True
2026-05-29T04:36:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:36:18.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:36:18.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:36:18.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:36:18.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:36:18.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:36:18.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:12, diff=6.34332s, valid=True
2026-05-29T04:36:18.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:36:18.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:36:18.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:36:18.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954820.344141s, valid=True
2026-05-29T04:36:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:36:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:36:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:36:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:36:18.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:36:18.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:36:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:36:18.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:36:18.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:36:18.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:36:18.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:36:18.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:36:18.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:36:18.675 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:36:18.888 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:36:19.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:36:19.331 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:36:19.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:36:19.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-29T04:36:19.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-29T04:36:19.528 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:36:19.528 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:36:49.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:36:49.532 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:36:49.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:36:49.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:36:49.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:36:50.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:36:50.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-29T04:36:50.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:36:50.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-29T04:36:50.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:36:50.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:36:50.170 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:36:50.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:36:52.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-29T04:36:52.653 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:36:52.661 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:36:52.662 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:36:52.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:36:52.673 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:36:52.685 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:36:52.686 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:36:52.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:36:52.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:36:52.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:36:52.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:36:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:36:52.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:36:52.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:36:52.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:36:52.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:36:52.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:36:52.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:36:53.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:36:53.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:36:53.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:36:53.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:36:53.012 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:36:53.075 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:36:41
2026-05-29T04:36:53.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70902, datetime.datetime(2026, 5, 29, 4, 36, 41), datetime.datetime(2026, 5, 29, 4, 36, 41), 'salt', 6.56, 86.59, None, 12.95, 106.3, 2.07, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:36:53.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:36:53.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:36:53.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:41, diff=12.083317s, valid=True
2026-05-29T04:36:53.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:36:53.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:36:53.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:12, diff=-18.913124s, valid=True
2026-05-29T04:36:53.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:36:53.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:36:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:36:41, diff=12.094631s, valid=True
2026-05-29T04:36:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:36:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:36:53.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:36:53.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:36:53.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:36:53.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:36:53.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:12, diff=-18.901779s, valid=True
2026-05-29T04:36:53.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:36:53.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:36:53.098 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:36:53.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954855.099009s, valid=True
2026-05-29T04:36:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:36:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:36:53.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:36:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:36:53.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:36:53.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:36:53.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:36:53.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:36:53.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:36:53.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:36:53.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:36:53.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:36:53.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:36:53.421 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:36:53.633 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:36:53.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:36:54.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:36:54.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:36:54.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-29T04:36:54.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-29T04:36:54.266 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:36:54.266 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:37:24.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:37:24.290 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:37:24.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:37:24.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:37:24.430 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:37:24.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:37:24.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-29T04:37:24.648 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:37:24.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-29T04:37:24.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:37:24.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:37:24.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:37:24.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-29T04:37:27.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-29T04:37:27.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:37:27.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:37:27.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:37:27.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:37:27.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:37:27.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:37:27.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:37:27.117 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:37:27.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:37:27.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:37:27.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:37:27.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:37:27.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:37:27.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:37:27.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:37:27.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:37:27.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:37:27.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:37:27.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:37:27.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:37:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:37:27.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:37:27.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:37:27.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:37:12
2026-05-29T04:37:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70903, datetime.datetime(2026, 5, 29, 4, 37, 12), datetime.datetime(2026, 5, 29, 4, 37, 11), 'salt', 6.72, 86.2, None, 10.62, 124.41, 2.13, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:37:27.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:37:27.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:37:27.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:11, diff=16.503172s, valid=True
2026-05-29T04:37:27.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:37:27.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:37:27.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:12, diff=15.50654s, valid=True
2026-05-29T04:37:27.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:37:27.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:11, diff=16.514432s, valid=True
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:37:27.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:37:27.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:12, diff=15.518055s, valid=True
2026-05-29T04:37:27.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:37:27.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:37:27.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:37:27.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954889.518843s, valid=True
2026-05-29T04:37:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:37:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:37:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:37:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:37:27.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:37:27.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:37:27.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:37:27.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:37:27.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:37:27.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:37:27.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:37:27.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:37:27.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:37:27.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:37:28.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:37:28.370 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:37:28.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:37:28.525 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:37:28.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-29T04:37:28.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-29T04:37:28.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:37:28.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:37:58.815 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:37:58.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:37:58.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:37:59.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:37:59.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:37:59.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:37:59.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-29T04:37:59.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:37:59.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-29T04:37:59.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:37:59.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:37:59.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:37:59.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-29T04:38:01.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-29T04:38:01.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:38:01.925 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:38:01.926 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:38:01.927 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:38:01.939 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:38:01.951 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:38:01.952 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:38:01.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:38:01.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:38:01.952 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:38:01.952 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:38:01.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:38:02.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:38:02.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:38:02.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:38:02.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:38:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:38:02.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:38:02.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:38:02.210 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:38:02.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:38:02.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:38:02.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:38:02.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:37:42
2026-05-29T04:38:02.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70904, datetime.datetime(2026, 5, 29, 4, 37, 42), datetime.datetime(2026, 5, 29, 4, 37, 42), 'salt', 6.62, 85.86, None, 10.27, 119.1, 2.19, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:38:02.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:38:02.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:38:02.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:42, diff=20.28239s, valid=True
2026-05-29T04:38:02.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:38:02.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:38:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:12, diff=-9.71442s, valid=True
2026-05-29T04:38:02.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:38:02.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:38:02.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:37:42, diff=20.292918s, valid=True
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:38:02.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:38:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:12, diff=-9.703716s, valid=True
2026-05-29T04:38:02.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:38:02.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:38:02.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:38:02.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954924.297027s, valid=True
2026-05-29T04:38:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:38:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:38:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:38:02.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:38:02.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:38:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:38:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:38:02.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:38:02.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:38:02.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:38:02.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:38:02.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:38:02.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:38:02.616 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:38:02.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:38:03.212 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:38:03.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:38:03.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:38:03.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-29T04:38:03.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-29T04:38:03.516 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:38:03.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:38:33.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:38:33.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:38:33.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:38:34.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:38:34.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:38:34.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:38:34.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:38:34.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:38:34.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:38:34.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:38:34.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:38:34.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:38:34.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-29T04:38:36.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-29T04:38:36.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:38:36.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:38:36.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:38:36.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:38:36.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:38:36.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:38:36.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:38:36.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:38:36.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:38:36.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:38:36.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:38:36.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:38:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:38:37.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:38:37.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:38:37.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:38:37.205 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:38:37.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:38:37.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:38:37.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:38:37.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:38:37.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:38:37.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:38:37.310 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:38:12
2026-05-29T04:38:37.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70905, datetime.datetime(2026, 5, 29, 4, 38, 12), datetime.datetime(2026, 5, 29, 4, 38, 12), 'salt', 6.79, 85.96, None, 10.16, 118.16, 2.18, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:38:37.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:38:37.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:38:37.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:12, diff=25.318178s, valid=True
2026-05-29T04:38:37.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:38:37.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:38:37.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:12, diff=25.321584s, valid=True
2026-05-29T04:38:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:38:37.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:38:37.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:11, diff=26.329556s, valid=True
2026-05-29T04:38:37.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:38:37.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:38:37.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:38:37.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:38:37.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:38:37.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:38:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:12, diff=25.333284s, valid=True
2026-05-29T04:38:37.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:38:37.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:38:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:38:37.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954959.334099s, valid=True
2026-05-29T04:38:37.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:38:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:38:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:38:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:38:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:38:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:38:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:38:37.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:38:37.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:38:37.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:38:37.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:38:37.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:38:37.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:38:37.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:38:37.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:38:38.257 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:38:38.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:38:38.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:38:38.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-29T04:38:38.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-29T04:38:38.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:38:38.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:39:08.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:39:08.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:39: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-29T04:39:09.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:39:09.253 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:39:09.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:39:09.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-29T04:39:09.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:39:09.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-29T04:39:09.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:39:09.505 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:39:09.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:39:09.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-29T04:39: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-29T04:39:11.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:39:11.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:39:11.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:39:11.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:39:11.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:39:12.001 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:39:12.002 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:39:12.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:39:12.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:39:12.003 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:39:12.003 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:39:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:39:12.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:39:12.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:39:12.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:39:12.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:39:12.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:39:12.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:39:12.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:39:12.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:39:12.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:39:12.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:39:12.318 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:39:12.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:38:42
2026-05-29T04:39:12.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70906, datetime.datetime(2026, 5, 29, 4, 38, 42), datetime.datetime(2026, 5, 29, 4, 38, 42), 'salt', 6.72, 85.8, None, 10.91, 120.44, 2.2, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:39:12.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:39:12.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:39:12.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:42, diff=30.384968s, valid=True
2026-05-29T04:39:12.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:39:12.385 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:39:12.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:39:12, diff=0.388358s, valid=True
2026-05-29T04:39:12.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:39:12.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:38:42, diff=30.396193s, valid=True
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:39:12.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:39:12.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:39:12, diff=0.399753s, valid=True
2026-05-29T04:39:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:39:12.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:39:12.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:39:12.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=954994.400526s, valid=True
2026-05-29T04:39:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:39:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:39:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:39:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:39:12.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:39:12.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:39:12.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:39:12.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:39:12.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:39:12.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:39:12.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:39:12.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:39:12.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:39:12.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:39:12.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:39:13.266 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:39:13.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:39:13.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:39:13.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-29T04:39:13.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-29T04:39:13.551 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:39:13.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:39:43.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:39:43.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:39:43.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:39:43.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:39:43.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:39:44.111 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:39:44.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-29T04:39:44.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:39:44.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-29T04:39:44.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:39:44.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:39:44.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:39:44.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-29T04:39:46.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-29T04:39:46.681 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:39:46.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:39:46.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:39:46.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:39:46.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:39:46.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:39:46.712 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:39:46.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:39:46.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:39:46.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:39:46.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:39:46.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:39:46.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:39:46.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:39:46.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:39:46.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:39:46.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:39:46.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:39:47.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:39:47.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:39:47.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:39:47.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:39:47.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:39:47.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:39:43
2026-05-29T04:39:47.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70908, datetime.datetime(2026, 5, 29, 4, 39, 43), datetime.datetime(2026, 5, 29, 4, 39, 43), 'salt', 6.59, 85.73, None, 12.42, 124.88, 2.21, 831.94, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:39:47.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:39:47.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:39:47.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:39:43, diff=4.10961s, valid=True
2026-05-29T04:39:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:39:47.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:39:47.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:12, diff=-24.887065s, valid=True
2026-05-29T04:39:47.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:39:47.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:39:42, diff=5.120509s, valid=True
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:39:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:39:47.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:39:47.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:12, diff=-24.875999s, valid=True
2026-05-29T04:39:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:39:47.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:39:47.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:39:47.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955029.124761s, valid=True
2026-05-29T04:39:47.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:39:47.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:39:47.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:39:47.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:39:47.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:39:47.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:39:47.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:39:47.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:39:47.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:39:47.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:39:47.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:39:47.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:39:47.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:39:47.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:39:47.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:39:48.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:39:48.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:39:48.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:39:48.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-29T04:39:48.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-29T04:39:48.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:39:48.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:40:18.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:40:18.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:40:18.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:40:18.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:40:18.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:40:18.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:40:18.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-29T04:40:18.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:40:18.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-29T04:40:18.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:40:18.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:40:18.845 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:40:18.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-29T04:40:22.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-29T04:40:22.066 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:40:22.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:40:22.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:40:22.074 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:40:22.085 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:40:22.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:40:22.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:40:22.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:40:22.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:40:22.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:40:22.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:40:22.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:40:22.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:40:22.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:40:22.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:40:22.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:40:22.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:40:22.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:40:22.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:40:22.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:40:22.447 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:40:22.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:40:22.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:40:22.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:40:13
2026-05-29T04:40:22.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70909, datetime.datetime(2026, 5, 29, 4, 40, 13), datetime.datetime(2026, 5, 29, 4, 40, 13), 'salt', 6.46, 85.7, None, 12.18, 127.25, 2.22, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:40:22.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:40:22.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:40:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:13, diff=9.531361s, valid=True
2026-05-29T04:40:22.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:40:22.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:40:22.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:12, diff=10.534881s, valid=True
2026-05-29T04:40:22.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:40:22.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:12, diff=10.54309s, valid=True
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:40:22.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:40:22.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:12, diff=10.546909s, valid=True
2026-05-29T04:40:22.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:40:22.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:40:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:40:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955064.547743s, valid=True
2026-05-29T04:40:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:40:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:40:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:40:22.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:40:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:40:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:40:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:40:22.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:40:22.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:40:22.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:40:22.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:40:22.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:40:22.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:40:22.872 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:40:23.072 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:40:23.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:40:23.500 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:40:23.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:40:23.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-29T04:40:23.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-29T04:40:23.690 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:40:23.690 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:40:53.704 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:40:53.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:40:53.704 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:40:53.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:40:53.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:40:54.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:40:54.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:40:54.079 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:40:54.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-29T04:40:54.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:40:54.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:40:54.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:40:54.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-29T04:40:56.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-29T04:40:56.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:40:56.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:40:56.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:40:56.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:40:56.530 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:40:56.543 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:40:56.544 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:40:56.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:40:56.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:40:56.545 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:40:56.545 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:40:56.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:40:56.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:40:56.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:40:56.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:40:56.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:40:56.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:40:56.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:40:56.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:40:56.878 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:40:56.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:40:56.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:40:56.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:40:56.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:40:44
2026-05-29T04:40:56.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70910, datetime.datetime(2026, 5, 29, 4, 40, 44), datetime.datetime(2026, 5, 29, 4, 40, 43), 'salt', 6.56, 85.8, None, 11.93, 124.27, 2.2, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:40:56.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:40:56.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:40:56.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:43, diff=13.959862s, valid=True
2026-05-29T04:40:56.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:40:56.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:40:56.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:12, diff=-15.0367s, valid=True
2026-05-29T04:40:56.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:40:56.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:40:43, diff=13.971344s, valid=True
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:40:56.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:40:56.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:12, diff=-15.024974s, valid=True
2026-05-29T04:40:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:40:56.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:40:56.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:40:56.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955098.97584s, valid=True
2026-05-29T04:40:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:40:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:40:56.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:40:56.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:40:56.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:40:57.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:40:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:40:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:40:57.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:40:57.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:40:57.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:40:57.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:40:57.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:40:57.374 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:40:57.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:40:57.919 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:40:58.020 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:40:58.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:40:58.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-29T04:40:58.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-29T04:40:58.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:40:58.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:41:28.226 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:41:28.226 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:41:28.226 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:41:28.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:41:28.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:41:28.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:41:28.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-29T04:41:28.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:41:28.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-29T04:41:28.785 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:41:28.785 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:41:28.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:41:28.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-29T04:41:31.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-29T04:41:31.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:41:31.469 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:41:31.469 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:41:31.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:41:31.478 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:41:31.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:41:31.491 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:41:31.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:41:31.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:41:31.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:41:31.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:41:31.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:41:31.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:41:31.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:41:31.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:41:31.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:41:31.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:41:31.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:41:31.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:41:31.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:41:31.761 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:41:31.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:41:31.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:41:31.834 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:41:14
2026-05-29T04:41:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70911, datetime.datetime(2026, 5, 29, 4, 41, 14), datetime.datetime(2026, 5, 29, 4, 41, 13), 'salt', 6.46, 85.86, None, 10.45, 125.96, 2.19, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:41:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:41:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:41:31.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:13, diff=18.841122s, valid=True
2026-05-29T04:41:31.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:41:31.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:41:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:12, diff=19.844363s, valid=True
2026-05-29T04:41:31.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:41:31.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:41:31.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:13, diff=18.85192s, valid=True
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:41:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:41:31.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:12, diff=19.855345s, valid=True
2026-05-29T04:41:31.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:41:31.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:41:31.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:41:31.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955133.856108s, valid=True
2026-05-29T04:41:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:41:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:41:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:41:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:41:31.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:41:31.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:41:31.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:41:31.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:41:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:41:31.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:41:32.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:41:32.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:41:32.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:41:32.177 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:41:32.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:41:32.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:41:32.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:41:32.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:41:32.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-29T04:41:32.828 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:41:33.010 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:41:33.010 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:42:03.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:42:03.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:42:03.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:42:03.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:42:03.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:42:03.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:42:03.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-29T04:42:03.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:42:03.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-29T04:42:03.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:42:03.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:42:03.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:42:03.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-29T04:42:05.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-29T04:42:05.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:42:05.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:42:05.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:42:05.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:42:05.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:42:05.966 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:42:05.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:42:05.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:42:05.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:42:05.968 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:42:05.968 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:42:05.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:42:06.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:42:06.107 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:42:06.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:42:06.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:42:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:42:06.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:42:06.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:42:06.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:42:06.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:42:06.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:42:06.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:42:06.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:41:44
2026-05-29T04:42:06.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70912, datetime.datetime(2026, 5, 29, 4, 41, 44), datetime.datetime(2026, 5, 29, 4, 41, 44), 'salt', 6.46, 85.86, None, 12.77, 124.22, 2.19, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:42:06.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:42:06.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:42:06.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:44, diff=22.388353s, valid=True
2026-05-29T04:42:06.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:42:06.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:42:06.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:12, diff=-5.608064s, valid=True
2026-05-29T04:42:06.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:42:06.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:41:44, diff=22.400052s, valid=True
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:42:06.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:42:06.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:12, diff=-5.596225s, valid=True
2026-05-29T04:42:06.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:42:06.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:42:06.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:42:06.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955168.404585s, valid=True
2026-05-29T04:42:06.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:42:06.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:42:06.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:42:06.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:42:06.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:42:06.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:42:06.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:42:06.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:42:06.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:42:06.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:42:06.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:42:06.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:42:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:42:06.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:42:06.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:42:07.333 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:42:07.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:42:07.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:42:07.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-29T04:42:07.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-29T04:42:07.620 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:42:07.620 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:42:37.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:42:37.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:42:37.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:42:37.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:42:37.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04: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-29T04: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-29T04:42:38.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:42:38.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-29T04:42:38.212 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:42:38.212 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:42:38.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:42:38.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-29T04:42:41.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-29T04:42:41.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:42:41.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:42:41.217 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:42:41.217 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:42:41.227 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:42:41.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:42:41.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:42:41.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:42:41.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:42:41.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:42:41.242 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:42:41.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:42:41.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:42:41.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:42:41.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:42:41.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:42:41.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:42:41.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:42:41.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:42:41.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:42:41.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:42:41.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:42:41.583 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:42:41.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:42:14
2026-05-29T04:42:41.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70913, datetime.datetime(2026, 5, 29, 4, 42, 14), datetime.datetime(2026, 5, 29, 4, 42, 14), 'salt', 6.36, 85.9, None, 12.56, 122.29, 2.18, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:42:41.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:42:41.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:42:41.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:14, diff=27.663015s, valid=True
2026-05-29T04:42:41.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:42:41.663 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:42:41.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:12, diff=29.666591s, valid=True
2026-05-29T04:42:41.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:42:41.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:42:41.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:14, diff=27.674925s, valid=True
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:42:41.675 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:42:41.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:42:12, diff=29.678741s, valid=True
2026-05-29T04:42:41.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:42:41.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:42:41.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:42:41.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955203.679558s, valid=True
2026-05-29T04:42:41.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:42:41.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:42:41.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:42:41.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:42:41.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:42:41.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:42:41.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:42:41.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:42:41.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:42:41.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:42:41.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:42:41.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:42:41.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:42:42.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:42:42.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:42:42.540 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:42:42.640 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:42:42.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:42:42.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-29T04:42:42.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-29T04:42:44.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:42:44.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:43:14.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:43:14.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:43:14.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:43:14.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:43:14.566 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:43:14.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:43:14.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-29T04:43:14.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:43:14.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:43:14.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:43:14.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:43:14.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:43:14.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-29T04:43:18.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-29T04:43:18.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:43:18.033 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:43:18.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:43:18.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:43:18.044 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:43:18.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:43:18.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:43:18.056 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:43:18.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:43:18.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:43:18.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:43:18.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:43:18.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:43:18.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:43:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:43:18.284 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:43:18.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:43:18.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:43:18.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:43:18.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:43:18.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:43:18.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:43:18.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:43:18.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:43:15
2026-05-29T04:43:18.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70915, datetime.datetime(2026, 5, 29, 4, 43, 15), datetime.datetime(2026, 5, 29, 4, 43, 14), 'salt', 6.46, 85.86, None, 12.21, 123.09, 2.19, 831.82, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:43:18.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:43:18.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:43:18.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:14, diff=4.449524s, valid=True
2026-05-29T04:43:18.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:43:18.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:43:18.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:12, diff=6.452936s, valid=True
2026-05-29T04:43:18.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:43:18.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:43:18.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:15, diff=3.460716s, valid=True
2026-05-29T04:43:18.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:43:18.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:43:18.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:43:18.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:43:18.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:43:18.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:43:18.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:12, diff=6.464274s, valid=True
2026-05-29T04:43:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:43:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:43:18.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:43:18.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955240.46506s, valid=True
2026-05-29T04:43:18.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:43:18.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:43:18.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:43:18.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:43:18.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:43:18.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:43:18.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:43:18.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:43:18.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:43:18.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:43:18.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:43:18.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:43:18.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:43:18.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:43:18.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:43:19.324 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:43:19.422 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:43:19.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:43:19.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-29T04:43:19.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-29T04:43:19.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:43:19.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:43:49.654 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:43:49.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:43:49.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:43:49.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:43:49.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:43:50.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:43:50.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-29T04:43:50.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:43:50.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-29T04:43:50.150 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:43:50.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:43:50.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:43:50.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-29T04:43:52.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-29T04:43:52.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:43:52.596 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:43:52.597 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:43:52.597 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:43:52.605 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:43:52.618 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:43:52.618 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:43:52.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:43:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:43:52.619 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:43:52.620 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:43:52.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:43:52.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:43:52.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:43:52.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:43:52.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:43:52.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:43:52.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:43:52.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:43:52.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:43:52.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:43:52.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:43:52.951 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:43:53.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:43:45
2026-05-29T04:43:53.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70916, datetime.datetime(2026, 5, 29, 4, 43, 45), datetime.datetime(2026, 5, 29, 4, 43, 45), 'salt', 6.39, 85.8, None, 12.03, 124.08, 2.2, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:43:53.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:43:53.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:43:53.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:45, diff=8.021204s, valid=True
2026-05-29T04:43:53.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:43:53.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:43:53.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:12, diff=-18.975289s, valid=True
2026-05-29T04:43:53.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:43:53.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:43:53.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:43:45, diff=8.032825s, valid=True
2026-05-29T04:43:53.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:43:53.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:43:53.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:43:53.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:43:53.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:43:53.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:43:53.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:12, diff=-18.963458s, valid=True
2026-05-29T04:43:53.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:43:53.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:43:53.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:43:53.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955275.037363s, valid=True
2026-05-29T04:43:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:43:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:43:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:43:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:43:53.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:43:53.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:43:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:43:53.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:43:53.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:43:53.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:43:53.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:43:53.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:43:53.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:43:53.363 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:43:53.566 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:43:53.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:43:54.060 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:43:54.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:43:54.060 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:43:54.060 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:43:54.268 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:43:54.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:44:24.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:44:24.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:44:24.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:44:24.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:44:24.625 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:44:24.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:44:24.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-29T04:44:24.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:44:24.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-29T04:44:24.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:44:24.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:44:24.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:44:24.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-29T04:44:27.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-29T04:44:27.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:44:27.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:44:27.292 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:44:27.292 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:44:27.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:44:27.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:44:27.316 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:44:27.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:44:27.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:44:27.317 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:44:27.317 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:44:27.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:44:27.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:44:27.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:44:27.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:44:27.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:44:27.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:44:27.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:44:27.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:44:27.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:44:27.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:44:27.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:44:27.644 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:44:27.702 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:44:15
2026-05-29T04:44:27.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70917, datetime.datetime(2026, 5, 29, 4, 44, 15), datetime.datetime(2026, 5, 29, 4, 44, 14), 'salt', 6.39, 85.8, None, 13.69, 117.31, 2.2, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:44:27.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:44:27.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:44:27.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:14, diff=13.710206s, valid=True
2026-05-29T04:44:27.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:44:27.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:44:27.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:12, diff=15.713604s, valid=True
2026-05-29T04:44:27.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:44:27.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:44:27.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:15, diff=12.72156s, valid=True
2026-05-29T04:44:27.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:44:27.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:44:27.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:44:27.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:44:27.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:44:27.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:44:27.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:12, diff=15.725186s, valid=True
2026-05-29T04:44:27.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:44:27.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:44:27.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:44:27.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955309.726005s, valid=True
2026-05-29T04:44:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:44:27.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:44:27.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:44:27.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:44:27.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:44:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:44:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:44:27.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:44:27.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:44:27.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:44:27.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:44:27.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:44:28.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:44:28.052 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:44:28.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:44:28.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:44:28.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:44:28.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:44:28.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-29T04:44:28.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-29T04:44:28.784 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:44:28.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:44:58.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:44:58.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:44:58.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:44:58.961 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:44:58.975 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:44:59.180 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:44:59.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-29T04:44:59.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:44:59.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-29T04:44:59.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:44:59.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:44:59.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:44:59.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:45:02.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-29T04:45:02.123 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:45:02.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:45:02.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:45:02.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:45:02.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:45:02.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:45:02.145 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:45:02.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:45:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:45:02.146 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:45:02.146 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:45:02.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:45:02.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:45:02.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:45:02.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:45:02.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:45:02.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:45:02.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:45:02.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:45:02.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:45:02.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:45:02.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:45:02.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:45:02.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:44:46
2026-05-29T04:45:02.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70918, datetime.datetime(2026, 5, 29, 4, 44, 46), datetime.datetime(2026, 5, 29, 4, 44, 45), 'salt', 6.36, 85.8, None, 13.27, 124.88, 2.2, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:45:02.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:45:02.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:45:02.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:45, diff=17.4598s, valid=True
2026-05-29T04:45:02.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:45:02.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:45:02.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:12, diff=-9.537292s, valid=True
2026-05-29T04:45:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:45:02.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:44:45, diff=17.469325s, valid=True
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:45:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:45:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:12, diff=-9.527626s, valid=True
2026-05-29T04:45:02.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:45:02.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:45:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:45:02.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955344.473044s, valid=True
2026-05-29T04:45:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:45:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:45:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:45:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:45:02.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:45:02.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:45:02.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:45:02.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:45:02.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:45:02.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:45:02.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:45:02.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:45:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:45:02.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:45:03.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:45:03.512 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:45:03.610 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:45:03.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:45:03.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-29T04:45:03.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-29T04:45:03.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:45:03.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:45:33.854 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:45:33.854 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:45:33.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:45:34.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:45:34.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:45:34.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:45:34.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-29T04:45:34.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:45:34.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-29T04:45:34.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:45:34.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:45:34.421 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:45:34.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-29T04:45:36.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-29T04:45:36.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:45:36.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:45:36.882 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:45:36.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:45:36.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:45:36.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:45:36.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:45:36.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:45:36.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:45:36.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:45:36.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:45:36.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:45:37.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:45:37.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:45:37.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:45:37.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:45:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:45:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:45:37.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:45:37.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:45:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:45:37.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:45:37.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:45:37.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:45:16
2026-05-29T04:45:37.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70919, datetime.datetime(2026, 5, 29, 4, 45, 16), datetime.datetime(2026, 5, 29, 4, 45, 15), 'salt', 6.39, 85.73, None, 13.23, 123.61, 2.21, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:45:37.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:45:37.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:45:37.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:15, diff=22.321199s, valid=True
2026-05-29T04:45:37.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:45:37.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:45:37.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:12, diff=25.324733s, valid=True
2026-05-29T04:45:37.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:45:37.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:15, diff=22.33298s, valid=True
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:45:37.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:45:37.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:12, diff=25.336755s, valid=True
2026-05-29T04:45:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:45:37.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:45:37.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:45:37.337 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955379.33758s, valid=True
2026-05-29T04:45:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:45:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:45:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:45:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:45:37.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:45:37.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:45:37.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:45:37.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:45:37.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:45:37.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:45:37.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:45:37.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:45:37.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:45:37.662 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:45:37.865 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:45:38.200 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:45:38.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:45:38.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:45:38.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-29T04:45:38.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-29T04:45:38.392 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:45:38.392 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:46:08.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:46:08.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:46:08.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:46:08.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:46:08.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:46:08.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:46:08.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:46:08.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:46:08.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-29T04:46:08.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:46:08.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:46:08.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:46:08.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-29T04:46:11.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-29T04:46:11.410 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:46:11.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:46:11.418 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:46:11.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:46:11.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:46:11.442 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:46:11.443 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:46:11.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:46:11.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:46:11.444 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:46:11.444 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:46:11.452 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:46:11.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:46:11.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:46:11.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:46:11.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:46:11.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:46:11.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:46:11.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:46:11.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:46:11.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:46:11.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:46:11.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:46:11.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:45:46
2026-05-29T04:46:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70920, datetime.datetime(2026, 5, 29, 4, 45, 46), datetime.datetime(2026, 5, 29, 4, 45, 46), 'salt', 6.42, 85.76, None, 14.75, 124.78, 2.2, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:46:11.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:46:11.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:46:11.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:46, diff=25.83897s, valid=True
2026-05-29T04:46:11.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:46:11.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:46:11.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:12, diff=-0.157615s, valid=True
2026-05-29T04:46:11.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:46:11.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:45:46, diff=25.850308s, valid=True
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:46:11.850 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:46:11.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:12, diff=-0.146017s, valid=True
2026-05-29T04:46:11.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:46:11.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:46:11.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:46:11.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955413.854784s, valid=True
2026-05-29T04:46:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:46:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:46:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:46:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:46:11.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:46:11.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:46:11.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:46:11.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:46:11.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:46:11.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:46:12.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:46:12.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:46:12.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:46:12.254 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:46:12.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:46:12.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:46:12.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:46:12.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:46:12.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:46:12.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-29T04:46:13.104 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:46:13.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:46:43.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:46:43.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:46:43.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:46:43.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:46:43.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:46:43.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:46:43.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-29T04:46:43.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:46:43.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-29T04:46:43.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:46:43.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:46:43.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:46:43.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-29T04:46:46.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-29T04:46:46.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:46:46.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:46:46.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:46:46.549 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:46:46.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:46:46.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:46:46.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:46:46.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:46:46.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:46:46.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:46:46.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:46:46.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:46:46.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:46:46.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:46:46.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:46:46.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:46:46.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:46:46.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:46:46.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:46:46.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:46:46.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:46:46.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:46:46.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:46:46.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:46:16
2026-05-29T04:46:46.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70921, datetime.datetime(2026, 5, 29, 4, 46, 16), datetime.datetime(2026, 5, 29, 4, 46, 16), 'salt', 6.42, 85.66, None, 14.79, 126.8, 2.22, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:46:46.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:46:46.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:46:46.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:16, diff=30.966203s, valid=True
2026-05-29T04:46:46.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:46:46.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:46:46.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:12, diff=34.9696s, valid=True
2026-05-29T04:46:46.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:46:46.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:16, diff=30.977411s, valid=True
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:46:46.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:46:46.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:46:12, diff=34.980995s, valid=True
2026-05-29T04:46:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:46:46.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:46:46.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:46:46.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955448.981803s, valid=True
2026-05-29T04:46:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:46:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:46:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:46:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:46:46.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:46:47.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:46:47.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:46:47.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:46:47.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:46:47.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:46:47.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:46:47.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:46:47.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:46:47.304 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:46:47.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:46:47.838 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:46:47.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:46:47.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:46:47.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-29T04:46:47.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-29T04:46:48.120 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:46:48.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:47:18.150 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:47:18.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:47:18.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:47:18.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:47:18.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:47:18.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:47:18.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-29T04:47:18.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:47:18.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-29T04:47:18.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:47:18.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:47:18.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:47:18.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-29T04:47: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-29T04:47:21.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:47:21.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:47:21.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:47:21.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:47:22.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:47:22.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:47:22.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:47:22.021 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:47:22.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:47:22.022 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:47:22.022 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:47:22.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:47:22.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:47:22.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:47:22.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:47:22.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:47:22.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:47:22.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:47:22.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:47:22.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:47:22.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:47:22.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:47:22.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:47:22.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:47:17
2026-05-29T04:47:22.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70923, datetime.datetime(2026, 5, 29, 4, 47, 17), datetime.datetime(2026, 5, 29, 4, 47, 17), 'salt', 6.32, 85.47, None, 13.13, 119.1, 2.25, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:47:22.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:47:22.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:47:22.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:17, diff=5.376288s, valid=True
2026-05-29T04:47:22.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:47:22.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:47:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:12, diff=10.379612s, valid=True
2026-05-29T04:47:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:47:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:17, diff=5.387318s, valid=True
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:47:22.387 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:47:22.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:12, diff=10.390832s, valid=True
2026-05-29T04:47:22.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:47:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:47:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:47:22.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955484.391589s, valid=True
2026-05-29T04:47:22.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:47:22.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:47:22.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:47:22.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:47:22.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:47:22.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:47:22.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:47:22.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:47:22.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:47:22.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:47:22.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:47:22.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:47:22.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:47:22.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:47:22.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:47:23.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:47:23.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:47:23.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:47:23.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-29T04:47:23.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-29T04:47:23.653 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:47:23.653 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:47:53.673 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:47:53.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:47:53.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:47:54.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:47:54.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:47:54.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:47:54.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-29T04:47:54.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:47:54.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:47:54.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:47:54.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:47:54.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:47:54.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-29T04:47:56.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-29T04:47:56.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:47:56.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:47:56.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:47:56.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:47:56.949 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:47:56.962 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:47:56.963 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:47:56.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:47:56.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:47:56.964 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:47:56.964 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:47:56.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:47:57.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:47:57.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:47:57.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:47:57.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:47:57.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:47:57.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:47:57.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:47:57.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:47:57.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:47:57.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:47:57.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:47:57.348 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:47:47
2026-05-29T04:47:57.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70924, datetime.datetime(2026, 5, 29, 4, 47, 47), datetime.datetime(2026, 5, 29, 4, 47, 47), 'salt', 6.32, 85.27, None, 13.59, 118.91, 2.28, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:47:57.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:47:57.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:47:57.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:47, diff=10.356152s, valid=True
2026-05-29T04:47:57.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:47:57.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:47:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:12, diff=-14.640417s, valid=True
2026-05-29T04:47:57.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:47:57.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:47:47, diff=10.367455s, valid=True
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:47:57.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:47:57.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:12, diff=-14.628909s, valid=True
2026-05-29T04:47:57.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:47:57.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:47:57.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:47:57.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955519.371892s, valid=True
2026-05-29T04:47:57.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:47:57.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:47:57.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:47:57.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:47:57.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:47:57.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:47:57.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:47:57.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:47:57.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:47:57.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:47:57.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:47:57.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:47:57.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:47:57.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:47:57.894 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:47:58.226 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:47:58.323 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:47:58.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:47:58.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-29T04:47:58.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-29T04:47:58.520 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:47:58.520 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:48:28.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:48:28.542 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:48:28.543 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:48:28.695 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:48:28.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:48:28.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:48:28.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:48:28.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:48:28.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-29T04:48:28.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:48:28.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:48:28.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:48:28.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:48:31.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-29T04:48:31.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:48:31.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:48:31.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:48:31.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:48:31.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:48:31.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:48:31.529 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:48:31.529 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:48:31.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:48:31.529 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:48:31.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:48:31.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:48:31.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:48:31.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:48:31.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:48:31.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:48:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:48:31.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:48:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:48:31.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:48:31.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:48:31.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:48:31.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:48:31.916 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:48:17
2026-05-29T04:48:31.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70925, datetime.datetime(2026, 5, 29, 4, 48, 17), datetime.datetime(2026, 5, 29, 4, 48, 16), 'salt', 6.36, 85.1, None, 14.54, 124.22, 2.32, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:48:31.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:48:31.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:48:31.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:16, diff=15.924072s, valid=True
2026-05-29T04:48:31.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:48:31.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:48:31.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:12, diff=19.92748s, valid=True
2026-05-29T04:48:31.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:48:31.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:17, diff=14.935511s, valid=True
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:48:31.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:48:31.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:48:31.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:12, diff=19.939144s, valid=True
2026-05-29T04:48:31.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:48:31.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:48:31.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:48:31.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955553.93994s, valid=True
2026-05-29T04:48:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:48:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:48:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:48:31.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:48:31.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:48:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:48:32.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:48:32.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:48:32.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:48:32.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:48:32.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:48:32.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:48:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:48:32.333 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:48:32.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:48:32.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:48:32.992 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:48:32.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:48:32.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-29T04:48:32.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-29T04:48:33.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:48:33.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:49:03.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:49:03.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:49:03.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:49:04.270 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:49:04.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:49:04.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:49:04.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-29T04:49:04.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:49:04.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-29T04:49:04.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:49:04.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:49:04.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:49:04.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-29T04:49:07.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-29T04:49:07.675 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:49:07.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:49:07.683 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:49:07.684 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:49:07.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:49:07.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:49:07.708 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:49:07.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:49:07.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:49:07.709 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:49:07.709 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:49:07.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:49:07.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:49:07.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:49:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:49:07.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:49:07.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:49:07.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:49:08.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:49:08.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:49:08.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:49:08.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:49:08.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:49:08.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:48:48
2026-05-29T04:49:08.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70926, datetime.datetime(2026, 5, 29, 4, 48, 48), datetime.datetime(2026, 5, 29, 4, 48, 46), 'salt', 6.49, 84.97, None, 13.59, 119.36, 2.34, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:49:08.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:49:08.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:49:08.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:46, diff=22.098977s, valid=True
2026-05-29T04:49:08.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:49:08.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:49:08.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:12, diff=-3.897606s, valid=True
2026-05-29T04:49:08.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:49:08.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:48:47, diff=21.110351s, valid=True
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:49:08.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:49:08.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:12, diff=-3.886023s, valid=True
2026-05-29T04:49:08.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:49:08.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:49:08.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:49:08.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955590.11479s, valid=True
2026-05-29T04:49:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:49:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:49:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:49:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:49:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:49:08.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:49:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:49:08.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:49:08.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:49:08.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:49:08.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:49:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:49:08.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:49:08.435 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:49:08.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:49:08.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:49:09.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:49:09.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:49:09.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-29T04:49:09.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-29T04:49:09.263 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:49:09.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:49:39.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:49:39.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:49:39.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:49:39.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:49:39.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:49:39.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:49:39.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-29T04:49:39.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:49:39.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-29T04:49:39.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:49:39.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:49:39.903 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:49:39.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-29T04:49:42.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-29T04:49:42.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:49:42.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:49:42.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:49:42.358 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:49:42.368 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:49:42.381 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:49:42.381 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:49:42.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:49:42.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:49:42.382 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:49:42.383 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:49:42.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:49:42.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:49:42.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:49:42.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:49:42.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:49:42.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:49:42.658 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:49:42.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:49:42.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:49:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:49:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:49:42.704 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:49:42.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:49:18
2026-05-29T04:49:42.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70927, datetime.datetime(2026, 5, 29, 4, 49, 18), datetime.datetime(2026, 5, 29, 4, 49, 18), 'salt', 6.42, 84.97, None, 13.34, 126.31, 2.33, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:49:42.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:49:42.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:49:42.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:18, diff=24.772419s, valid=True
2026-05-29T04:49:42.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:49:42.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:49:42.775 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:12, diff=30.77585s, valid=True
2026-05-29T04:49:42.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:49:42.776 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:49:42.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:17, diff=25.783584s, valid=True
2026-05-29T04:49:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:49:42.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:49:42.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:49:42.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:49:42.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:49:42.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:49:42.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:12, diff=30.787179s, valid=True
2026-05-29T04:49:42.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:49:42.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:49:42.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:49:42.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955624.787958s, valid=True
2026-05-29T04:49:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:49:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:49:42.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:49:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:49:42.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:49:42.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:49:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:49:42.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:49:42.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:49:42.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:49:42.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:49:43.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:49:43.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:49:43.112 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:49:43.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:49:43.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:49:43.828 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:49:43.829 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:49:43.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-29T04:49:43.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-29T04:49:43.921 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:49:43.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:50:13.927 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:50:13.928 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:50:13.928 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:50:14.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:50:14.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:50:14.467 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:50:14.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-29T04:50:14.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:50:14.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-29T04:50:14.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:50:14.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:50:14.504 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:50:14.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-29T04:50:16.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-29T04:50:16.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:50:16.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:50:16.985 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:50:16.985 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:50:16.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:50:17.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:50:17.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:50:17.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:50:17.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:50:17.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:50:17.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:50:17.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:50:17.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:50:17.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:50:17.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:50:17.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:50:17.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:50:17.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:50:17.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:50:17.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:50:17.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:50:17.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:50:17.331 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:50:17.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:49:48
2026-05-29T04:50:17.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70928, datetime.datetime(2026, 5, 29, 4, 49, 48), datetime.datetime(2026, 5, 29, 4, 49, 48), 'salt', 6.69, 84.87, None, 14.05, 125.25, 2.36, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:50:17.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:50:17.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:50:17.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:48, diff=29.400967s, valid=True
2026-05-29T04:50:17.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:50:17.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:50:17.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:50:12, diff=5.404366s, valid=True
2026-05-29T04:50:17.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:50:17.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:49:48, diff=29.41203s, valid=True
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:50:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:50:17.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:50:12, diff=5.415579s, valid=True
2026-05-29T04:50:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:50:17.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:50:17.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:50:17.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955659.416353s, valid=True
2026-05-29T04:50:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:50:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:50:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:50:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:50:17.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:50:17.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:50:17.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:50:17.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:50:17.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:50:17.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:50:17.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:50:17.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:50:17.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:50:17.739 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:50:17.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:50:18.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:50:18.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:50:18.386 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:50:18.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-29T04:50:18.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-29T04:50:18.585 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:50:18.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:50:48.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:50:48.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:50:48.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:50:48.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:50:48.942 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:50:49.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:50:49.201 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T04:50:49.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:50:49.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-29T04:50:49.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:50:49.224 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:50:49.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:50:49.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-29T04:50:51.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-29T04:50:51.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:50:51.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:50:51.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:50:51.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:50:51.674 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:50:51.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:50:51.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:50:51.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:50:51.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:50:51.690 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:50:51.690 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:50:51.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:50:51.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:50:51.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:50:51.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:50:51.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:50:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:50:51.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:50:52.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:50:52.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:50:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:50:52.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:50:52.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:50:52.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:50:49
2026-05-29T04:50:52.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70930, datetime.datetime(2026, 5, 29, 4, 50, 49), datetime.datetime(2026, 5, 29, 4, 50, 48), 'salt', 6.66, 84.6, None, 14.86, 123.61, 2.41, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:50:52.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:50:52.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:50:52.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:50:48, diff=4.093028s, valid=True
2026-05-29T04:50:52.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:50:52.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:50:52.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:12, diff=-19.904107s, valid=True
2026-05-29T04:50:52.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:50:52.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:50:48, diff=4.102531s, valid=True
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:50:52.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:50:52.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:50:52.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:12, diff=-19.894431s, valid=True
2026-05-29T04:50:52.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:50:52.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:50:52.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:50:52.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955694.106309s, valid=True
2026-05-29T04:50:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:50:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:50:52.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:50:52.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:50:52.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:50:52.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:50:52.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:50:52.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:50:52.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:50:52.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:50:52.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:50:52.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:50:52.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:50:52.423 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:50:52.634 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:50:52.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:50:53.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:50:53.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:50:53.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-29T04:50:53.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-29T04:50:53.329 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:50:53.329 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:51:23.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:51:23.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:51:23.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:51:23.678 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:51:23.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:51:23.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:51:23.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-29T04:51:23.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:51:23.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-29T04:51:23.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:51:23.931 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:51:23.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:51:23.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-29T04:51:26.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-29T04:51:26.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:51:26.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:51:26.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:51:26.374 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:51:26.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:51:26.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:51:26.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:51:26.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:51:26.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:51:26.398 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:51:26.398 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:51:26.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:51:26.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:51:26.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:51:26.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:51:26.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:51:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:51:26.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:51:26.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:51:26.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:51:26.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:51:26.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:51:26.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:51:26.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:51:19
2026-05-29T04:51:26.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70931, datetime.datetime(2026, 5, 29, 4, 51, 19), datetime.datetime(2026, 5, 29, 4, 51, 19), 'salt', 6.66, 84.54, None, 15.7, 123.66, 2.42, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:51:26.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:51:26.730 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:51:26.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:19, diff=7.737052s, valid=True
2026-05-29T04:51:26.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:51:26.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:51:26.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:12, diff=14.740235s, valid=True
2026-05-29T04:51:26.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:51:26.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:51:26.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:19, diff=7.747686s, valid=True
2026-05-29T04:51:26.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:51:26.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:51:26.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:51:26.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:51:26.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:51:26.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:51:26.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:12, diff=14.751088s, valid=True
2026-05-29T04:51:26.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:51:26.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:51:26.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:51:26.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955728.751847s, valid=True
2026-05-29T04:51:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:51:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:51:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:51:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:51:26.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:51:26.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:51:26.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:51:26.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:51:26.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:51:26.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:51:26.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:51:26.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:51:27.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:51:27.073 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:51:27.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:51:27.688 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:51:27.789 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:51:27.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:51:27.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-29T04:51:27.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-29T04:51:28.054 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:51:28.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:51:58.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:51:58.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:51:58.085 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:51:58.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:51:58.402 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:51:58.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:51:58.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-29T04:51:58.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:51:58.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-29T04:51:58.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:51:58.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:51:58.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:51:58.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-29T04:52:01.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-29T04:52:01.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:52:01.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:52:01.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:52:01.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:52:01.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:52:01.702 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:52:01.702 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:52:01.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:52:01.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:52:01.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:52:01.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:52:01.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:52:01.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:52:01.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:52:01.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:52:01.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:52:01.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:52:01.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:52:01.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:52:01.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:52:01.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:52:01.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:52:01.989 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:52:02.051 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:51:49
2026-05-29T04:52:02.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70932, datetime.datetime(2026, 5, 29, 4, 51, 49), datetime.datetime(2026, 5, 29, 4, 51, 49), 'salt', 6.59, 84.27, None, 13.13, 126.69, 2.46, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:52:02.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:52:02.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:52:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:49, diff=13.058134s, valid=True
2026-05-29T04:52:02.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:52:02.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:52:02.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:12, diff=-9.938602s, valid=True
2026-05-29T04:52:02.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:52:02.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:51:48, diff=14.068983s, valid=True
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:52:02.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:52:02.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:12, diff=-9.927509s, valid=True
2026-05-29T04:52:02.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:52:02.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:52:02.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:52:02.073 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955764.07327s, valid=True
2026-05-29T04:52:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:52:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:52:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:52:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:52:02.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:52:02.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:52:02.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:52:02.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:52:02.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:52:02.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:52:02.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:52:02.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:52:02.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:52:02.394 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:52:02.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:52:02.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:52:03.081 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:52:03.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:52:03.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-29T04:52:03.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-29T04:52:03.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:52:03.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:52:33.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:52:33.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:52:33.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:52:33.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:52:33.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:52:33.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:52:33.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-29T04:52:33.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:52:33.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-29T04:52:33.891 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:52:33.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:52:33.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:52:33.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-29T04:52:36.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-29T04:52:36.290 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:52:36.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:52:36.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:52:36.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:52:36.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:52:36.321 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:52:36.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:52:36.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:52:36.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:52:36.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:52:36.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:52:36.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:52:36.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:52:36.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:52:36.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:52:36.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:52:36.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:52:36.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:52:36.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:52:36.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:52:36.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:52:36.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:52:36.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:52:36.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:52:20
2026-05-29T04:52:36.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70933, datetime.datetime(2026, 5, 29, 4, 52, 20), datetime.datetime(2026, 5, 29, 4, 52, 19), 'salt', 6.59, 84.24, None, 13.27, 123.89, 2.46, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:52:36.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:52:36.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:52:36.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:19, diff=17.714228s, valid=True
2026-05-29T04:52:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:52:36.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:52:36.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:12, diff=24.717684s, valid=True
2026-05-29T04:52:36.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:52:36.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:19, diff=17.725501s, valid=True
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:52:36.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:52:36.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:52:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:12, diff=24.729133s, valid=True
2026-05-29T04:52:36.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:52:36.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:52:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:52:36.729 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955798.729937s, valid=True
2026-05-29T04:52:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:52:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:52:36.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:52:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:52:36.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:52:36.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:52:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:52:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:52:36.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:52:36.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:52:36.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:52:36.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:52:37.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:52:37.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:52:37.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:52:37.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:52:37.772 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:52:37.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:52:37.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-29T04:52:37.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-29T04:52:38.019 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:52:38.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:53:08.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:53:08.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:53:08.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:53:08.347 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:53:08.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:53:08.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:53:08.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-29T04:53:08.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:53:08.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-29T04:53:08.606 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:53:08.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:53:08.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:53:08.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T04:53:10.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-29T04:53:10.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:53:10.999 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:53:11.000 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:53:11.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:53:11.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:53:11.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:53:11.024 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:53:11.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:53:11.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:53:11.025 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:53:11.026 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:53:11.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:53:11.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:53:11.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:53:11.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:53:11.257 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:53:11.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:53:11.301 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:53:11.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:53:11.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:53:11.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:53:11.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:53:11.347 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:53:11.408 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:52:50
2026-05-29T04:53:11.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70934, datetime.datetime(2026, 5, 29, 4, 52, 50), datetime.datetime(2026, 5, 29, 4, 52, 49), 'salt', 6.62, 84.24, None, 13.73, 124.41, 2.46, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:53:11.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:53:11.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:53:11.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:49, diff=22.415651s, valid=True
2026-05-29T04:53:11.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:53:11.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:53:11.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:12, diff=-0.580983s, valid=True
2026-05-29T04:53:11.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:53:11.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:53:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:52:49, diff=22.426739s, valid=True
2026-05-29T04:53:11.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:53:11.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:53:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:53:11.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:53:11.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:53:11.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:53:11.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:12, diff=-0.569649s, valid=True
2026-05-29T04:53:11.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:53:11.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:53:11.430 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:53:11.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955833.431141s, valid=True
2026-05-29T04:53:11.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:53:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:53:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:53:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:53:11.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:53:11.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:53:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:53:11.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:53:11.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:53:11.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:53:11.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:53:11.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:53:11.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:53:11.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:53:11.971 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:53:12.311 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:53:12.410 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:53:12.410 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:53:12.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-29T04:53:12.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-29T04:53:12.603 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:53:12.603 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:53:42.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:53:42.630 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:53:42.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:53:42.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:53:42.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:53:43.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:53:43.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-29T04:53:43.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:53:43.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-29T04:53:43.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:53:43.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:53:43.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:53:43.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-29T04:53:45.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-29T04:53:45.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:53:45.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:53:45.646 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:53:45.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:53:45.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:53:45.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:53:45.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:53:45.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:53:45.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:53:45.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:53:45.670 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:53:45.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:53:45.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:53:45.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:53:45.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:53:45.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:53:45.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:53:45.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:53:45.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:53:45.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:53:45.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:53:45.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:53:45.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:53:46.052 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:53:20
2026-05-29T04:53:46.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70935, datetime.datetime(2026, 5, 29, 4, 53, 20), datetime.datetime(2026, 5, 29, 4, 53, 20), 'salt', 6.52, 84.17, None, 14.01, 123.28, 2.47, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:53:46.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:53:46.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:53:46.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:20, diff=26.060295s, valid=True
2026-05-29T04:53:46.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:53:46.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:53:46.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:12, diff=34.063694s, valid=True
2026-05-29T04:53:46.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:53:46.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:53:46.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:19, diff=27.071601s, valid=True
2026-05-29T04:53:46.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:53:46.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:53:46.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:53:46.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:53:46.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:53:46.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:53:46.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:12, diff=34.075257s, valid=True
2026-05-29T04:53:46.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:53:46.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:53:46.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:53:46.076 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955868.076056s, valid=True
2026-05-29T04:53:46.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:53:46.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:53:46.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:53:46.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:53:46.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:53:46.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:53:46.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:53:46.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:53:46.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:53:46.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:53:46.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:53:46.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:53:46.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:53:46.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:53:46.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:53:47.029 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:53:47.130 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:53:47.130 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:53:47.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-29T04:53:47.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-29T04:53:47.390 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:53:47.390 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:54:17.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:54:17.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:54: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-29T04:54:17.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:54:17.591 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:54:17.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:54:17.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-29T04:54:17.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:54:17.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T04:54:17.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:54:17.825 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:54:17.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:54:17.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-29T04:54:20.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-29T04:54:20.229 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:54:20.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:54:20.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:54:20.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:54:20.251 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:54:20.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:54:20.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:54:20.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:54:20.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:54:20.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:54:20.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:54:20.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:54:20.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:54:20.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:54:20.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:54:20.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:54:20.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:54:20.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:54:20.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:54:20.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:54:20.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:54:20.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:54:20.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:54:20.650 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:53:50
2026-05-29T04:54:20.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70936, datetime.datetime(2026, 5, 29, 4, 53, 50), datetime.datetime(2026, 5, 29, 4, 53, 50), 'salt', 6.46, 84.07, None, 13.45, 121.85, 2.49, 831.88, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:54:20.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:54:20.650 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:54:20.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:50, diff=30.657747s, valid=True
2026-05-29T04:54:20.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:54:20.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:54:20.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:54:12, diff=8.661172s, valid=True
2026-05-29T04:54:20.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:54:20.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:53:49, diff=31.669132s, valid=True
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:54:20.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:54:20.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:54:12, diff=8.67274s, valid=True
2026-05-29T04:54:20.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:54:20.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:54:20.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:54:20.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955902.67351s, valid=True
2026-05-29T04:54:20.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:54:20.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:54:20.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:54:20.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:54:20.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:54:20.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:54:20.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:54:20.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:54:20.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:54:20.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:54:20.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:54:20.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:54:20.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:54:20.995 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:54:21.204 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:54:21.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:54:21.642 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:54:21.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:54:21.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-29T04:54:21.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-29T04:54:21.916 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:54:21.917 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:54:51.926 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:54:51.926 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:54: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-29T04:54:52.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:54:52.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:54:52.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:54:52.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-29T04:54:52.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:54:52.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-29T04:54:52.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:54:52.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:54:52.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:54:52.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-29T04:54:54.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-29T04:54:54.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:54:54.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:54:54.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:54:54.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:54:54.882 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:54:54.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:54:54.901 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:54:54.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:54:54.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:54:54.902 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:54:54.902 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:54:54.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:54:55.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:54:55.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:54:55.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:54:55.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:54:55.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:54:55.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:54:55.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:54:55.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:54:55.223 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:54:55.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:54:55.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:54:55.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:54:51
2026-05-29T04:54:55.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70938, datetime.datetime(2026, 5, 29, 4, 54, 51), datetime.datetime(2026, 5, 29, 4, 54, 50), 'salt', 6.49, 84.07, None, 14.89, 123.61, 2.49, 831.76, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:54:55.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:54:55.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:54:55.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:54:50, diff=5.290775s, valid=True
2026-05-29T04:54:55.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:54:55.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:54:55.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:12, diff=-16.705834s, valid=True
2026-05-29T04:54:55.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:54:55.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:54:50, diff=5.302064s, valid=True
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:54:55.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:54:55.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:12, diff=-16.694342s, valid=True
2026-05-29T04:54:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:54:55.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:54:55.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:54:55.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955937.30644s, valid=True
2026-05-29T04:54:55.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:54:55.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:54:55.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:54:55.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:54:55.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:54:55.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:54:55.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:54:55.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:54:55.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:54:55.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:54:55.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:54:55.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:54:55.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:54:55.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:54:55.904 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:54:56.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:54:56.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:54:56.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:54:56.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-29T04:54:56.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-29T04:54:56.536 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:54:56.536 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:55:26.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:55:26.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:55: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-29T04:55:27.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:55:27.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:55:27.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:55:27.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-29T04:55:27.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:55: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-29T04:55:27.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:55:27.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:55:27.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:55:27.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-29T04:55:30.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-29T04:55:30.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:55:30.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:55:30.202 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:55:30.203 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:55:30.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:55:30.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:55:30.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:55:30.223 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:55:30.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:55:30.223 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:55:30.223 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:55:30.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:55:30.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:55:30.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:55:30.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:55:30.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:55:30.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:55:30.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:55:30.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:55:30.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:55:30.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:55:30.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:55:30.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:55:30.548 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:55:21
2026-05-29T04:55:30.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70939, datetime.datetime(2026, 5, 29, 4, 55, 21), datetime.datetime(2026, 5, 29, 4, 55, 21), 'salt', 6.46, 84.1, None, 14.5, 125.11, 2.49, 831.7, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:55:30.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:55:30.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:55:30.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:21, diff=9.554399s, valid=True
2026-05-29T04:55:30.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:55:30.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:55:30.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:12, diff=18.557279s, valid=True
2026-05-29T04:55:30.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:55:30.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:20, diff=10.563989s, valid=True
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:55:30.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:55:30.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:12, diff=18.567108s, valid=True
2026-05-29T04:55:30.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:55:30.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:55:30.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:55:30.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=955972.567799s, valid=True
2026-05-29T04:55:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:55:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:55:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:55:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:55:30.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:55:30.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:55:30.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:55:30.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:55:30.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:55:30.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:55:30.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:55:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:55:30.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:55:30.914 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:55:31.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:55:31.477 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:55:31.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:55:31.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:55:31.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-29T04:55:31.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-29T04:55:31.872 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:55:31.873 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:56:01.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:56:01.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:56:01.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:56:02.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:56:02.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:56:02.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:56:02.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-29T04:56:02.503 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:56:02.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-29T04:56:02.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:56:02.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:56:02.522 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:56:02.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-29T04:56:05.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-29T04:56:05.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:56:05.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:56:05.746 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:56:05.746 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:56:05.757 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:56:05.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:56:05.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:56:05.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:56:05.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:56:05.771 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:56:05.771 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:56:05.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:56:05.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:56:05.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:56:06.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:56:06.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:56:06.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:56:06.051 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:56:06.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:56:06.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:56:06.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:56:06.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:56:06.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:56:06.159 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:55:51
2026-05-29T04:56:06.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70940, datetime.datetime(2026, 5, 29, 4, 55, 51), datetime.datetime(2026, 5, 29, 4, 55, 51), 'salt', 6.52, 84.2, None, 15.07, 125.02, 2.46, 831.64, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:56:06.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:56:06.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:56:06.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:51, diff=15.167652s, valid=True
2026-05-29T04:56:06.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:56:06.167 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:56:06.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:12, diff=-5.828749s, valid=True
2026-05-29T04:56:06.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:56:06.171 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:56:06.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:55:51, diff=15.179587s, valid=True
2026-05-29T04:56:06.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:56:06.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:56:06.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:56:06.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:56:06.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:56:06.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:56:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:12, diff=-5.816566s, valid=True
2026-05-29T04:56:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:56:06.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:56:06.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:56:06.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956008.184269s, valid=True
2026-05-29T04:56:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:56:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:56:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:56:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:56:06.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:56:06.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:56:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:56:06.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:56:06.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:56:06.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:56:06.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:56:06.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:56:06.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:56:06.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:56:06.719 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:56:07.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:56:07.153 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:56:07.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:56:07.154 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:56:07.154 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:56:07.350 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:56:07.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:56:37.367 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:56:37.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:56:37.367 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:56:37.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:56:38.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:56:38.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:56:38.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-29T04:56:38.258 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:56:38.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-29T04:56:38.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:56:38.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:56:38.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:56:38.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-29T04:56:41.099 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:56:41.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:56:41.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:56:41.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:56:41.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:56:41.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:56:41.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:56:41.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:56:41.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:56:41.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:56:41.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:56:41.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:56:41.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:56:41.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:56:41.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:56:41.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:56:41.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:56:41.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:56:41.410 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:56:41.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:56:41.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:56:41.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:56:41.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:56:41.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:56:41.518 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:56:22
2026-05-29T04:56:41.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70941, datetime.datetime(2026, 5, 29, 4, 56, 22), datetime.datetime(2026, 5, 29, 4, 56, 21), 'salt', 6.52, 84.07, None, 16.06, 121.03, 2.49, 831.64, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:56:41.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:56:41.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:56:41.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:21, diff=20.525917s, valid=True
2026-05-29T04:56:41.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:56:41.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:56:41.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:12, diff=29.529577s, valid=True
2026-05-29T04:56:41.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:56:41.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:56:41.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:21, diff=20.537867s, valid=True
2026-05-29T04:56:41.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:56:41.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:56:41.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:56:41.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:56:41.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:56:41.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:56:41.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:12, diff=29.541651s, valid=True
2026-05-29T04:56:41.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:56:41.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:56:41.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:56:41.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956043.54247s, valid=True
2026-05-29T04:56:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:56:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:56:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:56:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:56:41.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:56:41.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:56:41.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:56:41.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:56:41.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:56:41.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:56:41.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:56:41.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:56:41.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:56:41.865 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:56:42.075 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:56:42.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:56:42.572 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:56:42.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:56:42.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-29T04:56:42.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-29T04:56:42.657 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:56:42.657 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:57:12.683 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:57:12.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:57:12.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:57:12.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:57:12.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:57:13.184 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:57:13.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-29T04:57:13.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:57:13.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-29T04:57:13.213 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:57:13.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:57:13.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:57:13.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-29T04:57:15.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T04:57:15.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:57:15.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:57:15.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:57:15.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:57:15.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:57:15.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:57:15.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:57:15.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:57:15.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:57:15.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:57:15.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:57:15.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:57:15.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:57:15.716 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:57:15.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:57:15.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:57:15.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:57:15.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:57:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:57:15.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:57:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:57:15.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:57:15.910 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:57:15.969 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:56:53
2026-05-29T04:57:15.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70942, datetime.datetime(2026, 5, 29, 4, 56, 53), datetime.datetime(2026, 5, 29, 4, 56, 52), 'salt', 6.52, 83.97, None, 14.57, 123.82, 2.5, 831.64, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:57:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:57:15.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:57:15.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:52, diff=23.977292s, valid=True
2026-05-29T04:57:15.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:57:15.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:57:15.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:12, diff=3.980834s, valid=True
2026-05-29T04:57:15.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:57:15.981 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:56:51, diff=24.989112s, valid=True
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:57:15.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:57:15.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:12, diff=3.99287s, valid=True
2026-05-29T04:57:15.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:57:15.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:57:15.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:57:15.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956077.993701s, valid=True
2026-05-29T04:57:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:57:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:57:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:57:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:57:15.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:57:16.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:57:16.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:57:16.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:57:16.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:57:16.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:57:16.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:57:16.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:57:16.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:57:16.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:57:16.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:57:16.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:57:16.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:57:16.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:57:16.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-29T04:57:16.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-29T04:57:17.123 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:57:17.123 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:57:47.124 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:57:47.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:57:47.124 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:57:47.586 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:57:47.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:57:47.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:57:47.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-29T04:57:47.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:57:47.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-29T04:57:47.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:57:47.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:57:47.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:57:47.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-29T04:57:50.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-29T04:57:50.304 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:57:50.312 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:57:50.312 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:57:50.312 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:57:50.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:57:50.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:57:50.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:57:50.337 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:57:50.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:57:50.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:57:50.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:57:50.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:57:50.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:57:50.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:57:50.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:57:50.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:57:50.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:57:50.607 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:57:50.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:57:50.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:57:50.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:57:50.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:57:50.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:57:50.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:57:23
2026-05-29T04:57:50.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70943, datetime.datetime(2026, 5, 29, 4, 57, 23), datetime.datetime(2026, 5, 29, 4, 57, 22), 'salt', 6.52, 83.91, None, 12.1, 127.48, 2.51, 831.76, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T04:57:50.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:57:50.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:57:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:22, diff=28.722098s, valid=True
2026-05-29T04:57:50.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:57:50.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:57:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:12, diff=38.725627s, valid=True
2026-05-29T04:57:50.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:57:50.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:57:50.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:22, diff=28.733592s, valid=True
2026-05-29T04:57:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:57:50.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:57:50.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:57:50.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:57:50.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:57:50.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:57:50.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:57:12, diff=38.73726s, valid=True
2026-05-29T04:57:50.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:57:50.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:57:50.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:57:50.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956112.738071s, valid=True
2026-05-29T04:57:50.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:57:50.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:57:50.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:57:50.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:57:50.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:57:50.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:57:50.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:57:50.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:57:50.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:57:50.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:57:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:57:50.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:57:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:57:51.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:57:51.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:57:51.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:57:51.787 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:57:51.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:57:51.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-29T04:57:51.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-29T04:57:51.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:57:51.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:58:22.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:58:22.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:58:22.006 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:58:22.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:58:22.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:58:22.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:58:22.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-29T04:58:22.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:58:22.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-29T04:58:22.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:58:22.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:58:22.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:58:22.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-29T04:58:24.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-29T04:58:24.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:58:24.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:58:24.871 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:58:24.871 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:58:24.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:58:24.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:58:24.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:58:24.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:58:24.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:58:24.894 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:58:24.895 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:58:24.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:58:25.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:58:25.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:58:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:58:25.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:58:25.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:58:25.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:58:25.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:58:25.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:58:25.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:58:25.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:58:25.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:58:25.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:58:23
2026-05-29T04:58:25.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70945, datetime.datetime(2026, 5, 29, 4, 58, 23), datetime.datetime(2026, 5, 29, 4, 58, 23), 'salt', 6.49, 84.37, None, 12.14, 113.98, 2.44, 831.83, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T04:58:25.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:58:25.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:58:25.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:23, diff=2.290366s, valid=True
2026-05-29T04:58:25.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:58:25.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:58:25.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:12, diff=13.293763s, valid=True
2026-05-29T04:58:25.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:58:25.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:58:25.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:22, diff=3.301701s, valid=True
2026-05-29T04:58:25.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:58:25.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:58:25.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:58:25.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:58:25.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:58:25.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:58:25.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:12, diff=13.305308s, valid=True
2026-05-29T04:58:25.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:58:25.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:58:25.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:58:25.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956147.306092s, valid=True
2026-05-29T04:58:25.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:58:25.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:58:25.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:58:25.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:58:25.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:58:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:58:25.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:58:25.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:58:25.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:58:25.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:58:25.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:58:25.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:58:25.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:58:25.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:58:25.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:58:26.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:58:26.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:58:26.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:58:26.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-29T04:58:26.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-29T04:58:26.486 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:58:26.486 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:58:56.516 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:58:56.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:58:56.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:58:56.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:58:56.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:58:57.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:58:57.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-29T04:58:57.068 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:58: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-29T04:58:57.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:58:57.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:58:57.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:58:57.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-29T04:58:59.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-29T04:58:59.352 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:58:59.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:58:59.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:58:59.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:58:59.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:58:59.384 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:58:59.384 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:58:59.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:58:59.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:58:59.386 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:58:59.386 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:58:59.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:58:59.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T04:58:59.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:58:59.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T04:58:59.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:58:59.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:58:59.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:58:59.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T04:58:59.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:58:59.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:58:59.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:58:59.721 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:58:59.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:58:54
2026-05-29T04:58:59.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70946, datetime.datetime(2026, 5, 29, 4, 58, 54), datetime.datetime(2026, 5, 29, 4, 58, 53), 'salt', 6.56, 83.97, None, 14.47, 120.67, 2.51, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T04:58:59.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:58:59.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T04:58:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:53, diff=6.791612s, valid=True
2026-05-29T04:58:59.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:58:59.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:58:59.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:12, diff=-12.204887s, valid=True
2026-05-29T04:58:59.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:58:59.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:58:52, diff=7.803101s, valid=True
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:58:59.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T04:58:59.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:12, diff=-12.193161s, valid=True
2026-05-29T04:58:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:58:59.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:58:59.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:58:59.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956181.807643s, valid=True
2026-05-29T04:58:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:58:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:58:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:58:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:58:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:58:59.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:58:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:58:59.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:58:59.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:58:59.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:59:00.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:59:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:59:00.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:59:00.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:59:00.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:59:00.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:59:00.894 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:59:00.894 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:59:00.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-29T04:59:00.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-29T04:59:01.085 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:59:01.085 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T04:59:31.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T04:59:31.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T04:59:31.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T04:59:31.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T04:59:31.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T04:59:31.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T04:59:31.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-29T04:59:31.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T04:59:31.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-29T04:59:31.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T04:59:31.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T04:59:31.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T04:59:31.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-29T04:59:34.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-29T04:59:34.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T04:59:34.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T04:59:34.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T04:59:34.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T04:59:34.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T04:59:34.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T04:59:34.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T04:59:34.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T04:59:34.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T04:59:34.528 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T04:59:34.528 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T04:59:34.535 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T04:59:34.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T04:59:34.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T04:59:34.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T04:59:34.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:59:34.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:59:34.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T04:59:34.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T04:59:34.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T04:59:34.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T04:59:34.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T04:59:34.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T04:59:34.903 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:59:24
2026-05-29T04:59:34.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70947, datetime.datetime(2026, 5, 29, 4, 59, 24), datetime.datetime(2026, 5, 29, 4, 59, 24), 'salt', 6.49, 83.91, None, 14.93, 122.25, 2.52, 831.64, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T04:59:34.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T04:59:34.904 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T04:59:34.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:24, diff=10.910945s, valid=True
2026-05-29T04:59:34.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T04:59:34.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:59:34.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:12, diff=22.91429s, valid=True
2026-05-29T04:59:34.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T04:59:34.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:22, diff=12.922078s, valid=True
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T04:59:34.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T04:59:34.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:12, diff=22.925712s, valid=True
2026-05-29T04:59:34.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T04:59:34.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T04:59:34.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T04:59:34.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956216.926566s, valid=True
2026-05-29T04:59:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T04:59:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T04:59:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T04:59:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T04:59:34.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T04:59:34.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T04:59:34.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T04:59:34.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T04:59:35.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T04:59:35.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T04:59:35.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T04:59:35.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T04:59:35.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T04:59:35.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T04:59:35.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:59:35.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T04:59:35.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T04:59:35.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T04:59:35.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T04:59:35.899 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T04:59:36.164 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T04:59:36.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:00:06.174 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:00:06.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:00:06.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:00:06.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:00:06.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:00:06.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:00:06.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-29T05:00:06.777 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:00:06.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-29T05:00:06.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:00:06.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:00:06.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:00:06.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-29T05:00:09.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-29T05:00:09.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:00:09.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:00:09.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:00:09.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:00:09.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:00:09.937 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:00:09.937 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:00:09.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:00:09.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:00:09.937 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:00:09.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:00:09.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:00:10.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:00:10.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:00:10.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:00:10.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:00:10.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:00:10.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:00:10.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:00:10.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:00:10.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:00:10.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:00:10.207 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:00:10.265 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 04:59:54
2026-05-29T05:00:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70948, datetime.datetime(2026, 5, 29, 4, 59, 54), datetime.datetime(2026, 5, 29, 4, 59, 54), 'salt', 6.69, 83.97, None, 14.61, 116.99, 2.51, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:00:10.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:00:10.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:00:10.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:54, diff=16.272757s, valid=True
2026-05-29T05:00:10.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:00:10.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:00:10.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:12, diff=-1.724102s, valid=True
2026-05-29T05:00:10.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:00:10.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 04:59:53, diff=17.28326s, valid=True
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:00:10.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:00:10.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:12, diff=-1.713428s, valid=True
2026-05-29T05:00:10.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:00:10.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:00:10.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:00:10.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956252.287319s, valid=True
2026-05-29T05:00:10.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:00:10.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:00:10.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:00:10.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:00:10.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:00:10.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:00:10.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:00:10.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:00:10.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:00:10.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:00:10.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:00:10.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:00:10.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:00:10.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:00:10.895 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:00:11.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:00:11.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:00:11.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:00:11.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-29T05:00:11.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-29T05:00:11.572 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:00:11.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:00:41.602 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:00:41.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:00:41.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:00:41.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:00:41.920 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:00:42.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:00:42.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-29T05:00:42.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:00:42.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-29T05:00:42.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:00:42.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:00:42.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:00:42.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:00:44.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-29T05:00:44.648 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:00:44.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:00:44.656 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:00:44.656 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:00:44.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:00:44.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05: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-29T05:00:44.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:00:44.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:00:44.681 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:00:44.682 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:00:44.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:00:44.826 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:00:44.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:00:44.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:00:44.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:00:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:00:44.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:00:45.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:00:45.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:00:45.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:00:45.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:00:45.032 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:00:45.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:00:24
2026-05-29T05:00:45.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70949, datetime.datetime(2026, 5, 29, 5, 0, 24), datetime.datetime(2026, 5, 29, 5, 0, 24), 'salt', 6.62, 83.94, None, 14.93, 117.62, 2.51, 831.76, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:00:45.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:00:45.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:00:45.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:24, diff=21.11348s, valid=True
2026-05-29T05:00:45.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:00:45.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:00:45.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:12, diff=33.116958s, valid=True
2026-05-29T05:00:45.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:00:45.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:23, diff=22.12523s, valid=True
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:00:45.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:00:45.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:12, diff=33.129091s, valid=True
2026-05-29T05:00:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:00:45.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:00:45.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:00:45.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956287.129912s, valid=True
2026-05-29T05:00:45.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:00:45.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:00:45.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:00:45.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:00:45.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:00:45.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:00:45.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:00:45.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:00:45.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:00:45.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:00:45.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:00:45.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:00:45.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:00:45.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:00:45.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:00:46.019 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:00:46.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:00:46.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:00:46.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-29T05:00:46.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-29T05:00:46.317 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:00:46.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:01:16.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:01:16.347 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:01:16.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:01:16.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:01:16.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:01:16.724 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:01:16.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-29T05:01:16.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:01:16.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-29T05:01:16.750 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:01:16.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:01:16.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:01:16.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-29T05:01:19.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-29T05:01:19.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:01:19.245 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:01:19.246 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:01:19.246 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:01:19.256 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:01:19.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:01:19.269 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:01:19.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:01:19.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:01:19.270 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:01:19.271 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:01:19.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:01:19.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:01:19.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:01:19.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:01:19.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:01:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:01:19.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:01:19.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:01:19.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:01:19.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:01:19.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:01:19.606 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:01:19.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:00:55
2026-05-29T05:01:19.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70950, datetime.datetime(2026, 5, 29, 5, 0, 55), datetime.datetime(2026, 5, 29, 5, 0, 54), 'salt', 6.72, 83.71, None, 15.24, 117.22, 2.55, 831.88, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:01:19.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:01:19.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:01:19.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:54, diff=25.680067s, valid=True
2026-05-29T05:01:19.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:01:19.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:01:19.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:12, diff=7.683582s, valid=True
2026-05-29T05:01:19.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:01:19.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:01:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:00:53, diff=26.691629s, valid=True
2026-05-29T05:01:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:01:19.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:01:19.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:01:19.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:01:19.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:01:19.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:01:19.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:12, diff=7.695295s, valid=True
2026-05-29T05:01:19.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:01:19.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:01:19.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:01:19.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956321.696111s, valid=True
2026-05-29T05:01:19.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:01:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:01:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:01:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:01:19.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:01:19.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:01:19.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:01:19.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:01:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:01:19.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:01:19.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:01:20.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:01:20.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:01:20.124 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:01:20.335 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:01:20.676 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:01:20.777 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:01:20.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:01:20.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-29T05:01:20.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-29T05:01:20.975 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:01:20.975 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:01:51.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:01:51.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:01:51.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:01:51.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:01:51.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:01:51.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:01:51.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-29T05:01:51.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:01:51.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-29T05:01:51.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:01:51.527 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:01:51.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:01:51.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-29T05:01:53.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-29T05:01:53.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:01:53.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:01:53.854 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:01:53.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:01:53.865 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:01:53.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:01:53.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:01:53.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:01:53.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:01:53.880 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:01:53.880 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:01:53.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:01:54.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:01:54.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:01:54.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:01:54.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:01:54.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:01:54.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:01:54.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:01:54.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:01:54.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:01:54.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:01:54.203 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:01:54.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:01:25
2026-05-29T05:01:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70951, datetime.datetime(2026, 5, 29, 5, 1, 25), datetime.datetime(2026, 5, 29, 5, 1, 25), 'salt', 6.76, 83.64, None, 15.49, 118.89, 2.57, 831.76, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:01:54.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:01:54.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:01:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:25, diff=29.268527s, valid=True
2026-05-29T05:01:54.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:01:54.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:01:54.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:12, diff=42.271964s, valid=True
2026-05-29T05:01:54.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:01:54.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:01:54.279 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:24, diff=30.27997s, valid=True
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:01:54.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:01:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:01:12, diff=42.283592s, valid=True
2026-05-29T05:01:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:01:54.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:01:54.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:01:54.284 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956356.284391s, valid=True
2026-05-29T05:01:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:01:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:01:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:01:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:01:54.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:01:54.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:01:54.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:01:54.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:01:54.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:01:54.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:01:54.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:01:54.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:01:54.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:01:54.608 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:01:54.818 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:01:55.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:01:55.257 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:01:55.257 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:01:55.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-29T05:01:55.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-29T05:01:55.521 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:01:55.521 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:02:25.546 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:02:25.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:02:25.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:02:25.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:02:25.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:02:25.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:02:25.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-29T05:02:25.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:02:25.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-29T05:02:25.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:02:25.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:02:25.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:02:25.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-29T05:02:28.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-29T05:02:28.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:02:28.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:02:28.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:02:28.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:02:28.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:02:28.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:02:28.507 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:02:28.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:02:28.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:02:28.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:02:28.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:02:28.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:02:28.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:02:28.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:02:28.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:02:28.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:02:28.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:02:28.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:02:28.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:02:28.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:02:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:02:28.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:02:28.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:02:28.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:02:25
2026-05-29T05:02:28.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70953, datetime.datetime(2026, 5, 29, 5, 2, 25), datetime.datetime(2026, 5, 29, 5, 2, 25), 'salt', 6.76, 83.47, None, 16.69, 121.47, 2.6, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:02:28.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:02:28.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:02:28.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:25, diff=3.908561s, valid=True
2026-05-29T05:02:28.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:02:28.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:02:28.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:12, diff=16.911441s, valid=True
2026-05-29T05:02:28.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:02:28.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:24, diff=4.918243s, valid=True
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:02:28.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:02:28.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:12, diff=16.921296s, valid=True
2026-05-29T05:02:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:02:28.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:02:28.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:02:28.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956390.921991s, valid=True
2026-05-29T05:02:28.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:02:28.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:02:28.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:02:28.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:02:28.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:02:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:02:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:02:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:02:29.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:02:29.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:02:29.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:02:29.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:02:29.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:02:29.243 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:02:29.455 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:02:29.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:02:29.906 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:02:29.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:02:29.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-29T05:02:29.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-29T05:02:30.097 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:02:30.097 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:03:00.126 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:03:00.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:03:00.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:03:00.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:03:00.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:03:00.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:03:00.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-29T05:03:00.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:03:00.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-29T05:03:00.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:03:00.634 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:03:00.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:03:00.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:03:03.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-29T05:03:03.093 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:03:03.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:03:03.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:03:03.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:03:03.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:03:03.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:03:03.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:03:03.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:03:03.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:03:03.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:03:03.130 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:03:03.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:03:03.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:03:03.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:03:03.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:03:03.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:03:03.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:03:03.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:03:03.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:03:03.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:03:03.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:03:03.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:03:03.465 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:03:03.526 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:02:56
2026-05-29T05:03:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70954, datetime.datetime(2026, 5, 29, 5, 2, 56), datetime.datetime(2026, 5, 29, 5, 2, 55), 'salt', 6.66, 83.34, None, 13.76, 116.47, 2.62, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:03:03.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:03:03.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:03:03.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:55, diff=8.533467s, valid=True
2026-05-29T05:03:03.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:03:03.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:03:03.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:12, diff=-8.463452s, valid=True
2026-05-29T05:03:03.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:03:03.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:03:03.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:02:54, diff=9.543659s, valid=True
2026-05-29T05:03:03.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:03:03.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:03:03.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:03:03.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:03:03.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:03:03.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:03:03.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:12, diff=-8.453074s, valid=True
2026-05-29T05:03:03.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:03:03.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:03:03.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:03:03.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956425.547646s, valid=True
2026-05-29T05:03:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:03:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:03:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:03:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:03:03.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:03:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:03:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:03:03.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:03:03.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:03:03.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:03:03.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:03:03.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:03:03.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:03:03.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:03:04.090 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:03:04.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:03:04.620 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:03:04.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:03:04.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-29T05:03:04.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-29T05:03:04.826 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:03:04.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:03:34.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:03:34.838 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:03:34.839 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:03:35.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:03:35.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:03:35.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:03:35.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-29T05:03:35.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:03:35.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-29T05:03:35.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:03:35.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:03:35.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:03:35.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-29T05:03:38.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-29T05:03:38.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:03:38.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:03:38.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:03:38.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:03:38.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:03:38.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:03:38.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:03:38.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:03:38.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:03:38.220 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:03:38.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:03:38.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:03:38.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:03:38.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:03:38.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:03:38.461 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:03:38.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:03:38.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:03:38.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:03:38.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:03:38.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:03:38.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:03:38.555 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:03:38.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:03:26
2026-05-29T05:03:38.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70955, datetime.datetime(2026, 5, 29, 5, 3, 26), datetime.datetime(2026, 5, 29, 5, 3, 26), 'salt', 6.72, 83.24, None, 13.27, 121.64, 2.63, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:03:38.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:03:38.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:03:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:26, diff=12.6265s, valid=True
2026-05-29T05:03:38.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:03:38.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:03:38.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:12, diff=26.630049s, valid=True
2026-05-29T05:03:38.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:03:38.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:24, diff=14.638225s, valid=True
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:03:38.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:03:38.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:12, diff=26.641976s, valid=True
2026-05-29T05:03:38.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:03:38.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:03:38.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:03:38.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956460.642815s, valid=True
2026-05-29T05:03:38.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:03:38.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:03:38.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:03:38.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:03:38.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:03:38.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:03:38.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:03:38.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:03:38.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:03:38.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:03:38.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:03:38.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:03:38.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:03:38.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:03:39.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:03:39.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:03:39.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:03:39.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:03:39.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-29T05:03:39.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-29T05:03:39.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:03:39.720 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:04:09.734 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:04:09.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:04:09.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:04:09.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:04:10.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:04:10.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:04: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-29T05:04:10.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:04:10.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-29T05:04:10.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:04:10.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:04:10.247 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:04: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-29T05:04:12.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-29T05:04:12.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:04:12.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:04:12.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:04:12.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:04:12.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:04:12.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:04:12.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:04:12.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:04:12.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:04:12.706 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:04:12.706 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:04:12.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:04:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:04:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:04:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:04:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:04:12.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:04:12.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:04:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:04:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:04:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:04:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:04:13.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:04:13.091 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:03:56
2026-05-29T05:04:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70956, datetime.datetime(2026, 5, 29, 5, 3, 56), datetime.datetime(2026, 5, 29, 5, 3, 56), 'salt', 6.76, 83.24, None, 11.5, 112.53, 2.64, 831.76, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:04:13.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:04:13.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:04:13.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:56, diff=17.099286s, valid=True
2026-05-29T05:04:13.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:04:13.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:04:13.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:12, diff=1.102695s, valid=True
2026-05-29T05:04:13.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:04:13.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:03:55, diff=18.110481s, valid=True
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:04:13.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:04:13.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:04:13.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:12, diff=1.114109s, valid=True
2026-05-29T05:04:13.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:04:13.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:04:13.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:04:13.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956495.114898s, valid=True
2026-05-29T05:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:04:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:04:13.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:04:13.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:04:13.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:04:13.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:04:13.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:04:13.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:04:13.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:04:13.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:04:13.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:04:13.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:04:13.721 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:04:14.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:04:14.186 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:04:14.186 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:04:14.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-29T05:04:14.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-29T05:04:14.878 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:04:14.878 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:04:44.908 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:04:44.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:04:44.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:04:45.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:04:45.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:04:45.294 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:04:45.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-29T05:04:45.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:04:45.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-29T05:04:45.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:04:45.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:04:45.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:04:45.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:04:48.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-29T05:04:48.250 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:04:48.258 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:04:48.259 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:04:48.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:04:48.269 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:04:48.282 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:04:48.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:04:48.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:04:48.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:04:48.284 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:04:48.284 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:04:48.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:04:48.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:04:48.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:04:48.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:04:48.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:04:48.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:04:48.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:04:48.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:04:48.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:04:48.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:04:48.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:04:48.598 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:04:48.658 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:04:27
2026-05-29T05:04:48.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70957, datetime.datetime(2026, 5, 29, 5, 4, 27), datetime.datetime(2026, 5, 29, 5, 4, 26), 'salt', 6.79, 83.18, None, 15.24, 114.22, 2.65, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:04:48.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:04:48.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:04:48.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:26, diff=22.665937s, valid=True
2026-05-29T05:04:48.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:04:48.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:04:48.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:12, diff=36.66936s, valid=True
2026-05-29T05:04:48.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:04:48.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:25, diff=23.677088s, valid=True
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:04:48.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:04:48.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:12, diff=36.680707s, valid=True
2026-05-29T05:04:48.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:04:48.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:04:48.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:04:48.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956530.681496s, valid=True
2026-05-29T05:04:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:04:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:04:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:04:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:04:48.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:04:48.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:04:48.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:04:48.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:04:48.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:04:48.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:04:48.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:04:48.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:04:48.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:04:49.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:04:49.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:04:49.554 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:04:49.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:04:49.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:04:49.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-29T05:04:49.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-29T05:04:49.914 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:04:49.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:05:19.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:05:19.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:05:19.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:05:20.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:05:20.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:05:20.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:05:20.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-29T05:05:20.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:05:20.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-29T05:05:20.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:05:20.300 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:05:20.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:05:20.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-29T05:05:22.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:05:22.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:05:22.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:05:22.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:05:22.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:05:22.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:05:22.787 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:05:22.787 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:05:22.788 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:05:22.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:05:22.788 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:05:22.788 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:05:22.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:05:22.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:05:22.918 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:05:23.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:05:23.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:05:23.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:05:23.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:05:23.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:05:23.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:05:23.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:05:23.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:05:23.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:05:23.165 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:04:57
2026-05-29T05:05:23.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70958, datetime.datetime(2026, 5, 29, 5, 4, 57), datetime.datetime(2026, 5, 29, 5, 4, 56), 'salt', 6.79, 83.11, None, 17.15, 118.3, 2.66, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:05:23.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:05:23.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:05:23.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:56, diff=27.1724s, valid=True
2026-05-29T05:05:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:05:23.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:05:23.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:12, diff=11.175741s, valid=True
2026-05-29T05:05:23.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:05:23.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:05:23.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:04:55, diff=28.183589s, valid=True
2026-05-29T05:05:23.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:05:23.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:05:23.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:05:23.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:05:23.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:05:23.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:05:23.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:12, diff=11.187167s, valid=True
2026-05-29T05:05:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:05:23.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:05:23.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:05:23.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956565.188001s, valid=True
2026-05-29T05:05:23.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:05:23.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:05:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:05:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:05:23.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:05:23.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:05:23.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:05:23.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:05:23.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:05:23.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:05:23.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:05:23.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:05:23.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:05:23.579 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:05:23.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:05:24.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:05:24.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:05:24.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:05:24.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-29T05:05:24.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-29T05:05:24.490 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:05:24.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:05:54.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:05:54.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:05:54.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:05:54.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:05:54.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:05:54.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:05:54.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-29T05:05:54.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:05:54.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-29T05:05:54.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:05:54.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:05:54.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:05:54.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:05:57.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:05:57.376 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:05:57.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:05:57.385 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:05:57.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:05:57.397 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:05:57.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:05:57.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:05:57.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:05:57.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:05:57.414 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:05:57.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:05:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:05:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:05:57.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:05:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:05:57.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:05:57.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:05:57.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:05:57.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:05:57.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:05:57.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:05:57.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:05:57.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:05:57.791 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:05:27
2026-05-29T05:05:57.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70959, datetime.datetime(2026, 5, 29, 5, 5, 27), datetime.datetime(2026, 5, 29, 5, 5, 27), 'salt', 6.72, 83.01, None, 16.13, 114.08, 2.67, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:05:57.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:05:57.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:05:57.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:57, diff=0.800289s, valid=True
2026-05-29T05:05:57.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:05:57.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:05:57.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:12, diff=45.803682s, valid=True
2026-05-29T05:05:57.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:05:57.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:56, diff=1.811484s, valid=True
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:05:57.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:05:57.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:05:57.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:05:12, diff=45.815062s, valid=True
2026-05-29T05:05:57.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:05:57.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:05:57.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:05:57.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956599.815861s, valid=True
2026-05-29T05:05:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:05:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:05:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:05:57.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:05:57.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:05:57.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:05:57.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:05:57.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:05:57.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:05:57.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:05:58.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:05:58.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:05:58.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:05:58.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:05:58.352 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:05:58.694 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:05:58.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:05:58.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:05:58.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-29T05:05:58.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-29T05:05:59.050 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:05:59.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:06:29.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:06:29.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:06:29.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:06:29.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:06:29.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:06:29.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:06:29.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-29T05:06:29.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:06:29.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-29T05:06:29.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:06:29.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:06:29.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:06:29.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-29T05:06:31.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-29T05:06:31.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:06:31.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:06:31.879 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:06:31.879 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:06:31.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:06:31.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:06:31.902 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:06:31.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:06:31.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:06:31.903 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:06:31.903 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:06:31.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:06:32.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:06:32.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:06:32.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:06:32.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:06:32.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:06:32.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:06:32.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:06:32.219 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:06:32.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:06:32.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:06:32.224 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:06:32.286 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:06:28
2026-05-29T05:06:32.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70961, datetime.datetime(2026, 5, 29, 5, 6, 28), datetime.datetime(2026, 5, 29, 5, 6, 27), 'salt', 6.72, 83.28, None, 14.26, 113.39, 2.63, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:06:32.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:06:32.287 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:06:32.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:27, diff=5.294073s, valid=True
2026-05-29T05:06:32.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:06:32.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:06:32.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:12, diff=20.297499s, valid=True
2026-05-29T05:06:32.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:06:32.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:26, diff=6.305293s, valid=True
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:06:32.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:06:32.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:12, diff=20.308956s, valid=True
2026-05-29T05:06:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:06:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:06:32.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:06:32.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956634.309743s, valid=True
2026-05-29T05:06:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:06:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:06:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:06:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:06:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:06:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:06:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:06:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:06:32.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:06:32.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:06:32.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:06:32.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:06:32.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:06:32.701 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:06:32.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:06:33.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:06:33.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:06:33.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:06:33.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-29T05:06:33.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-29T05:06:33.508 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:06:33.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:07:03.538 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:07:03.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:07:03.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:07:03.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:07:03.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:07:04.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:07:04.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-29T05:07:04.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:07:04.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-29T05:07:04.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:07:04.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:07:04.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:07:04.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-29T05:07:06.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-29T05:07:06.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:07:06.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:07:06.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:07:06.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:07:06.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:07:06.537 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:07:06.538 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:07:06.538 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:07:06.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:07:06.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:07:06.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:07:06.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:07:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:07:06.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:07:06.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:07:06.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:07:06.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:07:06.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:07:06.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:07:06.846 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:07:06.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:07:06.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:07:06.851 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:07:06.912 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:06:58
2026-05-29T05:07:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70962, datetime.datetime(2026, 5, 29, 5, 6, 58), datetime.datetime(2026, 5, 29, 5, 6, 58), 'salt', 6.82, 83.38, None, 15.46, 109.1, 2.61, 831.76, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:07:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:07:06.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:07:06.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:58, diff=8.919269s, valid=True
2026-05-29T05:07:06.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:07:06.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:07:06.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:12, diff=-5.077421s, valid=True
2026-05-29T05:07:06.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:07:06.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:06:56, diff=10.930198s, valid=True
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:07:06.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:07:06.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:12, diff=-5.066267s, valid=True
2026-05-29T05:07:06.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:07:06.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:07:06.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:07:06.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956668.934513s, valid=True
2026-05-29T05:07:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:07:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:07:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:07:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:07:06.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:07:06.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:07:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:07:07.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:07:07.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:07:07.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:07:07.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:07:07.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:07:07.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:07:07.255 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:07:07.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:07:07.805 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:07:07.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:07:07.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:07:07.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-29T05:07:07.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-29T05:07:07.997 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:07:07.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:07:38.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:07:38.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:07:38.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:07:38.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:07:38.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:07:38.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:07:38.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-29T05:07:38.561 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:07:38.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-29T05:07:38.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:07:38.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:07:38.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:07:38.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:07:41.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-29T05:07:41.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:07:41.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:07:41.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:07:41.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:07:41.526 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:07:41.538 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:07:41.539 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:07:41.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:07:41.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:07:41.539 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:07:41.539 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:07:41.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:07:41.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:07:41.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:07:41.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:07:41.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:07:41.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:07:41.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:07:41.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:07:41.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:07:41.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:07:41.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:07:41.812 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:07:41.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:07:28
2026-05-29T05:07:41.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70963, datetime.datetime(2026, 5, 29, 5, 7, 28), datetime.datetime(2026, 5, 29, 5, 7, 28), 'salt', 6.76, 83.34, None, 14.22, 108.42, 2.62, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:07:41.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:07:41.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:07:41.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:28, diff=13.877473s, valid=True
2026-05-29T05:07:41.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:07:41.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:07:41.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:12, diff=29.880584s, valid=True
2026-05-29T05:07:41.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:07:41.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:07:41.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:26, diff=15.887808s, valid=True
2026-05-29T05:07:41.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:07:41.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:07:41.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:07:41.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:07:41.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:07:41.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:07:41.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:12, diff=29.891066s, valid=True
2026-05-29T05:07:41.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:07:41.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:07:41.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:07:41.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956703.891797s, valid=True
2026-05-29T05:07:41.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:07:41.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:07:41.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:07:41.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:07:41.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:07:41.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:07:41.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:07:41.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:07:41.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:07:42.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:07:42.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:07:42.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:07:42.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:07:42.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:07:42.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:07:42.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:07:42.936 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:07:42.936 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:07:42.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-29T05:07:42.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-29T05:07:43.140 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:07:43.140 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:08:13.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:08:13.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:08:13.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:08:13.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:08:13.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:08:14.063 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:08:14.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-29T05:08:14.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:08:14.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:08:14.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:08:14.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:08:14.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:08:14.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-29T05:08:16.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-29T05:08:16.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:08:16.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:08:16.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:08:16.647 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:08:16.659 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:08:16.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:08:16.672 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:08:16.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:08:16.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:08:16.674 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:08:16.674 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:08:16.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:08:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:08:16.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:08:16.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:08:16.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:08:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:08:16.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:08:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:08:16.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:08:16.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:08:16.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:08:16.999 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:08:17.059 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:07:59
2026-05-29T05:08:17.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70964, datetime.datetime(2026, 5, 29, 5, 7, 59), datetime.datetime(2026, 5, 29, 5, 7, 59), 'salt', 6.82, 83.54, None, 13.13, 110.15, 2.58, 831.7, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:08:17.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:08:17.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:08:17.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:59, diff=18.066277s, valid=True
2026-05-29T05:08:17.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:08:17.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:08:17.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:12, diff=5.06966s, valid=True
2026-05-29T05:08:17.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:08:17.069 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:08:17.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:07:56, diff=21.077529s, valid=True
2026-05-29T05:08:17.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:08:17.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:08:17.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:08:17.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:08:17.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:08:17.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:08:17.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:12, diff=5.081162s, valid=True
2026-05-29T05:08:17.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:08:17.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:08:17.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:08:17.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956739.081963s, valid=True
2026-05-29T05:08:17.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:08:17.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:08:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:08:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:08:17.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:08:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:08:17.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:08:17.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:08:17.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:08:17.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:08:17.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:08:17.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:08:17.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:08:17.403 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:08:17.610 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:08:17.952 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:08:18.053 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:08:18.053 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:08:18.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-29T05:08:18.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-29T05:08:18.313 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:08:18.313 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:08:48.317 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:08:48.317 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:08:48.317 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:08:48.473 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:08:48.488 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:08:48.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:08:48.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-29T05:08:48.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:08:48.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-29T05:08:48.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:08:48.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:08:48.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:08:48.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-29T05:08:51.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:08:51.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:08:51.269 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:08:51.271 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:08:51.271 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:08:51.281 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:08:51.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:08:51.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:08:51.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:08:51.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:08:51.295 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:08:51.295 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:08:51.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:08:51.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:08:51.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:08:51.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:08:51.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:08:51.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:08:51.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:08:51.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:08:51.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:08:51.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:08:51.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:08:51.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:08:51.672 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:08:30
2026-05-29T05:08:51.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70965, datetime.datetime(2026, 5, 29, 5, 8, 30), datetime.datetime(2026, 5, 29, 5, 8, 29), 'salt', 6.82, 83.44, None, 15.63, 114.59, 2.6, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:08:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:08:51.673 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:08:51.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:29, diff=22.680038s, valid=True
2026-05-29T05:08:51.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:08:51.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:08:51.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:12, diff=39.683451s, valid=True
2026-05-29T05:08:51.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:08:51.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:27, diff=24.691456s, valid=True
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:08:51.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:08:51.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:08:51.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:12, diff=39.695068s, valid=True
2026-05-29T05:08:51.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:08:51.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:08:51.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:08:51.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956773.695858s, valid=True
2026-05-29T05:08:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:08:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:08:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:08:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:08:51.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:08:51.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:08:51.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:08:51.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:08:51.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:08:51.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:08:51.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:08:51.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:08:51.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:08:52.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:08:52.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:08:52.560 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:08:52.659 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:08:52.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:08:52.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-29T05:08:52.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-29T05:08:52.862 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:08:52.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:09:22.879 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:09:22.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:09:22.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:09:23.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:09:23.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:09:23.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:09:23.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-29T05:09:23.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:09:23.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-29T05:09:23.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:09:23.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:09:23.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:09:23.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-29T05:09:25.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-29T05:09:25.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:09:25.754 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:09:25.755 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:09:25.755 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:09:25.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:09:25.779 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:09:25.780 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:09:25.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:09:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:09:25.781 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:09:25.781 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:09:25.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:09:25.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:09:25.920 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:09:26.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:09:26.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:09:26.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:09:26.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:09:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:09:26.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:09:26.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:09:26.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:09:26.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:09:26.180 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:09:00
2026-05-29T05:09:26.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70966, datetime.datetime(2026, 5, 29, 5, 9), datetime.datetime(2026, 5, 29, 5, 9), 'salt', 6.79, 83.44, None, 16.37, 110.48, 2.6, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:09:26.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:09:26.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:09:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:09:00, diff=26.188209s, valid=True
2026-05-29T05:09:26.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:09:26.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:09:26.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:09:12, diff=14.191607s, valid=True
2026-05-29T05:09:26.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:09:26.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:09:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:08:58, diff=28.199543s, valid=True
2026-05-29T05:09:26.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:09:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:09:26.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:09:26.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:09:26.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:09:26.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:09:26.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:09:12, diff=14.203131s, valid=True
2026-05-29T05:09:26.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:09:26.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:09:26.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:09:26.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956808.203925s, valid=True
2026-05-29T05:09:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:09:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:09:26.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:09:26.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:09:26.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:09:26.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:09:26.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:09:26.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:09:26.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:09:26.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:09:26.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:09:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:09:26.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:09:26.528 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:09:26.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:09:27.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:09:27.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:09:27.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:09:27.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:09:27.241 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:09:30.263 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:09:30.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:10:00.286 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:10:00.287 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:10:00.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:10:00.411 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:10:00.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:10:00.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:10:00.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-29T05:10:00.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:10:00.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-29T05:10:00.636 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:10:00.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:10:00.641 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:10:00.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-29T05:10:03.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-29T05:10:03.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:10:03.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:10:03.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:10:03.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:10:03.783 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:10:03.795 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:10:03.796 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:10:03.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:10:03.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:10:03.797 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:10:03.797 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:10:03.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:10:03.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:10:03.892 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:10:03.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:10:03.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:10:04.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:10:04.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:10:04.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:10:04.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:10:04.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:10:04.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:10:04.070 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:10:04.134 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:10:00
2026-05-29T05:10:04.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70968, datetime.datetime(2026, 5, 29, 5, 10), datetime.datetime(2026, 5, 29, 5, 10), 'salt', 6.76, 83.51, None, 14.93, 110.16, 2.59, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:10:04.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:10:04.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:10:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:00, diff=4.141548s, valid=True
2026-05-29T05:10:04.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:10:04.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:10:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:12, diff=-7.855327s, valid=True
2026-05-29T05:10:04.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:10:04.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:09:57, diff=7.151494s, valid=True
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:10:04.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:10:04.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:12, diff=-7.845404s, valid=True
2026-05-29T05:10:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:10:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:10:04.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:10:04.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956846.155327s, valid=True
2026-05-29T05:10:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:10:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:10:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:10:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:10:04.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:10:04.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:10:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:10:04.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:10:04.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:10:04.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:10:04.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:10:04.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:10:04.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:10:04.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:10:04.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:10:05.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:10:05.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:10:05.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:10:05.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-29T05:10:05.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-29T05:10:05.386 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:10:05.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:10:35.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:10:35.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:10:35.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:10:35.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:10:35.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:10:35.952 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:10:35.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-29T05:10:35.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:10:35.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-29T05:10:35.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:10:35.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:10:35.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:10:35.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-29T05:10:38.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-29T05:10:38.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:10:38.291 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:10:38.291 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:10:38.291 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:10:38.301 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:10:38.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:10:38.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:10:38.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:10:38.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:10:38.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:10:38.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:10:38.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:10:38.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:10:38.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:10:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:10:38.545 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:10:38.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:10:38.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:10:38.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:10:38.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:10:38.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:10:38.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:10:38.638 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:10:38.698 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:10:31
2026-05-29T05:10:38.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70969, datetime.datetime(2026, 5, 29, 5, 10, 31), datetime.datetime(2026, 5, 29, 5, 10, 30), 'salt', 6.59, 83.71, None, 14.61, 113.14, 2.55, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:10:38.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:10:38.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:10:38.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:30, diff=8.705561s, valid=True
2026-05-29T05:10:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:10:38.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:10:38.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:12, diff=26.708994s, valid=True
2026-05-29T05:10:38.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:10:38.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:10:38.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:28, diff=10.716862s, valid=True
2026-05-29T05:10:38.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:10:38.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:10:38.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:10:38.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:10:38.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:10:38.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:10:38.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:12, diff=26.720444s, valid=True
2026-05-29T05:10:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:10:38.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:10:38.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:10:38.721 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956880.721241s, valid=True
2026-05-29T05:10:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:10:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:10:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:10:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:10:38.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:10:38.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:10:38.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:10:38.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:10:38.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:10:38.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:10:38.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:10:38.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:10:39.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:10:39.040 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:10:39.325 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:10:39.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:10:39.765 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:10:39.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:10:39.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-29T05:10:39.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-29T05:10:39.856 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:10:39.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:11:09.881 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:11:09.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:11:09.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:11:10.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:11:10.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:11:10.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:11:10.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:11:10.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:11:10.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-29T05:11:10.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:11:10.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:11:10.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:11:10.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-29T05:11:12.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-29T05:11:12.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:11:12.688 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:11:12.689 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:11:12.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:11:12.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:11:12.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:11:12.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:11:12.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:11:12.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:11:12.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:11:12.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:11:12.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:11:12.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:11:12.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:11:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:11:12.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:11:12.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:11:12.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:11:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:11:13.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:11:13.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:11:13.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:11:13.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:11:13.093 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:11:01
2026-05-29T05:11:13.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70970, datetime.datetime(2026, 5, 29, 5, 11, 1), datetime.datetime(2026, 5, 29, 5, 11, 1), 'salt', 6.76, 83.84, None, 14.29, 114.31, 2.54, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:11:13.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:11:13.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:11:13.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:01, diff=12.101139s, valid=True
2026-05-29T05:11:13.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:11:13.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:11:13.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=1.10457s, valid=True
2026-05-29T05:11:13.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:11:13.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:10:58, diff=15.112371s, valid=True
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:11:13.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:11:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=1.115993s, valid=True
2026-05-29T05:11:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:11:13.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:11:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:11:13.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956915.116785s, valid=True
2026-05-29T05:11:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:11:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:11:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:11:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:11:13.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:11:13.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:11:13.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:11:13.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:11:13.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:11:13.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:11:13.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:11:13.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:11:13.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:11:13.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:11:13.650 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:11:13.990 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:11:14.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:11:14.089 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:11:14.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-29T05:11:14.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-29T05:11:14.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:11:14.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:11:44.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:11:44.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:11:44.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:11:44.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:11:44.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:11:44.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:11:44.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-29T05:11:44.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:11:44.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-29T05:11:44.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:11:44.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:11:44.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:11:44.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-29T05:11:47.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-29T05:11:47.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:11:47.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:11:47.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:11:47.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:11:47.982 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:11:47.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:11:47.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:11:47.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:11:47.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:11:47.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:11:47.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:11:48.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:11:48.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:11:48.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:11:48.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:11:48.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:11:48.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:11:48.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:11:48.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:11:48.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:11:48.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:11:48.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:11:48.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:11:48.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:11:31
2026-05-29T05:11:48.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70971, datetime.datetime(2026, 5, 29, 5, 11, 31), datetime.datetime(2026, 5, 29, 5, 11, 31), 'salt', 7.02, 83.64, None, 15.7, 109.19, 2.57, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:11:48.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:11:48.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:11:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:31, diff=17.390631s, valid=True
2026-05-29T05:11:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:11:48.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:11:48.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=36.395487s, valid=True
2026-05-29T05:11:48.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:11:48.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:11:48.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:28, diff=20.406498s, valid=True
2026-05-29T05:11:48.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:11:48.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:11:48.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:11:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:11:48.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:11:48.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:11:48.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=36.411533s, valid=True
2026-05-29T05:11:48.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:11:48.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:11:48.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:11:48.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956950.412749s, valid=True
2026-05-29T05:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:11:48.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:11:48.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:11:48.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:11:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:11:48.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:11:48.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:11:48.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:11:48.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:11:48.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:11:48.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:11:49.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:11:49.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:11:49.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:11:49.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:11:49.467 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:11:49.467 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:11:49.664 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:11:49.664 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:12:19.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:12:19.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:12:19.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:12:19.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:12:20.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:12:20.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:12:20.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-29T05:12:20.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:12:20.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-29T05:12:20.236 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:12:20.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:12:20.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:12:20.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-29T05:12:22.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-29T05:12:22.668 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:12:22.675 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:12:22.676 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:12:22.676 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:12:22.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:12:22.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:12:22.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:12:22.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:12:22.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:12:22.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:12:22.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:12:22.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:12:22.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:12:22.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:12:22.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:12:22.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:12:22.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:12:22.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:12:23.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:12:23.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:12:23.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:12:23.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:12:23.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:12:23.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:12:02
2026-05-29T05:12:23.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70972, datetime.datetime(2026, 5, 29, 5, 12, 2), datetime.datetime(2026, 5, 29, 5, 12, 1), 'salt', 6.79, 83.67, None, 15.03, 110.16, 2.56, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:12:23.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:12:23.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:12:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:12:01, diff=22.092472s, valid=True
2026-05-29T05:12:23.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:12:23.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:12:23.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=71.09593s, valid=True
2026-05-29T05:12:23.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:12:23.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:12:23.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:58, diff=25.103806s, valid=True
2026-05-29T05:12:23.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:12:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:12:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:12:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:12:23.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:12:23.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:12:23.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=71.107406s, valid=True
2026-05-29T05:12:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:12:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:12:23.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:12:23.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=956985.108226s, valid=True
2026-05-29T05:12:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:12:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:12:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:12:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:12:23.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:12:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:12:23.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:12:23.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:12:23.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:12:23.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:12:23.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:12:23.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:12:23.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:12:23.430 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:12:23.638 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:12:23.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:12:24.077 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:12:24.077 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:12:24.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-29T05:12:24.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-29T05:12:24.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:12:24.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:12:54.249 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:12:54.249 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:12:54.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:12:54.569 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:12:54.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:12:54.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:12:54.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-29T05:12:54.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:12:54.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-29T05:12:54.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:12:54.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:12:54.831 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:12:54.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-29T05:12:57.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-29T05:12:57.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:12:57.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:12:57.130 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:12:57.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:12:57.141 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:12:57.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:12:57.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:12:57.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:12:57.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:12:57.156 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:12:57.156 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:12:57.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:12:57.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:12:57.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:12:57.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:12:57.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:12:57.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:12:57.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:12:57.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:12:57.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:12:57.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:12:57.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:12:57.477 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:12:57.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:12:32
2026-05-29T05:12:57.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70973, datetime.datetime(2026, 5, 29, 5, 12, 32), datetime.datetime(2026, 5, 29, 5, 12, 31), 'salt', 6.66, 83.54, None, 15.88, 114.05, 2.59, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:12:57.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:12:57.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:12:57.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:12:31, diff=26.543238s, valid=True
2026-05-29T05:12:57.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:12:57.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:12:57.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=105.546697s, valid=True
2026-05-29T05:12:57.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:12:57.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:12:57.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:12:29, diff=28.554564s, valid=True
2026-05-29T05:12:57.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:12:57.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:12:57.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:12:57.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:12:57.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:12:57.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:12:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=105.558161s, valid=True
2026-05-29T05:12:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:12:57.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:12:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:12:57.558 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957019.558961s, valid=True
2026-05-29T05:12:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:12:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:12:57.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:12:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:12:57.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:12:57.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:12:57.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:12:57.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:12:57.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:12:57.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:12:57.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:12:57.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:12:57.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:12:57.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:12:58.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:12:58.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:12:58.603 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:12:58.603 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:12: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-29T05:12: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-29T05:12:58.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:12:58.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:13:28.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:13:28.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:13:28.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:13:29.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:13:29.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:13:29.374 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:13: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-29T05:13:29.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:13:29.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-29T05:13:29.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:13:29.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:13:29.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:13:29.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-29T05:13:31.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-29T05:13:31.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:13:31.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:13:31.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:13:31.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:13:31.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:13:31.916 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:13:31.916 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:13:31.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:13:31.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:13:31.918 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:13:31.918 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:13:31.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:13:32.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:13:32.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:13:32.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:13:32.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:13:32.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:13:32.191 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:13:32.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:13:32.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:13:32.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:13:32.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:13:32.233 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:13:32.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:13:02
2026-05-29T05:13:32.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70974, datetime.datetime(2026, 5, 29, 5, 13, 2), datetime.datetime(2026, 5, 29, 5, 13, 1), 'salt', 6.69, 83.71, None, 15.17, 111.8, 2.56, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:13:32.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:13:32.291 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:13:32.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:13:01, diff=31.297073s, valid=True
2026-05-29T05:13:32.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:13:32.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:13:32.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=140.299871s, valid=True
2026-05-29T05:13:32.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:13:32.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:12:59, diff=33.306333s, valid=True
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:13:32.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:13:32.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=140.309315s, valid=True
2026-05-29T05:13:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:13:32.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:13:32.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:13:32.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957054.310207s, valid=True
2026-05-29T05:13:32.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:13:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:13:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:13:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:13:32.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:13:32.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:13:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:13:32.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:13:32.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:13:32.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:13:32.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:13:32.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:13:32.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:13:32.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:13:32.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:13:33.185 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:13:33.284 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:13:33.284 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:13:33.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-29T05:13:33.285 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:13:33.374 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:13:33.374 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:14:03.404 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:14:03.404 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:14:03.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:14:03.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:14:03.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:14:04.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:14:04.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-29T05:14:04.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:14:04.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:14:04.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:14:04.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:14:04.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:14:04.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-29T05:14:06.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-29T05:14:06.434 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:14:06.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:14:06.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:14:06.443 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:14:06.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:14:06.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:14:06.466 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:14:06.466 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:14:06.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:14:06.467 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:14:06.467 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:14:06.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:14:06.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:14:06.597 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:14:06.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:14:06.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:14:06.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:14:06.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:14:06.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:14:06.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:14:06.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:14:06.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:14:06.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:14:06.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:14:03
2026-05-29T05:14:06.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70976, datetime.datetime(2026, 5, 29, 5, 14, 3), datetime.datetime(2026, 5, 29, 5, 14, 2), 'salt', 6.62, 83.87, None, 13.97, 115.63, 2.52, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:14:06.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:14:06.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:14:06.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:14:02, diff=4.860315s, valid=True
2026-05-29T05:14:06.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:14:06.860 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:14:06.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=174.863723s, valid=True
2026-05-29T05:14:06.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:14:06.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:14:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:14:02, diff=4.871658s, valid=True
2026-05-29T05:14:06.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:14:06.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:14:06.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:14:06.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:14:06.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:14:06.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:14:06.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=174.875235s, valid=True
2026-05-29T05:14:06.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:14:06.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:14:06.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:14:06.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957088.876031s, valid=True
2026-05-29T05:14:06.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:14:06.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:14:06.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:14:06.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:14:06.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:14:06.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:14:06.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:14:06.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:14:06.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:14:07.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:14:07.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:14:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:14:07.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:14:07.269 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:14:07.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:14:07.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:14:07.942 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:14:07.942 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:14:07.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-29T05:14:07.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-29T05:14:08.135 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:14:08.135 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:14:38.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:14:38.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:14:38.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:14:38.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:14:38.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:14:38.494 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:14: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-29T05:14:38.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:14:38.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-29T05:14:38.523 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:14:38.523 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:14:38.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:14:38.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-29T05:14:40.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-29T05:14:40.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:14:40.770 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:14:40.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:14:40.771 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:14:40.781 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:14:40.796 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:14:40.797 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:14:40.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:14:40.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:14:40.798 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:14:40.798 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:14:40.805 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:14:40.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:14:40.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:14:41.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:14:41.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:14:41.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:14:41.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:14:41.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:14:41.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:14:41.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:14:41.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:14:41.114 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:14:41.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:14:33
2026-05-29T05:14:41.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70977, datetime.datetime(2026, 5, 29, 5, 14, 33), datetime.datetime(2026, 5, 29, 5, 14, 33), 'salt', 6.59, 83.84, None, 14.64, 107.86, 2.53, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:14:41.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:14:41.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:14:41.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:14:33, diff=8.180973s, valid=True
2026-05-29T05:14:41.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:14:41.181 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:14:41.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=209.184391s, valid=True
2026-05-29T05:14:41.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:14:41.184 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:14:29, diff=12.192267s, valid=True
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:14:41.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:14:41.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=209.195882s, valid=True
2026-05-29T05:14:41.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:14:41.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:14:41.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:14:41.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957123.196682s, valid=True
2026-05-29T05:14:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:14:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:14:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:14:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:14:41.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:14:41.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:14:41.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:14:41.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:14:41.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:14:41.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:14:41.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:14:41.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:14:41.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:14:41.524 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:14:41.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:14:42.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:14:42.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:14:42.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:14:42.173 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:14:42.173 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:14:42.358 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:14:42.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:15:12.388 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:15:12.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:15:12.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:15:12.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:15:12.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:15:12.823 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:15:12.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-29T05:15:12.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:15:12.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:15:12.850 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:15:12.850 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:15:12.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:15:12.854 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:15:15.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-29T05:15:15.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:15:15.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:15:15.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:15:15.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:15:15.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:15:15.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:15:15.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:15:15.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:15:15.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:15:15.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:15:15.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:15:15.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:15:15.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:15:15.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:15:15.539 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:15:15.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:15:15.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:15:15.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:15:15.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T05:15:15.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:15:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:15:15.633 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:15:15.633 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:15:15.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:15:03
2026-05-29T05:15:15.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70978, datetime.datetime(2026, 5, 29, 5, 15, 3), datetime.datetime(2026, 5, 29, 5, 15, 3), 'salt', 6.62, 83.81, None, 13.55, 113.26, 2.53, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:15:15.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:15:15.696 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:15:15.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:15:03, diff=12.703472s, valid=True
2026-05-29T05:15:15.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:15:15.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:15:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=243.70703s, valid=True
2026-05-29T05:15:15.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:15:15.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:15:00, diff=15.715222s, valid=True
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:15:15.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T05:15:15.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:11:12, diff=243.71905s, valid=True
2026-05-29T05:15:15.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:15:15.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:15:15.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:15:15.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957157.719868s, valid=True
2026-05-29T05:15:15.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:15:15.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:15:15.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:15:15.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:15:15.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:15:15.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:15:15.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:15:15.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:15:15.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:15:15.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:15:15.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:15:15.953 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:15:16.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:15:16.043 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:15:16.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:15:16.596 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:15:16.695 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:15:16.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:15:16.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-29T05:15:16.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-29T05:15:16.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:15:16.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:15:46.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:15:46.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:15: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-29T05:15:47.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:15:47.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:15:47.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:15:47.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-29T05:15:47.686 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:15:47.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-29T05:15:47.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:15:47.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:15:47.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:15:47.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-29T05:15:50.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:15:50.502 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:15:50.510 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:15:50.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:15:50.511 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:15:50.520 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:15:50.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:15:50.534 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:15:50.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:15:50.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:15:50.535 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:15:50.535 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:15:50.540 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:15:50.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:15:50.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:15:50.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:15:50.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:15:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:15:50.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:15:50.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:15:50.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:15:50.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:15:50.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:15:50.856 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:15:50.917 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:15:34
2026-05-29T05:15:50.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70979, datetime.datetime(2026, 5, 29, 5, 15, 34), datetime.datetime(2026, 5, 29, 5, 15, 33), 'salt', 6.59, 83.81, None, 14.33, 115.21, 2.54, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:15:50.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:15:50.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:15:50.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:15:33, diff=17.924213s, valid=True
2026-05-29T05:15:50.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:15:50.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:15:50.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:12, diff=-21.072386s, valid=True
2026-05-29T05:15:50.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:15:50.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:15:50.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:15:30, diff=20.935572s, valid=True
2026-05-29T05:15:50.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:15:50.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:15:50.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:15:50.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:15:50.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:15:50.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:15:50.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:12, diff=-21.060829s, valid=True
2026-05-29T05:15:50.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:15:50.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:15:50.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:15:50.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957192.939983s, valid=True
2026-05-29T05:15:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:15:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:15:50.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:15:50.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:15:50.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:15:51.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:15:51.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:15:51.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:15:51.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:15:51.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:15:51.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:15:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:15:51.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:15:51.262 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:15:51.472 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:15:51.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:15:51.968 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:15:51.968 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:15:51.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-29T05:15:51.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-29T05:15:52.111 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:15:52.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:16:22.132 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:16:22.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:16:22.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:16:22.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:16:22.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:16:22.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:16:22.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-29T05:16:22.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:16:22.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-29T05:16:22.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:16:22.530 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:16:22.536 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:16:22.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-29T05:16:25.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-29T05:16:25.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:16:25.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:16:25.515 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:16:25.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:16:25.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:16:25.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:16:25.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:16:25.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:16:25.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:16:25.541 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:16:25.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:16:25.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:16:25.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:16:25.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:16:25.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:16:25.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:16:25.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:16:25.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:16:25.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T05:16:25.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:16:25.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:16:25.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:16:25.857 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:16:25.914 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:16:04
2026-05-29T05:16:25.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70980, datetime.datetime(2026, 5, 29, 5, 16, 4), datetime.datetime(2026, 5, 29, 5, 16, 4), 'salt', 6.49, 83.74, None, 15.35, 109.48, 2.54, 832.01, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:16:25.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:16:25.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:16:25.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:04, diff=21.922306s, valid=True
2026-05-29T05:16:25.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:16:25.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:16:25.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:12, diff=13.925767s, valid=True
2026-05-29T05:16:25.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:16:25.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:16:25.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:00, diff=25.933801s, valid=True
2026-05-29T05:16:25.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:16:25.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:16:25.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:16:25.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:16:25.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:16:25.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T05:16:25.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:12, diff=13.937429s, valid=True
2026-05-29T05:16:25.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:16:25.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:16:25.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:16:25.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957227.938225s, valid=True
2026-05-29T05:16:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:16:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:16:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:16:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:16:25.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:16:26.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:16:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:16:26.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:16:26.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:16:26.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:16:26.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:16:26.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:16:26.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:16:26.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:16:26.467 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:16:26.807 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:16:26.905 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:16:26.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:16:26.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-29T05:16:26.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-29T05:16:27.067 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:16:27.068 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:16:57.098 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:16:57.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:16:57.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:16:57.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:16:57.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:16:57.770 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:16:57.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-29T05:16:57.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:16:57.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-29T05:16:57.800 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:16:57.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:16:57.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:16:57.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-29T05:17:00.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-29T05:17:00.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:17:00.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:17:00.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:17:00.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:17:00.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:17:00.128 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:17:00.128 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:17:00.128 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:17:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:17:00.129 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:17:00.129 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:17:00.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:17:00.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:17:00.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:17:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:17:00.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:17:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:17:00.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:17:00.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:17:00.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:17:00.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:17:00.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:17:00.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:17:00.445 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:16:35
2026-05-29T05:17:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70981, datetime.datetime(2026, 5, 29, 5, 16, 35), datetime.datetime(2026, 5, 29, 5, 16, 34), 'salt', 6.49, 83.74, None, 15.28, 111.14, 2.54, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:17:00.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:17:00.445 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:17:00.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:34, diff=26.451885s, valid=True
2026-05-29T05:17:00.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:17:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:17:00.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:17:12, diff=-11.545006s, valid=True
2026-05-29T05:17:00.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:17:00.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:16:31, diff=29.462187s, valid=True
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:17:00.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:17:00.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:17:12, diff=-11.534502s, valid=True
2026-05-29T05:17:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:17:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:17:00.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:17:00.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957262.466223s, valid=True
2026-05-29T05:17:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:17:00.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:17:00.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:17:00.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:17:00.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:17:00.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:17:00.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:17:00.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:17:00.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:17:00.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:17:00.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:17:00.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:17:00.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:17:00.785 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:17:00.994 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:17:01.407 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:17:01.506 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:17:01.506 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:17:01.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-29T05:17:01.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-29T05:17:01.728 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:17:01.728 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:17:31.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:17:31.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:17:31.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:17:32.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:17:32.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:17:32.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:17:32.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-29T05:17:32.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:17:32.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-29T05:17:32.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:17:32.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:17:32.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:17:32.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-29T05:17:35.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-29T05:17:35.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:17:35.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:17:35.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:17:35.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:17:35.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:17:35.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:17:35.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:17:35.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:17:35.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:17:35.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:17:35.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:17:35.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:17:35.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:17:35.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:17:35.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:17:35.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:17:35.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:17:35.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:17:35.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:17:35.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:17:35.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:17:35.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:17:35.527 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:17:35.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:17:35
2026-05-29T05:17:35.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70983, datetime.datetime(2026, 5, 29, 5, 17, 35), datetime.datetime(2026, 5, 29, 5, 17, 35), 'salt', 6.66, 83.71, None, 15.63, 111.4, 2.56, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:17:35.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:17:35.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:17:35.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:17:35, diff=0.59523s, valid=True
2026-05-29T05:17:35.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:17:35.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:17:35.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:12, diff=-36.401333s, valid=True
2026-05-29T05:17:35.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:17:35.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:17:35.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:17:31, diff=4.606682s, valid=True
2026-05-29T05:17:35.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:17:35.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:17:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:17:35.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:17:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:17:35.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:17:35.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:12, diff=-36.389634s, valid=True
2026-05-29T05:17:35.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:17:35.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:17:35.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:17:35.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957297.611182s, valid=True
2026-05-29T05:17:35.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:17:35.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:17:35.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:17:35.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:17:35.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:17:35.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:17:35.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:17:35.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:17:35.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:17:35.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:17:35.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:17:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:17:35.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:17:35.938 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:17:36.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:17:36.492 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:17:36.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:17:36.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:17:36.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-29T05:17:36.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-29T05:17:36.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:17:36.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:18:06.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:18:06.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:18:06.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:18:07.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:18:07.287 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:18:07.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:18:07.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-29T05:18:07.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:18:07.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-29T05:18:07.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:18:07.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:18:07.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:18:07.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-29T05:18:09.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:18:09.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:18:09.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:18:09.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:18:09.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:18:09.952 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:18:09.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:18:09.965 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:18:09.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:18:09.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:18:09.965 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:18:09.965 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:18:09.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:18:10.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:18:10.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:18:10.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:18:10.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:18:10.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:18:10.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:18:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:18:10.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:18:10.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:18:10.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:18:10.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:18:10.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:18:05
2026-05-29T05:18:10.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70984, datetime.datetime(2026, 5, 29, 5, 18, 5), datetime.datetime(2026, 5, 29, 5, 18, 5), 'salt', 6.59, 83.71, None, 15.39, 107.76, 2.55, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:18:10.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:18:10.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:18:10.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:05, diff=5.31082s, valid=True
2026-05-29T05:18:10.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:18:10.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:18:10.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:12, diff=-1.685766s, valid=True
2026-05-29T05:18:10.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:18:10.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:03, diff=7.321535s, valid=True
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:18:10.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:18:10.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:18:10.324 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:12, diff=-1.675124s, valid=True
2026-05-29T05:18:10.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:18:10.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:18:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:18:10.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957332.325629s, valid=True
2026-05-29T05:18:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:18:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:18:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:18:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:18:10.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:18:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:18:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:18:10.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:18:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:18:10.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:18:10.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:18:10.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:18:10.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:18:10.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:18:10.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:18:11.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:18:11.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:18:11.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:18:11.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-29T05:18:11.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-29T05:18:11.615 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:18:11.615 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:18:41.618 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:18:41.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:18:41.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:18:41.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:18:41.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:18:41.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:18:41.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-29T05:18:41.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:18:41.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:18:42.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:18:42.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:18:42.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:18:42.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-29T05:18:44.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-29T05:18:44.306 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:18:44.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:18:44.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:18:44.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:18:44.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:18:44.337 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:18:44.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:18:44.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:18:44.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:18:44.339 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:18:44.339 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:18:44.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:18:44.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:18:44.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:18:44.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:18:44.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:18:44.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:18:44.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:18:44.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:18:44.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:18:44.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:18:44.676 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:18:44.676 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:18:44.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:18:36
2026-05-29T05:18:44.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70985, datetime.datetime(2026, 5, 29, 5, 18, 36), datetime.datetime(2026, 5, 29, 5, 18, 35), 'salt', 6.62, 83.64, None, 15.35, 110.67, 2.56, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:18:44.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:18:44.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:18:44.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:35, diff=9.745846s, valid=True
2026-05-29T05:18:44.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:18:44.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:18:44.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:12, diff=-27.250711s, valid=True
2026-05-29T05:18:44.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:18:44.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:18:34, diff=10.757254s, valid=True
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:18:44.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:18:44.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:12, diff=-27.23907s, valid=True
2026-05-29T05:18:44.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:18:44.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:18:44.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:18:44.761 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957366.761735s, valid=True
2026-05-29T05:18:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:18:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:18:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:18:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:18:44.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:18:44.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:18:44.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:18:44.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:18:44.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:18:44.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:18:44.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:18:44.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:18:45.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:18:45.084 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:18:45.293 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:18:45.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:18:45.730 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:18:45.730 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:18:45.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-29T05:18:45.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-29T05:18:45.984 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:18:45.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:19:15.998 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:19:15.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:19:15.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:19:16.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:19:16.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:19:16.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:19:16.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-29T05:19:16.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:19:16.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-29T05:19:16.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:19:16.745 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:19:16.749 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:19:16.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-29T05:19:19.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:19:19.187 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:19:19.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:19:19.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:19:19.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:19:19.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:19:19.219 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:19:19.219 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:19:19.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:19:19.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:19:19.221 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:19:19.221 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:19:19.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:19:19.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:19:19.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:19:19.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:19:19.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:19:19.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:19:19.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:19:19.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:19:19.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:19:19.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:19:19.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:19:19.542 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:19:19.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:19:06
2026-05-29T05:19:19.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70986, datetime.datetime(2026, 5, 29, 5, 19, 6), datetime.datetime(2026, 5, 29, 5, 19, 5), 'salt', 6.56, 83.64, None, 15.21, 109.17, 2.57, 831.89, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:19:19.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:19:19.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:19:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:05, diff=14.617434s, valid=True
2026-05-29T05:19:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:19:19.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:19:19.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:12, diff=7.620959s, valid=True
2026-05-29T05:19:19.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:19:19.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:19:19.628 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:06, diff=13.628975s, valid=True
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:19:19.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:19:19.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:12, diff=7.63263s, valid=True
2026-05-29T05:19:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:19:19.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:19:19.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:19:19.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957401.633409s, valid=True
2026-05-29T05:19:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:19:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:19:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:19:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:19:19.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:19:19.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:19:19.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:19:19.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:19:19.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:19:19.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:19:19.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:19:19.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:19:20.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:19:20.050 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:19:20.265 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:19:20.607 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:19:20.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:19:20.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:19:20.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-29T05:19:20.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-29T05:19:20.954 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:19:20.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:19:50.985 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:19:50.985 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:19:50.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:19:51.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:19:51.472 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:19:51.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:19:51.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:19:51.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:19:51.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:19:51.728 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:19:51.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:19:51.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:19:51.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-29T05:19:54.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-29T05:19:54.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:19:54.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:19:54.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:19:54.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:19:54.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:19:54.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:19:54.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:19:54.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:19:54.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:19:54.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:19:54.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:19:54.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:19:54.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:19:54.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:19:54.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:19:54.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:19:54.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:19:54.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:19:54.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:19:54.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:19:54.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:19:54.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:19:54.536 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:19:54.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:19:36
2026-05-29T05:19:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70987, datetime.datetime(2026, 5, 29, 5, 19, 36), datetime.datetime(2026, 5, 29, 5, 19, 36), 'salt', 6.62, 83.71, None, 16.55, 109.94, 2.55, 832.01, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:19:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:19:54.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:19:54.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:36, diff=18.605099s, valid=True
2026-05-29T05:19:54.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:19:54.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:19:54.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:12, diff=-17.391496s, valid=True
2026-05-29T05:19:54.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:19:54.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:19:32, diff=22.616446s, valid=True
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:19:54.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:19:54.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:19:54.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:12, diff=-17.379839s, valid=True
2026-05-29T05:19:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:19:54.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:19:54.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:19:54.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957436.620974s, valid=True
2026-05-29T05:19:54.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:19:54.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:19:54.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:19:54.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:19:54.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:19:54.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:19:54.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:19:54.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:19:54.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:19:54.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:19:54.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:19:54.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:19:54.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:19:54.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:19:55.153 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:19:55.497 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:19:55.598 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:19:55.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:19:55.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-29T05:19:55.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-29T05:19:55.830 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:19:55.830 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:20:25.831 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:20:25.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:20:25.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:20:26.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:20:26.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:20:26.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:20:26.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-29T05:20:26.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:20:26.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-29T05:20:26.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:20:26.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:20:26.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:20:26.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:20:28.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:20:28.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:20:28.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:20:28.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:20:28.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:20:28.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:20:28.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:20:28.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:20:28.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:20:28.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:20:28.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:20:28.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:20:28.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:20:28.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:20:28.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:20:28.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:20:28.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:20:29.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:20:29.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:20:29.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:20:29.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:20:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:20:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:20:29.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:20:29.129 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:20:06
2026-05-29T05:20:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70988, datetime.datetime(2026, 5, 29, 5, 20, 6), datetime.datetime(2026, 5, 29, 5, 20, 6), 'salt', 6.62, 83.71, None, 16.27, 101.05, 2.55, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:20:29.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:20:29.129 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:20:29.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:06, diff=23.136503s, valid=True
2026-05-29T05:20:29.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:20:29.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:20:29.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:12, diff=17.139887s, valid=True
2026-05-29T05:20:29.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:20:29.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:20:29.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:03, diff=26.147663s, valid=True
2026-05-29T05:20:29.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:20:29.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:20:29.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:20:29.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:20:29.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:20:29.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:20:29.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:12, diff=17.151273s, valid=True
2026-05-29T05:20:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:20:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:20:29.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:20:29.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957471.15207s, valid=True
2026-05-29T05:20:29.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:20:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:20:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:20:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:20:29.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:20:29.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:20:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:20:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:20:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:20:29.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:20:29.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:20:29.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:20:29.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:20:29.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:20:29.749 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:20:30.103 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:20:30.206 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:20:30.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:20:30.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-29T05:20:30.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-29T05:20:30.410 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:20:30.410 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:21:00.423 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:21:00.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:21:00.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:21:00.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:21:00.768 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:21:00.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:21:00.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-29T05:21:01.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:21:01.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-29T05:21:01.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:21:01.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:21:01.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:21:01.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-29T05:21:03.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-29T05:21:03.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:21:03.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:21:03.474 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:21:03.474 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:21:03.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:21:03.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:21:03.497 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:21:03.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:21:03.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:21:03.499 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:21:03.499 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:21:03.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:21:03.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:21:03.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:21:03.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:21:03.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:21:03.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:21:03.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:21:03.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:21:03.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:21:03.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:21:03.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:21:03.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:21:03.928 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:20:37
2026-05-29T05:21:03.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70989, datetime.datetime(2026, 5, 29, 5, 20, 37), datetime.datetime(2026, 5, 29, 5, 20, 36), 'salt', 6.59, 83.64, None, 15.67, 99.68, 2.56, 831.83, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:21:03.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:21:03.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:21:03.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:36, diff=27.934486s, valid=True
2026-05-29T05:21:03.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:21:03.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:21:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:21:12, diff=-8.062661s, valid=True
2026-05-29T05:21:03.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:21:03.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:20:33, diff=30.944047s, valid=True
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:21:03.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:21:03.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:21:12, diff=-8.052972s, valid=True
2026-05-29T05:21:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:21:03.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:21:03.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:21:03.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957505.947687s, valid=True
2026-05-29T05:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:21:03.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:21:04.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:21:04.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:21:04.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:21:04.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:21:04.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:21:04.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:21:04.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:21:04.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:21:04.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:21:04.518 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:21:04.857 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:21:04.958 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:21:04.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:21:04.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-29T05:21:04.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-29T05:21:05.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:21:05.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:21:35.183 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:21:35.183 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:21:35.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:21:35.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:21:35.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:21:35.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:21:35.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-29T05:21:35.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:21:35.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-29T05:21:35.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:21:35.938 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:21:35.942 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:21:35.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-29T05:21:38.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-29T05:21:38.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:21:38.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:21:38.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:21:38.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:21:38.398 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:21:38.411 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:21:38.411 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:21:38.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:21:38.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:21:38.412 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:21:38.413 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:21:38.419 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:21:38.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:21:38.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:21:38.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:21:38.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:21:38.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:21:38.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:21:38.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:21:38.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:21:38.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:21:38.745 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:21:38.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:21:38.805 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:21:37
2026-05-29T05:21:38.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70991, datetime.datetime(2026, 5, 29, 5, 21, 37), datetime.datetime(2026, 5, 29, 5, 21, 37), 'salt', 6.69, 83.74, None, 16.09, 106.19, 2.55, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:21:38.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:21:38.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:21:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:21:37, diff=1.813266s, valid=True
2026-05-29T05:21:38.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:21:38.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:21:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:12, diff=-33.183417s, valid=True
2026-05-29T05:21:38.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:21:38.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:21:34, diff=4.824072s, valid=True
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:21:38.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:21:38.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:12, diff=-33.169684s, valid=True
2026-05-29T05:21:38.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:21:38.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:21:38.830 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:21:38.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957540.831122s, valid=True
2026-05-29T05:21:38.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:21:38.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:21:38.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:21:38.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:21:38.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:21:38.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:21:38.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:21:38.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:21:38.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:21:38.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:21:39.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:21:39.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:21:39.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:21:39.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:21:39.385 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:21:39.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:21:39.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:21:39.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:21:39.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-29T05:21:39.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-29T05:21:40.051 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:21:40.052 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:22:10.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:22:10.078 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:22:10.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:22:10.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:22:10.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:22:10.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:22:10.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-29T05:22:10.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:22:10.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-29T05:22:10.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:22:10.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:22:10.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:22:10.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-29T05:22:13.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-29T05:22:13.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:22:13.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:22:13.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:22:13.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:22:13.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:22:13.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:22:13.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:22:13.274 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:22:13.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:22:13.275 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:22:13.275 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:22:13.280 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:22:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:22:13.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:22:13.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:22:13.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:22:13.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:22:13.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:22:13.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:22:13.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:22:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:22:13.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:22:13.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:22:13.663 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:22:07
2026-05-29T05:22:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70992, datetime.datetime(2026, 5, 29, 5, 22, 7), datetime.datetime(2026, 5, 29, 5, 22, 7), 'salt', 6.59, 83.71, None, 15.7, 104.99, 2.55, 832.01, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:22:13.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:22:13.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:22:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:07, diff=6.671308s, valid=True
2026-05-29T05:22:13.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:22:13.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:22:13.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:12, diff=1.674749s, valid=True
2026-05-29T05:22:13.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:22:13.674 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:22:13.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:04, diff=9.68265s, valid=True
2026-05-29T05:22:13.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:22:13.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:22:13.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:22:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:22:13.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:22:13.683 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:22:13.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:12, diff=1.686316s, valid=True
2026-05-29T05:22:13.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:22:13.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:22:13.686 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:22:13.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957575.68721s, valid=True
2026-05-29T05:22:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:22:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:22:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:22:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:22:13.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:22:13.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:22:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:22:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:22:13.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:22:13.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:22:13.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:22:13.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:22:13.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:22:14.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:22:14.217 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:22:14.556 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:22:14.655 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:22:14.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:22:14.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-29T05:22:14.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-29T05:22:14.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:22:14.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:22:44.857 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:22:44.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:22:44.858 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:22:45.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:22:45.155 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:22:45.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:22:45.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-29T05:22:45.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:22:45.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-29T05:22:45.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:22:45.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:22:45.488 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:22:45.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-29T05:22:47.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-29T05:22:47.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:22:47.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:22:47.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:22:47.805 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:22:47.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:22:47.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:22:47.828 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:22:47.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:22:47.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:22:47.829 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:22:47.829 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:22:47.834 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:22:47.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:22:47.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:22:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:22:48.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:22:48.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:22:48.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:22:48.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:22:48.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:22:48.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:22:48.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:22:48.152 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:22:48.213 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:22:38
2026-05-29T05:22:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70993, datetime.datetime(2026, 5, 29, 5, 22, 38), datetime.datetime(2026, 5, 29, 5, 22, 37), 'salt', 6.72, 83.81, None, 15.39, 107.06, 2.54, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:22:48.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:22:48.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:22:48.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:37, diff=11.220911s, valid=True
2026-05-29T05:22:48.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:22:48.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:22:48.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:12, diff=-23.775655s, valid=True
2026-05-29T05:22:48.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:22:48.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:22:34, diff=14.232248s, valid=True
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:22:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:22:48.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:12, diff=-23.764059s, valid=True
2026-05-29T05:22:48.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:22:48.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:22:48.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:22:48.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957610.236756s, valid=True
2026-05-29T05:22:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:22:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:22:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:22:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:22:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:22:48.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:22:48.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:22:48.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:22:48.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:22:48.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:22:48.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:22:48.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:22:48.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:22:48.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:22:48.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:22:49.108 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:22:49.208 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:22:49.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:22: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-29T05:22: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-29T05:22:49.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:22:49.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:23:19.530 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:23:19.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:23:19.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:23:19.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:23:19.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:23:20.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:23:20.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-29T05:23:20.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:23:20.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-29T05:23:20.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:23:20.082 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:23:20.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:23:20.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-29T05:23:22.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:23:22.513 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:23:22.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:23:22.521 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:23:22.521 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:23:22.532 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:23:22.544 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:23:22.545 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:23:22.545 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:23:22.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:23:22.546 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:23:22.546 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:23:22.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:23:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:23:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:23:22.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:23:22.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:23:22.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:23:22.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:23:22.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:23:22.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:23:22.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:23:22.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:23:22.884 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:23:22.944 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:23:08
2026-05-29T05:23:22.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70994, datetime.datetime(2026, 5, 29, 5, 23, 8), datetime.datetime(2026, 5, 29, 5, 23, 8), 'salt', 6.56, 84.14, None, 15.39, 98.7, 2.48, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:23:22.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:23:22.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:23:22.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:08, diff=14.951846s, valid=True
2026-05-29T05:23:22.951 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:23:22.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:23:22.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:12, diff=10.955245s, valid=True
2026-05-29T05:23:22.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:23:22.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:04, diff=18.963075s, valid=True
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:23:22.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:23:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:12, diff=10.966697s, valid=True
2026-05-29T05:23:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:23:22.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:23:22.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:23:22.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957644.967484s, valid=True
2026-05-29T05:23:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:23:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:23:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:23:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:23:22.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:23:23.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:23:23.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:23:23.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:23:23.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:23:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:23:23.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:23:23.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:23:23.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:23:23.288 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:23:23.552 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:23:23.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:23:23.989 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:23:23.989 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:23:23.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-29T05:23:23.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-29T05:23:24.272 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:23:24.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:23:54.303 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:23:54.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:23:54.303 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:23:54.624 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:23:54.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:23:54.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:23:54.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-29T05:23:54.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:23:54.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:23:54.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:23:54.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:23:54.889 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:23:54.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:23:57.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-29T05:23:57.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:23:57.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:23:57.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:23:57.390 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:23:57.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:23:57.413 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:23:57.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:23:57.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:23:57.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:23:57.415 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:23:57.415 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:23:57.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:23:57.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:23:57.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:23:57.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:23:57.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:23:57.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:23:57.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:23:57.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:23:57.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:23:57.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:23:57.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:23:57.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:23:57.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:23:38
2026-05-29T05:23:57.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70995, datetime.datetime(2026, 5, 29, 5, 23, 38), datetime.datetime(2026, 5, 29, 5, 23, 38), 'salt', 6.66, 83.91, None, 16.37, 103.72, 2.52, 832.01, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:23:57.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:23:57.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:23:57.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:38, diff=19.804816s, valid=True
2026-05-29T05:23:57.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:23:57.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:23:57.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:12, diff=-14.191836s, valid=True
2026-05-29T05:23:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:23:57.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:23:36, diff=21.816017s, valid=True
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:23:57.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:23:57.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:12, diff=-14.180369s, valid=True
2026-05-29T05:23:57.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:23:57.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:23:57.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:23:57.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957679.820419s, valid=True
2026-05-29T05:23:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:23:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:23:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:23:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:23:57.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:23:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:23:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:23:57.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:23:57.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:23:57.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:23:58.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:23:58.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:23:58.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:23:58.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:23:58.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:23:58.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:23:58.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:23:58.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:23:58.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-29T05:23:58.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-29T05:23:58.884 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:23:58.884 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:24:28.914 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:24:28.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:24:28.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:24:29.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:24:29.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:24:29.483 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:24:29.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-29T05:24:29.500 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:24:29.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-29T05:24:29.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:24:29.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:24:29.518 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:24:29.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-29T05:24:31.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-29T05:24:31.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:24:31.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:24:31.825 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:24:31.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:24:31.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:24:31.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:24:31.849 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:24:31.850 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:24:31.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:24:31.850 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:24:31.850 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:24:31.858 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:24:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:24:31.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:24:32.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:24:32.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:24:32.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:24:32.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:24:32.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:24:32.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:24:32.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:24:32.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:24:32.199 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:24:32.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:24:08
2026-05-29T05:24:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70996, datetime.datetime(2026, 5, 29, 5, 24, 8), datetime.datetime(2026, 5, 29, 5, 24, 8), 'salt', 6.62, 83.94, None, 16.55, 100.2, 2.51, 832.07, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:24:32.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:24:32.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:24:32.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:08, diff=24.267356s, valid=True
2026-05-29T05:24:32.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:24:32.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:24:32.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:12, diff=20.270305s, valid=True
2026-05-29T05:24:32.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:24:32.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:07, diff=25.27713s, valid=True
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:24:32.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:24:32.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:12, diff=20.280213s, valid=True
2026-05-29T05:24:32.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:24:32.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:24:32.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:24:32.280 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957714.280904s, valid=True
2026-05-29T05:24:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:24:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:24:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:24:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:24:32.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:24:32.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:24:32.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:24:32.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:24:32.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:24:32.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:24:32.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:24:32.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:24:32.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:24:32.676 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:24:32.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:24:33.251 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:24:33.351 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:24:33.351 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:24:33.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-29T05:24:33.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-29T05:24:33.537 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:24:33.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:25:03.567 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:25:03.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:25:03.568 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:25:03.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:25:03.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:25:03.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:25:03.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-29T05:25:03.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:25:03.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-29T05:25:03.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:25:03.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:25:03.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:25:03.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-29T05:25:06.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-29T05:25:06.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:25:06.329 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:25:06.330 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:25:06.330 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:25:06.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:25:06.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:25:06.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:25:06.355 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:25:06.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:25:06.356 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:25:06.356 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:25:06.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:25:06.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:25:06.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:25:06.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:25:06.591 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:25:06.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:25:06.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:25:06.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:25:06.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:25:06.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:25:06.685 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:25:06.685 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:25:06.745 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:24:39
2026-05-29T05:25:06.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70997, datetime.datetime(2026, 5, 29, 5, 24, 39), datetime.datetime(2026, 5, 29, 5, 24, 38), 'salt', 6.59, 83.84, None, 15.74, 103.98, 2.53, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:25:06.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:25:06.745 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:25:06.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:38, diff=28.752731s, valid=True
2026-05-29T05:25:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:25:06.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:25:06.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:25:12, diff=-5.243757s, valid=True
2026-05-29T05:25:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:25:06.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:24:35, diff=31.764422s, valid=True
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:25:06.764 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:25:06.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:25:12, diff=-5.231812s, valid=True
2026-05-29T05:25:06.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:25:06.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:25:06.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:25:06.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957748.76902s, valid=True
2026-05-29T05:25:06.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:25:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:25:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:25:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:25:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:25:06.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:25:06.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:25:06.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:25:06.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:25:06.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:25:06.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:25:07.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:25:07.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:25:07.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:25:07.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:25:07.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:25:07.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:25:07.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:25:07.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-29T05:25:07.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-29T05:25:08.004 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:25:08.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:25:38.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:25:38.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:25:38.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:25:38.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:25:38.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:25:38.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:25:38.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-29T05:25:38.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:25:38.553 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:25:38.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:25:38.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:25:38.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:25:38.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-29T05:25:40.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-29T05:25:40.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:25:40.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:25:40.967 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:25:40.967 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:25:40.976 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:25:40.989 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:25:40.989 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:25:40.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:25:40.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:25:40.990 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:25:40.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:25:40.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:25:41.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:25:41.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:25:41.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:25:41.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:25:41.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:25:41.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:25:41.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:25:41.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:25:41.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:25:41.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:25:41.312 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:25:41.372 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:25:39
2026-05-29T05:25:41.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(70999, datetime.datetime(2026, 5, 29, 5, 25, 39), datetime.datetime(2026, 5, 29, 5, 25, 39), 'salt', 6.69, 83.87, None, 15.77, 100.72, 2.53, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:25:41.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:25:41.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:25:41.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:25:39, diff=2.379806s, valid=True
2026-05-29T05:25:41.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:25:41.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:25:41.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:12, diff=-30.616709s, valid=True
2026-05-29T05:25:41.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:25:41.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:25:36, diff=5.391309s, valid=True
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:25:41.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:25:41.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:12, diff=-30.605s, valid=True
2026-05-29T05:25:41.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:25:41.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:25:41.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:25:41.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957783.395816s, valid=True
2026-05-29T05:25:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:25:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:25:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:25:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:25:41.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:25:41.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:25:41.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:25:41.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:25:41.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:25:41.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:25:41.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:25:41.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:25:41.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:25:41.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:25:42.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:25:42.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:25:42.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:25:42.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:25:42.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-29T05:25:42.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-29T05:25:42.542 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:25:42.542 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:26:12.572 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:26:12.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:26:12.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:26:13.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:26:13.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:26:13.248 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:26:13.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-29T05:26:13.263 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:26:13.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-29T05:26:13.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:26:13.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:26:13.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:26:13.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:26:15.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-29T05:26:15.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:26:15.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:26:15.815 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:26:15.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:26:15.827 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:26:15.839 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:26:15.839 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:26:15.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:26:15.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:26:15.841 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:26:15.841 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:26:15.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:26:15.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:26:15.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:26:16.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:26:16.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:26:16.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:26:16.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:26:16.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:26:16.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:26:16.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:26:16.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:26:16.160 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:26:16.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:26:09
2026-05-29T05:26:16.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71000, datetime.datetime(2026, 5, 29, 5, 26, 9), datetime.datetime(2026, 5, 29, 5, 26, 9), 'salt', 6.66, 83.84, None, 15.49, 92.71, 2.53, 832.01, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:26:16.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:26:16.218 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:26:16.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:09, diff=7.225835s, valid=True
2026-05-29T05:26:16.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:26:16.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:26:16.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:12, diff=4.229248s, valid=True
2026-05-29T05:26:16.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:26:16.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:06, diff=10.23725s, valid=True
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:26:16.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:26:16.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:12, diff=4.240862s, valid=True
2026-05-29T05:26:16.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:26:16.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:26:16.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:26:16.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957818.241653s, valid=True
2026-05-29T05:26:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:26:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:26:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:26:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:26:16.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:26:16.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:26:16.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:26:16.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:26:16.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:26:16.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:26:16.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:26:16.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:26:16.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:26:16.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:26:16.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:26:17.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:26:17.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:26:17.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:26:17.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-29T05:26:17.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-29T05:26:17.405 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:26:17.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:26:47.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:26:47.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:26:47.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:26:47.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:26:47.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:26:47.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:26:47.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-29T05:26:47.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:26:47.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-29T05:26:47.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:26:47.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:26:47.916 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:26:47.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-29T05:26: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-29T05:26:50.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:26:50.345 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:26:50.346 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:26:50.346 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:26:50.357 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:26:50.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:26:50.374 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:26:50.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:26:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:26:50.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:26:50.376 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:26:50.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:26:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:26:50.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:26:50.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:26:50.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:26:50.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:26:50.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:26:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:26:50.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:26:50.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:26:50.700 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:26:50.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:26:50.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:26:40
2026-05-29T05:26:50.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71001, datetime.datetime(2026, 5, 29, 5, 26, 40), datetime.datetime(2026, 5, 29, 5, 26, 39), 'salt', 6.62, 83.94, None, 16.44, 97.99, 2.51, 832.07, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:26:50.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:26:50.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:26:50.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:39, diff=11.767344s, valid=True
2026-05-29T05:26:50.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:26:50.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:26:50.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:12, diff=-21.229189s, valid=True
2026-05-29T05:26:50.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:26:50.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:26:50.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:26:36, diff=14.778615s, valid=True
2026-05-29T05:26:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:26:50.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:26:50.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:26:50.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:26:50.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:26:50.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:26:50.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:12, diff=-21.217776s, valid=True
2026-05-29T05:26:50.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:26:50.782 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:26:50.782 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:26:50.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957852.783022s, valid=True
2026-05-29T05:26:50.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:26:50.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:26:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:26:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:26:50.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:26:50.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:26:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:26:50.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:26:50.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:26:50.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:26:51.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:26:51.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:26:51.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:26:51.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:26:51.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:26:51.722 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:26:51.822 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:26:51.822 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:26:51.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-29T05:26:51.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-29T05:26:52.105 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:26:52.105 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:27:22.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:27:22.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:27:22.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:27:22.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:27:22.446 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:27:22.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:27:22.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-29T05:27:22.684 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:27:22.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-29T05:27:22.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:27:22.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:27:22.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:27:22.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-29T05:27:25.026 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:27:25.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:27:25.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:27:25.035 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:27:25.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:27:25.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:27:25.059 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:27:25.060 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:27:25.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:27:25.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:27:25.061 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:27:25.061 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:27:25.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:27:25.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:27:25.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:27:25.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:27:25.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:27:25.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:27:25.340 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:27:25.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:27:25.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:27:25.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:27:25.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:27:25.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:27:25.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:27:10
2026-05-29T05:27:25.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71002, datetime.datetime(2026, 5, 29, 5, 27, 10), datetime.datetime(2026, 5, 29, 5, 27, 10), 'salt', 6.72, 84.07, None, 14.89, 97.55, 2.49, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:27:25.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:27:25.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:27:25.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:10, diff=15.456135s, valid=True
2026-05-29T05:27:25.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:27:25.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:27:25.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:12, diff=13.459588s, valid=True
2026-05-29T05:27:25.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:27:25.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:06, diff=19.467412s, valid=True
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:27:25.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:27:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:12, diff=13.471073s, valid=True
2026-05-29T05:27:25.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:27:25.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:27:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:27:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957887.471858s, valid=True
2026-05-29T05:27:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:27:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:27:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:27:25.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:27:25.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:27:25.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:27:25.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:27:25.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:27:25.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:27:25.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:27:25.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:27:25.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:27:25.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:27:25.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:27:26.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:27:26.341 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:27:26.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:27:26.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:27:26.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-29T05:27:26.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-29T05:27:26.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:27:26.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:27:56.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:27:56.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:27:56.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:27:57.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:27:57.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:27:57.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:27:57.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-29T05:27:57.264 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:27:57.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-29T05:27:57.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:27:57.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:27:57.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:27:57.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-29T05:27:59.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-29T05:27:59.895 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:27:59.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:27:59.899 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:27:59.899 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:27:59.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:27:59.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:27:59.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:27:59.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:27:59.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:27:59.921 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:27:59.921 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:27:59.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:28:00.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:28:00.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:28:00.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:28:00.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:28:00.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:28:00.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:28:00.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:28:00.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:28:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:28:00.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:28:00.260 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:28:00.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:27:40
2026-05-29T05:28:00.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71003, datetime.datetime(2026, 5, 29, 5, 27, 40), datetime.datetime(2026, 5, 29, 5, 27, 40), 'salt', 6.69, 83.94, None, 15.84, 97.62, 2.52, 832.07, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:28:00.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:28:00.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:28:00.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:40, diff=20.326868s, valid=True
2026-05-29T05:28:00.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:28:00.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:28:00.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:12, diff=-11.670305s, valid=True
2026-05-29T05:28:00.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:28:00.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:27:37, diff=23.336183s, valid=True
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:28:00.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:28:00.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:12, diff=-11.660825s, valid=True
2026-05-29T05:28:00.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:28:00.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:28:00.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:28:00.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957922.33985s, valid=True
2026-05-29T05:28:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:28:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:28:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:28:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:28:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:28:00.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:28:00.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:28:00.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:28:00.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:28:00.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:28:00.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:28:00.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:28:00.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:28:00.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:28:00.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:28:01.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:28:01.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:28:01.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:28:01.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-29T05:28:01.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-29T05:28:01.569 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:28:01.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:28:31.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:28:31.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:28:31.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:28:32.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:28:32.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:28:32.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:28:32.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:28:32.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:28:32.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-29T05:28:32.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:28:32.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:28:32.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:28:32.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-29T05:28:35.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-29T05:28:35.343 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:28:35.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:28:35.351 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:28:35.351 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:28:35.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:28:35.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:28:35.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:28:35.374 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:28:35.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:28:35.375 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:28:35.375 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:28:35.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:28:35.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:28:35.506 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:28:35.600 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:28:35.601 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:28:35.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:28:35.644 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:28:35.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:28:35.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:28:35.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:28:35.690 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:28:35.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:28:35.750 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:28:11
2026-05-29T05:28:35.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71004, datetime.datetime(2026, 5, 29, 5, 28, 11), datetime.datetime(2026, 5, 29, 5, 28, 10), 'salt', 6.66, 83.94, None, 16.06, 96.61, 2.52, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:28:35.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:28:35.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:28:35.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:10, diff=25.75878s, valid=True
2026-05-29T05:28:35.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:28:35.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:28:35.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:12, diff=23.762189s, valid=True
2026-05-29T05:28:35.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:28:35.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:08, diff=27.770073s, valid=True
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:28:35.770 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:28:35.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:12, diff=23.773688s, valid=True
2026-05-29T05:28:35.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:28:35.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:28:35.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:28:35.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957957.774475s, valid=True
2026-05-29T05:28:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:28:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:28:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:28:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:28:35.776 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:28:35.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:28:35.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:28:35.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:28:35.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:28:35.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:28:35.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:28:36.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:28:36.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:28:36.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:28:36.303 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:28:36.641 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:28:36.796 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:28:36.796 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:28:36.796 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:28:36.796 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:28:37.053 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:28:37.054 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:29:07.073 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:29:07.073 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:29:07.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:29:07.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:29:07.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:29:07.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:29:07.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-29T05:29:07.626 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:29:07.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-29T05:29:07.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:29:07.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:29:07.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:29:07.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-29T05:29:10.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-29T05:29:10.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:29:10.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:29:10.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:29:10.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:29:10.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:29:10.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:29:10.087 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:29:10.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:29:10.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:29:10.087 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:29:10.087 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:29:10.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:29:10.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:29:10.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:29:10.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:29:10.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:29:10.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:29:10.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:29:10.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:29:10.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:29:10.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:29:10.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:29:10.361 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:29:10.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:28:41
2026-05-29T05:29:10.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71005, datetime.datetime(2026, 5, 29, 5, 28, 41), datetime.datetime(2026, 5, 29, 5, 28, 41), 'salt', 6.59, 83.94, None, 15.91, 94.94, 2.51, 831.95, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T05:29:10.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:29:10.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:29:10.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:41, diff=29.432207s, valid=True
2026-05-29T05:29:10.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:29:10.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:29:10.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:29:12, diff=-1.564608s, valid=True
2026-05-29T05:29:10.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:29:10.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:29:10.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:28:40, diff=30.44281s, valid=True
2026-05-29T05:29:10.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:29:10.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:29:10.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:29:10.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:29:10.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:29:10.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:29:10.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:29:12, diff=-1.55381s, valid=True
2026-05-29T05:29:10.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:29:10.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:29:10.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:29:10.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=957992.44696s, valid=True
2026-05-29T05:29:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:29:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:29:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:29:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:29:10.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:29:10.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:29:10.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:29:10.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:29:10.532 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:29:10.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:29:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:29:10.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:29:10.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:29:10.768 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:29:10.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:29:11.331 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:29:11.431 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:29:11.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:29:11.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-29T05:29:11.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-29T05:29:11.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:29:11.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:29:41.722 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:29:41.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:29:41.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:29:42.052 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:29:42.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:29:42.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:29:42.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-29T05:29:42.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:29:42.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-29T05:29:42.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:29:42.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:29:42.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:29:42.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-29T05:29:44.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-29T05:29:44.816 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:29:44.823 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:29:44.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:29:44.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:29:44.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:29:44.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:29:44.847 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:29:44.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:29:44.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:29:44.848 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:29:44.848 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:29:44.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:29:44.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:29:44.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:29:45.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:29:45.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:29:45.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:29:45.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:29:45.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:29:45.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:29:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:29:45.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:29:45.167 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:29:45.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:29:42
2026-05-29T05:29:45.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71007, datetime.datetime(2026, 5, 29, 5, 29, 42), datetime.datetime(2026, 5, 29, 5, 29, 41), 'salt', 6.46, 84.1, None, 16.13, 96.8, 2.49, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:29:45.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:29:45.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:29:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:29:41, diff=4.234652s, valid=True
2026-05-29T05:29:45.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:29:45.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:29:45.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:12, diff=-26.761944s, valid=True
2026-05-29T05:29:45.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:29:45.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:29:45.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:29:38, diff=7.245968s, valid=True
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:29:45.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:29:45.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:12, diff=-26.750447s, valid=True
2026-05-29T05:29:45.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:29:45.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:29:45.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:29:45.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958027.250343s, valid=True
2026-05-29T05:29:45.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:29:45.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:29:45.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:29:45.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:29:45.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:29:45.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:29:45.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:29:45.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:29:45.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:29:45.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:29:45.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:29:45.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:29:45.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:29:45.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:29:45.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:29:46.190 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:29:46.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:29:46.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:29:46.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-29T05:29:46.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-29T05:29:46.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:29:46.551 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:30:16.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:30:16.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:30:16.581 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:30:16.904 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:30:16.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:30:17.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:30:17.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-29T05:30:17.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:30:17.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:30:17.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:30:17.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:30:17.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:30:17.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-29T05:30:19.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-29T05:30:19.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:30:19.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:30:19.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:30:19.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:30:19.604 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:30:19.616 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:30:19.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:30:19.617 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:30:19.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:30:19.617 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:30:19.617 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:30:19.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:30:19.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:30:19.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:30:19.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:30:19.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:30:19.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:30:19.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:30:19.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:30:19.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:30:19.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:30:19.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:30:19.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:30:20.016 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:30:12
2026-05-29T05:30:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71008, datetime.datetime(2026, 5, 29, 5, 30, 12), datetime.datetime(2026, 5, 29, 5, 30, 11), 'salt', 6.56, 84.3, None, 16.3, 92.5, 2.45, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:30:20.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:30:20.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:30:20.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:11, diff=9.022523s, valid=True
2026-05-29T05:30:20.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:30:20.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:30:20.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:12, diff=8.025499s, valid=True
2026-05-29T05:30:20.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:30:20.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:08, diff=12.03245s, valid=True
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:30:20.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:30:20.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:30:20.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:12, diff=8.035616s, valid=True
2026-05-29T05:30:20.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:30:20.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:30:20.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:30:20.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958062.036283s, valid=True
2026-05-29T05:30:20.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:30:20.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:30:20.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:30:20.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:30:20.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:30:20.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:30:20.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:30:20.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:30:20.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:30:20.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:30:20.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:30:20.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:30:20.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:30:20.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:30:20.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:30:20.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:30:21.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:30:21.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:30:21.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-29T05:30:21.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-29T05:30:21.187 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:30:21.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:30:51.202 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:30:51.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:30:51.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:30:51.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:30:51.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:30:52.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:30:52.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-29T05:30:52.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:30:52.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-29T05:30:52.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:30:52.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:30:52.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:30:52.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:30:54.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-29T05:30:54.595 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:30:54.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:30:54.603 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:30:54.603 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:30:54.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:30:54.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:30:54.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:30:54.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:30:54.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:30:54.627 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:30:54.628 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:30:54.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:30:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:30:54.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:30:54.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:30:54.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:30:54.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:30:54.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:30:54.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:30:54.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:30:54.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:30:54.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:30:54.955 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:30:55.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:30:42
2026-05-29T05:30:55.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71009, datetime.datetime(2026, 5, 29, 5, 30, 42), datetime.datetime(2026, 5, 29, 5, 30, 42), 'salt', 6.49, 84.34, None, 16.27, 97.29, 2.44, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:30:55.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:30:55.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:30:55.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:42, diff=13.020051s, valid=True
2026-05-29T05:30:55.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:30:55.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:30:55.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:12, diff=-16.977146s, valid=True
2026-05-29T05:30:55.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:30:55.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:30:38, diff=17.029369s, valid=True
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:30:55.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:30:55.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:12, diff=-16.967642s, valid=True
2026-05-29T05:30:55.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:30:55.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:30:55.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:30:55.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958097.033084s, valid=True
2026-05-29T05:30:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:30:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:30:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:30:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:30:55.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:30:55.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:30:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:30:55.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:30:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:30:55.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:30:55.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:30:55.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:30:55.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:30:55.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:30:55.626 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:30:55.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:30:56.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:30:56.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:30:56.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:30:56.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-29T05:30:56.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:30:56.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:31:26.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:31:26.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:31: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-29T05:31:26.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:31:26.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:31:26.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:31:26.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-29T05:31:26.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:31: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-29T05:31:26.670 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:31:26.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:31:26.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:31:26.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-29T05:31:28.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-29T05:31:28.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:31:28.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:31:28.984 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:31:28.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:31:28.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:31:29.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:31:29.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:31:29.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:31:29.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:31:29.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:31:29.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:31:29.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:31:29.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:31:29.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:31:29.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:31:29.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:31:29.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:31:29.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:31:29.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:31:29.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:31:29.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:31:29.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:31:29.269 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:31:29.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:31:12
2026-05-29T05:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71010, datetime.datetime(2026, 5, 29, 5, 31, 12), datetime.datetime(2026, 5, 29, 5, 31, 12), 'salt', 6.52, 84.44, None, 15.6, 91.56, 2.42, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:31:29.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:31:29.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:31:29.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:12, diff=17.335192s, valid=True
2026-05-29T05:31:29.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:31:29.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:31:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:12, diff=17.338314s, valid=True
2026-05-29T05:31:29.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:31:29.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:08, diff=21.34554s, valid=True
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:31:29.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:31:29.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:31:29.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:12, diff=17.348831s, valid=True
2026-05-29T05:31:29.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:31:29.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:31:29.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:31:29.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958131.349556s, valid=True
2026-05-29T05:31:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:31:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:31:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:31:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:31:29.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:31:29.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:31:29.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:31:29.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:31:29.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:31:29.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:31:29.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:31:29.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:31:29.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:31:29.667 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:31:29.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:31:30.256 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:31:30.356 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:31:30.356 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:31:30.356 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:31:30.356 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:31:30.552 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:31:30.552 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:32:00.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:32:00.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:32:00.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:32:00.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:32:00.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:32:01.119 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:32:01.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-29T05:32:01.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:32:01.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:32:01.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:32:01.146 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:32:01.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:32:01.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-29T05:32: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-29T05:32:03.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:32:03.464 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:32:03.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:32:03.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:32:03.476 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:32:03.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:32:03.490 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:32:03.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:32:03.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:32:03.491 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:32:03.491 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:32:03.499 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:32:03.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:32:03.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:32:03.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:32:03.725 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:32:03.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:32:03.773 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:32:03.814 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:32:03.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:32:03.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:32:03.820 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:32:03.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:32:03.879 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:31:43
2026-05-29T05:32:03.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71011, datetime.datetime(2026, 5, 29, 5, 31, 43), datetime.datetime(2026, 5, 29, 5, 31, 42), 'salt', 6.46, 84.44, None, 16.55, 93.63, 2.43, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:32:03.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:32:03.880 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:32:03.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:42, diff=21.885928s, valid=True
2026-05-29T05:32:03.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:32:03.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:32:03.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:12, diff=-8.111156s, valid=True
2026-05-29T05:32:03.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:32:03.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:31:38, diff=25.895529s, valid=True
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:32:03.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:32:03.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:12, diff=-8.101394s, valid=True
2026-05-29T05:32:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:32:03.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:32:03.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:32:03.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958165.899297s, valid=True
2026-05-29T05:32:03.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:32:03.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:32:03.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:32:03.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:32:03.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:32:03.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:32:03.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:32:03.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:32:03.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:32:04.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:32:04.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:32:04.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:32:04.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:32:04.292 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:32:04.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:32:04.841 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:32:04.940 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:32:04.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:32:04.940 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:32:04.940 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:32:05.145 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:32:05.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:32:35.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:32:35.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:32:35.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:32:35.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:32:35.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:32:35.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:32:35.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-29T05:32:35.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:32:35.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-29T05:32:35.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:32:35.563 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:32:35.570 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:32:35.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-29T05:32:38.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-29T05:32:38.015 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:32:38.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:32:38.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:32:38.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:32:38.034 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:32:38.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05: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-29T05:32:38.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:32:38.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:32:38.048 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:32:38.048 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:32:38.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:32:38.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:32:38.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:32:38.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:32:38.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:32:38.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:32:38.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:32:38.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:32:38.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:32:38.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:32:38.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:32:38.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:32:38.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:32:13
2026-05-29T05:32:38.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71012, datetime.datetime(2026, 5, 29, 5, 32, 13), datetime.datetime(2026, 5, 29, 5, 32, 12), 'salt', 6.52, 84.54, None, 16.48, 94.26, 2.41, 831.89, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:32:38.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:32:38.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:32:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:12, diff=26.428111s, valid=True
2026-05-29T05:32:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:32:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:32:38.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:12, diff=26.431407s, valid=True
2026-05-29T05:32:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:32:38.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:10, diff=28.439044s, valid=True
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:32:38.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:32:38.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:12, diff=26.442578s, valid=True
2026-05-29T05:32:38.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:32:38.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:32:38.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:32:38.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958200.443341s, valid=True
2026-05-29T05:32:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:32:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:32:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:32:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:32:38.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:32:38.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:32:38.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:32:38.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:32:38.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:32:38.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:32:38.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:32:38.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:32:38.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:32:38.769 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:32:38.976 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:32:39.319 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:32:39.418 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:32:39.418 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:32:39.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-29T05:32:39.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-29T05:32:39.512 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:32:39.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:33:09.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:33:09.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:33:09.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:33:10.082 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:33:10.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:33:10.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:33:10.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-29T05:33:10.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:33:10.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-29T05:33:10.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:33:10.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:33:10.319 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:33:10.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-29T05:33:12.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-29T05:33:12.720 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:33:12.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:33:12.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:33:12.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:33:12.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:33:12.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:33:12.751 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:33:12.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:33:12.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:33:12.752 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:33:12.752 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:33:12.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:33:12.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:33:12.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:33:12.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:33:12.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:33:13.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:33:13.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:33:13.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:33:13.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:33:13.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:33:13.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:33:13.081 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:33:13.147 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:32:43
2026-05-29T05:33:13.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71013, datetime.datetime(2026, 5, 29, 5, 32, 43), datetime.datetime(2026, 5, 29, 5, 32, 43), 'salt', 6.56, 84.64, None, 15.84, 93.91, 2.4, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:33:13.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:33:13.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:33:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:43, diff=30.154654s, valid=True
2026-05-29T05:33:13.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:33:13.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:33:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:33:12, diff=1.158029s, valid=True
2026-05-29T05:33:13.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:33:13.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:32:41, diff=32.166064s, valid=True
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:33:13.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:33:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:33:12, diff=1.169717s, valid=True
2026-05-29T05:33:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:33:13.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:33:13.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:33:13.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958235.170514s, valid=True
2026-05-29T05:33:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:33:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:33:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:33:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:33:13.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:33:13.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:33:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:33:13.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:33:13.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:33:13.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:33:13.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:33:13.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:33:13.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:33:13.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:33:13.774 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:33:14.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:33:14.216 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:33:14.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:33:14.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-29T05:33:14.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-29T05:33:14.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:33:14.472 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:33:44.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:33:44.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:33:44.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:33:44.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:33:44.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:33:45.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:33:45.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-29T05:33:45.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:33:45.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-29T05:33:45.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:33:45.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:33:45.240 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:33:45.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-29T05:33:47.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-29T05:33:47.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:33:47.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:33:47.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:33:47.884 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:33:47.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:33:47.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:33:47.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:33:47.904 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:33:47.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:33:47.904 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:33:47.904 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:33:47.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:33:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:33:47.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:33:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:33:48.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:33:48.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:33:48.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:33:48.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:33:48.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:33:48.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:33:48.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:33:48.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:33:48.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:33:44
2026-05-29T05:33:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71015, datetime.datetime(2026, 5, 29, 5, 33, 44), datetime.datetime(2026, 5, 29, 5, 33, 43), 'salt', 6.59, 84.67, None, 15.46, 94.07, 2.39, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:33:48.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:33:48.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:33:48.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:33:43, diff=5.238533s, valid=True
2026-05-29T05:33:48.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:33:48.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:33:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:12, diff=-23.758589s, valid=True
2026-05-29T05:33:48.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:33:48.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:33:39, diff=9.248384s, valid=True
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:33:48.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:33:48.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:12, diff=-23.748489s, valid=True
2026-05-29T05:33:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:33:48.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:33:48.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:33:48.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958270.252266s, valid=True
2026-05-29T05:33:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:33:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:33:48.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:33:48.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:33:48.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:33:48.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:33:48.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:33:48.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:33:48.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:33:48.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:33:48.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:33:48.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:33:48.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:33:48.619 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:33:48.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:33:49.175 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:33:49.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:33:49.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:33:49.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-29T05:33:49.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-29T05:33:49.547 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:33:49.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:34:19.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:34:19.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:34:19.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:34:19.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:34:19.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:34:19.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:34:19.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-29T05:34:19.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:34:19.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:34:19.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:34:19.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:34:19.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:34:19.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-29T05:34:22.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-29T05:34:22.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:34:22.408 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:34:22.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:34:22.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:34:22.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:34:22.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:34:22.432 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:34:22.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:34:22.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:34:22.433 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:34:22.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:34:22.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:34:22.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:34:22.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:34:22.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:34:22.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:34:22.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:34:22.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:34:22.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:34:22.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:34:22.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:34:22.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:34:22.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:34:22.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:34:14
2026-05-29T05:34:22.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71016, datetime.datetime(2026, 5, 29, 5, 34, 14), datetime.datetime(2026, 5, 29, 5, 34, 13), 'salt', 6.46, 84.47, None, 16.73, 91.16, 2.42, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:34:22.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:34:22.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:34:22.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:13, diff=9.813672s, valid=True
2026-05-29T05:34:22.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:34:22.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:34:22.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:12, diff=10.816551s, valid=True
2026-05-29T05:34:22.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:34:22.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:10, diff=12.82411s, valid=True
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:34:22.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:34:22.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:12, diff=10.827979s, valid=True
2026-05-29T05:34:22.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:34:22.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:34:22.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:34:22.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958304.828782s, valid=True
2026-05-29T05:34:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:34:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:34:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:34:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:34:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:34:22.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:34:22.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:34:22.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:34:22.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:34:22.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:34:23.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:34:23.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:34:23.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:34:23.150 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:34:23.364 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:34:23.705 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:34:23.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:34:23.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:34:23.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-29T05:34:23.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-29T05:34:24.002 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:34:24.002 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:34:54.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:34:54.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:34:54.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:34:54.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:34:54.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:34:54.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:34:54.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-29T05:34:54.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:34:54.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-29T05:34:54.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:34:54.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:34:54.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:34:54.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-29T05:34:57.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-29T05:34:57.418 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:34:57.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:34:57.425 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:34:57.425 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:34:57.435 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:34:57.448 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:34:57.448 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:34:57.449 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:34:57.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:34:57.449 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:34:57.450 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:34:57.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:34:57.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:34:57.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:34:57.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:34:57.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:34:57.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:34:57.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:34:57.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:34:57.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:34:57.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:34:57.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:34:57.775 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:34:57.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:34:44
2026-05-29T05:34:57.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71017, datetime.datetime(2026, 5, 29, 5, 34, 44), datetime.datetime(2026, 5, 29, 5, 34, 44), 'salt', 6.36, 84.4, None, 15.67, 91.25, 2.43, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:34:57.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:34:57.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:34:57.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:44, diff=13.843455s, valid=True
2026-05-29T05:34:57.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:34:57.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:34:57.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:12, diff=-14.153123s, valid=True
2026-05-29T05:34:57.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:34:57.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:34:57.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:34:40, diff=17.854794s, valid=True
2026-05-29T05:34:57.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:34:57.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:34:57.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:34:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:34:57.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:34:57.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:34:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:12, diff=-14.141589s, valid=True
2026-05-29T05:34:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:34:57.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:34:57.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:34:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958339.859233s, valid=True
2026-05-29T05:34:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:34:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:34:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:34:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:34:57.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:34:57.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:34:57.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:34:57.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:34:57.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:34:57.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:34:58.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:34:58.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:34:58.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:34:58.183 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:34:58.389 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:34:58.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:34:58.885 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:34:58.886 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:34:58.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-29T05:34:58.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-29T05:34:58.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:34:58.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:35:28.990 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:35:28.990 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:35:28.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:35:29.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:35:29.305 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:35:29.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:35:29.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-29T05:35:29.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:35:29.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-29T05:35:29.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:35:29.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:35:29.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:35:29.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-29T05:35:32.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-29T05:35:32.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:35:32.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:35:32.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:35:32.109 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:35:32.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:35:32.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:35:32.138 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:35:32.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:35:32.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:35:32.139 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:35:32.139 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:35:32.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:35:32.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:35:32.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:35:32.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:35:32.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:35:32.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:35:32.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:35:32.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:35:32.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:35:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:35:32.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:35:32.463 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:35:32.531 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:35:14
2026-05-29T05:35:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71018, datetime.datetime(2026, 5, 29, 5, 35, 14), datetime.datetime(2026, 5, 29, 5, 35, 14), 'salt', 6.46, 84.7, None, 16.55, 91.98, 2.38, 831.89, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:35:32.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:35:32.531 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:35:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:14, diff=18.538738s, valid=True
2026-05-29T05:35:32.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:35:32.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:35:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:12, diff=20.542139s, valid=True
2026-05-29T05:35:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:35:32.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:10, diff=22.550007s, valid=True
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:35:32.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:35:32.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:12, diff=20.553678s, valid=True
2026-05-29T05:35:32.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:35:32.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:35:32.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:35:32.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958374.554466s, valid=True
2026-05-29T05:35:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:35:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:35:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:35:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:35:32.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:35:32.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:35:32.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:35:32.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:35:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:35:32.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:35:32.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:35:32.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:35:32.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:35:32.878 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:35:33.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:35:33.439 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:35:33.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:35:33.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:35:33.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-29T05:35:33.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-29T05:35:33.807 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:35:33.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:36:03.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:36:03.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:36:03.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:36:04.085 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:36:04.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:36:04.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:36:04.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-29T05:36:04.306 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:36:04.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-29T05:36:04.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:36:04.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:36:04.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:36:04.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-29T05:36:06.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-29T05:36:06.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:36:06.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:36:06.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:36:06.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:36:06.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:36:06.751 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:36:06.752 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:36:06.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:36:06.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:36:06.753 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:36:06.753 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:36:06.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:36:06.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:36:06.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:36:06.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:36:06.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:36:07.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:36:07.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:36:07.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:36:07.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:36:07.072 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:36:07.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:36:07.073 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:36:07.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:35:45
2026-05-29T05:36:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71019, datetime.datetime(2026, 5, 29, 5, 35, 45), datetime.datetime(2026, 5, 29, 5, 35, 44), 'salt', 6.56, 84.8, None, 16.44, 92.59, 2.37, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:36:07.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:36:07.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:36:07.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:44, diff=23.140045s, valid=True
2026-05-29T05:36:07.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:36:07.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:36:07.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:12, diff=-4.856516s, valid=True
2026-05-29T05:36:07.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:36:07.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:35:40, diff=27.151426s, valid=True
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:36:07.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:36:07.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:12, diff=-4.843986s, valid=True
2026-05-29T05:36:07.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:36:07.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:36:07.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:36:07.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958409.156841s, valid=True
2026-05-29T05:36:07.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:36:07.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:36:07.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:36:07.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:36:07.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:36:07.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:36:07.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:36:07.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:36:07.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:36:07.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:36:07.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:36:07.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:36:07.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:36:07.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:36:07.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:36:08.095 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:36:08.195 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:36:08.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:36:08.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-29T05:36:08.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-29T05:36:08.495 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:36:08.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:36:38.526 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:36:38.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:36:38.526 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:36:38.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:36:38.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:36:39.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:36:39.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-29T05:36:39.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:36:39.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-29T05:36:39.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:36:39.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:36:39.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:36:39.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-29T05:36:41.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-29T05:36:41.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:36:41.644 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:36:41.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:36:41.645 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:36:41.655 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:36:41.668 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:36:41.669 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:36:41.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:36:41.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:36:41.670 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:36:41.670 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:36:41.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:36:41.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:36:41.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:36:41.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:36:41.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:36:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:36:41.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:36:41.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:36:41.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:36:41.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:36:41.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:36:41.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:36:42.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:36:15
2026-05-29T05:36:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71020, datetime.datetime(2026, 5, 29, 5, 36, 15), datetime.datetime(2026, 5, 29, 5, 36, 14), 'salt', 6.62, 84.77, None, 16.41, 91.79, 2.37, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:36:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:36:42.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:36:42.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:14, diff=28.06464s, valid=True
2026-05-29T05:36:42.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:36:42.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:36:42.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:12, diff=30.06792s, valid=True
2026-05-29T05:36:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:36:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:11, diff=31.075145s, valid=True
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:36:42.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:36:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:36:12, diff=30.078307s, valid=True
2026-05-29T05:36:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:36:42.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:36:42.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:36:42.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958444.078987s, valid=True
2026-05-29T05:36:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:36:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:36:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:36:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:36:42.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:36:42.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:36:42.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:36:42.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:36:42.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:36:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:36:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:36:42.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:36:42.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:36:42.401 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:36:42.606 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:36:42.945 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:36:43.044 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:36:43.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:36:43.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-29T05:36:43.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-29T05:36:43.245 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:36:43.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:37:13.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:37:13.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:37:13.247 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:37:13.711 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:37:13.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:37:13.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:37:13.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-29T05:37:13.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:37:13.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-29T05:37:13.958 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:37:13.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:37:13.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:37:13.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-29T05:37:16.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:37:16.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:37:16.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:37:16.413 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:37:16.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:37:16.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:37:16.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:37:16.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:37:16.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:37:16.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:37:16.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:37:16.439 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:37:16.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:37:16.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:37:16.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:37:16.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:37:16.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:37:16.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:37:16.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:37:16.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:37:16.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:37:16.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:37:16.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:37:16.718 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:37:16.778 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:37:15
2026-05-29T05:37:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71022, datetime.datetime(2026, 5, 29, 5, 37, 15), datetime.datetime(2026, 5, 29, 5, 37, 15), 'salt', 6.62, 84.44, None, 16.83, 93.27, 2.43, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:37:16.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:37:16.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:37:16.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:15, diff=1.785043s, valid=True
2026-05-29T05:37:16.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:37:16.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:37:16.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:12, diff=4.78827s, valid=True
2026-05-29T05:37:16.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:37:16.788 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:37:16.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:14, diff=2.795594s, valid=True
2026-05-29T05:37:16.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:37:16.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:37:16.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:37:16.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:37:16.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:37:16.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:37:16.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:12, diff=4.798974s, valid=True
2026-05-29T05:37:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:37:16.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:37:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:37:16.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958478.799712s, valid=True
2026-05-29T05:37:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:37:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:37:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:37:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:37:16.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:37:16.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:37:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:37:16.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:37:16.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:37:16.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:37:16.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:37:17.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:37:17.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:37:17.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:37:17.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:37:17.711 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:37:17.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:37:17.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:37:17.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-29T05:37:17.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-29T05:37:17.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:37:17.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:37:47.996 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:37:47.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:37:47.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:37:48.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:37:48.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:37:48.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:37:48.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-29T05:37:48.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:37:48.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-29T05:37:48.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:37:48.397 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:37:48.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:37:48.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-29T05:37:50.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:37:50.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:37:50.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:37:50.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:37:50.777 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:37:50.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:37:50.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:37:50.802 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:37:50.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:37:50.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:37:50.803 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:37:50.803 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:37:50.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:37:50.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:37:50.909 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:37:50.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:37:50.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:37:51.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:37:51.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:37:51.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:37:51.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:37:51.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:37:51.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:37:51.088 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:37:51.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:37:46
2026-05-29T05:37:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71023, datetime.datetime(2026, 5, 29, 5, 37, 46), datetime.datetime(2026, 5, 29, 5, 37, 45), 'salt', 6.59, 84.4, None, 17.04, 92.12, 2.43, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:37:51.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:37:51.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:37:51.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:45, diff=6.155597s, valid=True
2026-05-29T05:37:51.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:37:51.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:37:51.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:12, diff=-20.841181s, valid=True
2026-05-29T05:37:51.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:37:51.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:37:42, diff=9.166369s, valid=True
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:37:51.166 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:37:51.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:12, diff=-20.830215s, valid=True
2026-05-29T05:37:51.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:37:51.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:37:51.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:37:51.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958513.170531s, valid=True
2026-05-29T05:37:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:37:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:37:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:37:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:37:51.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:37:51.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:37:51.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:37:51.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:37:51.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:37:51.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:37:51.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:37:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:37:51.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:37:51.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:37:51.687 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:37:52.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:37:52.114 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:37:52.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:37:52.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-29T05:37:52.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-29T05:37:52.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:37:52.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:38:22.414 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:38:22.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:38:22.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:38:22.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:38:22.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:38:22.993 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:38:22.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-29T05:38:23.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:38:23.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-29T05:38:23.021 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:38:23.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:38:23.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:38:23.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-29T05:38:25.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-29T05:38:25.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:38:25.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:38:25.528 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:38:25.528 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:38:25.539 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:38:25.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:38:25.553 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:38:25.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:38:25.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:38:25.554 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:38:25.554 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:38:25.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:38:25.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:38:25.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:38:25.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:38:25.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:38:25.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:38:25.829 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:38:25.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:38:25.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:38:25.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:38:25.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:38:25.875 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:38:25.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:38:16
2026-05-29T05:38:25.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71024, datetime.datetime(2026, 5, 29, 5, 38, 16), datetime.datetime(2026, 5, 29, 5, 38, 15), 'salt', 6.62, 84.44, None, 16.76, 95.43, 2.43, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:38:25.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:38:25.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:38:25.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:15, diff=10.945701s, valid=True
2026-05-29T05:38:25.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:38:25.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:38:25.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:12, diff=13.94906s, valid=True
2026-05-29T05:38:25.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:38:25.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:38:25.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:12, diff=13.956863s, valid=True
2026-05-29T05:38:25.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:38:25.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:38:25.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:38:25.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:38:25.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:38:25.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:38:25.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:12, diff=13.960452s, valid=True
2026-05-29T05:38:25.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:38:25.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:38:25.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:38:25.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958547.961262s, valid=True
2026-05-29T05:38:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:38:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:38:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:38:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:38:25.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:38:26.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:38:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:38:26.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:38:26.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:38:26.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:38:26.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:38:26.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:38:26.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:38:26.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:38:26.542 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:38:26.871 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:38:26.970 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:38:26.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:38:26.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-29T05:38:26.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-29T05:38:27.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:38:27.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:38:57.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:38:57.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:38:57.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:38:57.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:38:57.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:38:57.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:38:57.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-29T05:38:57.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:38:57.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-29T05:38:58.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:38:58.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:38:58.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:38:58.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-29T05:39:00.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-29T05:39:00.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:39:00.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:39:00.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:39:00.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:39:00.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:39:00.405 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:39:00.406 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:39:00.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:39:00.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:39:00.407 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:39:00.407 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:39:00.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:39:00.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:39:00.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:39:00.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:39:00.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:39:00.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:39:00.680 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:39:00.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:39:00.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:39:00.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:39:00.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:39:00.726 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:39:00.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:38:46
2026-05-29T05:39:00.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71025, datetime.datetime(2026, 5, 29, 5, 38, 46), datetime.datetime(2026, 5, 29, 5, 38, 46), 'salt', 6.56, 84.4, None, 17.01, 90.34, 2.44, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:39:00.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:39:00.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:39:00.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:46, diff=14.794199s, valid=True
2026-05-29T05:39:00.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:39:00.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:39:00.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:12, diff=-11.202331s, valid=True
2026-05-29T05:39:00.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:39:00.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:39:00.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:38:42, diff=18.805633s, valid=True
2026-05-29T05:39:00.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:39:00.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:39:00.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:39:00.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:39:00.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:39:00.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:39:00.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:12, diff=-11.190801s, valid=True
2026-05-29T05:39:00.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:39:00.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:39:00.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:39:00.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958582.810002s, valid=True
2026-05-29T05:39:00.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:39:00.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:39:00.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:39:00.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:39:00.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:39:00.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:39:00.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:39:00.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:39:00.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:39:00.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:39:01.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:39:01.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:39:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:39:01.132 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:39:01.326 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:39:01.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:39:01.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:39:01.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:39:01.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:39:01.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:39:02.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:39:02.008 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:39:32.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:39:32.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:39:32.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:39:32.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:39:32.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:39:32.568 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:39:32.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-29T05:39:32.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:39:32.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-29T05:39:32.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:39:32.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:39:32.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:39:32.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-29T05:39:35.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-29T05:39:35.069 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:39:35.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:39:35.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:39:35.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:39:35.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:39:35.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:39:35.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:39:35.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:39:35.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:39:35.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:39:35.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:39:35.108 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:39:35.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:39:35.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:39:35.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:39:35.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:39:35.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:39:35.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:39:35.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:39:35.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:39:35.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:39:35.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:39:35.420 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:39:35.480 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:39:16
2026-05-29T05:39:35.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71026, datetime.datetime(2026, 5, 29, 5, 39, 16), datetime.datetime(2026, 5, 29, 5, 39, 16), 'salt', 6.59, 84.5, None, 17.11, 90.69, 2.42, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:39:35.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:39:35.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:39:35.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:16, diff=19.487705s, valid=True
2026-05-29T05:39:35.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:39:35.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:39:35.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:12, diff=23.491098s, valid=True
2026-05-29T05:39:35.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:39:35.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:39:35.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:12, diff=23.498895s, valid=True
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:39:35.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:39:35.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:12, diff=23.502392s, valid=True
2026-05-29T05:39:35.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:39:35.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:39:35.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:39:35.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958617.503168s, valid=True
2026-05-29T05:39:35.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:39:35.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:39:35.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:39:35.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:39:35.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:39:35.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:39:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:39:35.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:39:35.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:39:35.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:39:35.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:39:35.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:39:35.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:39:35.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:39:36.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:39:36.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:39:36.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:39:36.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:39:36.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-29T05:39:36.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:39:36.706 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:39:36.707 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:40:06.735 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:40:06.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:40:06.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:40:07.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:40:07.259 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:40:07.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:40:07.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-29T05:40:07.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:40:07.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-29T05:40:07.514 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:40:07.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:40:07.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:40:07.521 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:40:10.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-29T05:40:10.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:40:10.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:40:10.023 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:40:10.023 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:40:10.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:40:10.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:40:10.044 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:40:10.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:40:10.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:40:10.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:40:10.044 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:40:10.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:40:10.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:40:10.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:40:10.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:40:10.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:40:10.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:40:10.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:40:10.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:40:10.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:40:10.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:40:10.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:40:10.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:40:10.388 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:39:47
2026-05-29T05:40:10.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71027, datetime.datetime(2026, 5, 29, 5, 39, 47), datetime.datetime(2026, 5, 29, 5, 39, 47), 'salt', 6.56, 84.47, None, 17.47, 92.45, 2.43, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:40:10.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:40:10.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:40:10.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:47, diff=23.39544s, valid=True
2026-05-29T05:40:10.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:40:10.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:40:10.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:12, diff=-1.601419s, valid=True
2026-05-29T05:40:10.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:40:10.398 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:40:10.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:39:42, diff=28.405947s, valid=True
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:40:10.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:40:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:12, diff=-1.590671s, valid=True
2026-05-29T05:40:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:40:10.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:40:10.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:40:10.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958652.410089s, valid=True
2026-05-29T05:40:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:40:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:40:10.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:40:10.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:40:10.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:40:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:40:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:40:10.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:40:10.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:40:10.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:40:10.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:40:10.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:40:10.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:40:10.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:40:10.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:40:11.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:40:11.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:40:11.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:40:11.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-29T05:40:11.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-29T05:40:11.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:40:11.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:40:41.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:40:41.628 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:40:41.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:40:41.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:40:41.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:40:42.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:40:42.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-29T05:40:42.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:40:42.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-29T05:40:42.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:40:42.086 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:40:42.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:40:42.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-29T05:40:44.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-29T05:40:44.403 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:40:44.411 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:40:44.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:40:44.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:40:44.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:40:44.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:40:44.438 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:40:44.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:40:44.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:40:44.439 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:40:44.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:40:44.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:40:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:40:44.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:40:44.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:40:44.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:40:44.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:40:44.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:40:44.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:40:44.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:40:44.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:40:44.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:40:44.760 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:40:44.820 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:40:17
2026-05-29T05:40:44.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71028, datetime.datetime(2026, 5, 29, 5, 40, 17), datetime.datetime(2026, 5, 29, 5, 40, 17), 'salt', 6.42, 84.44, None, 17.5, 92.73, 2.42, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:40:44.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:40:44.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:40:44.827 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:17, diff=27.827971s, valid=True
2026-05-29T05:40:44.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:40:44.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:40:44.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:12, diff=32.831338s, valid=True
2026-05-29T05:40:44.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:40:44.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:13, diff=31.839208s, valid=True
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:40:44.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:40:44.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:40:12, diff=32.842762s, valid=True
2026-05-29T05:40:44.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:40:44.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:40:44.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:40:44.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958686.843524s, valid=True
2026-05-29T05:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:40:44.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:40:44.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:40:44.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:40:44.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:40:44.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:40:44.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:40:45.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:40:45.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:40:45.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:40:45.163 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:40:45.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:40:45.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:40:45.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:40:45.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:40:45.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-29T05:40:45.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-29T05:40:47.705 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:40:47.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:41:17.726 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:41:17.726 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:41:17.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:41:18.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:41:18.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:41:18.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:41:18.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-29T05:41:18.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:41:18.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-29T05:41:18.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:41:18.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:41:18.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:41:18.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-29T05:41:21.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-29T05:41:21.904 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:41:21.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:41:21.913 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:41:21.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:41:21.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:41:21.936 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:41:21.936 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:41:21.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:41:21.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:41:21.938 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:41:21.938 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:41:21.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:41:22.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:41:22.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:41:22.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:41:22.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:41:22.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:41:22.227 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:41:22.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:41:22.266 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:41:22.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:41:22.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:41:22.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:41:22.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:41:18
2026-05-29T05:41:22.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71030, datetime.datetime(2026, 5, 29, 5, 41, 18), datetime.datetime(2026, 5, 29, 5, 41, 17), 'salt', 6.39, 84.64, None, 15.88, 93.37, 2.39, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:41:22.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:41:22.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:41:22.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:17, diff=5.339733s, valid=True
2026-05-29T05:41:22.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:41:22.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:41:22.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:12, diff=10.343001s, valid=True
2026-05-29T05:41:22.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:41:22.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:41:22.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:15, diff=7.350635s, valid=True
2026-05-29T05:41:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:41:22.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:41:22.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:41:22.350 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:41:22.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:41:22.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:41:22.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:12, diff=10.35409s, valid=True
2026-05-29T05:41:22.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:41:22.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:41:22.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:41:22.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958724.354854s, valid=True
2026-05-29T05:41:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:41:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:41:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:41:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:41:22.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:41:22.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:41:22.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:41:22.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:41:22.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:41:22.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:41:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:41:22.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:41:22.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:41:22.678 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:41:22.877 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:41:23.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:41:23.371 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:41:23.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:41:23.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-29T05:41:23.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-29T05:41:23.605 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:41:23.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:41:53.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:41:53.624 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:41:53.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:41:53.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:41:53.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:41:54.002 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:41:54.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-29T05:41:54.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:41:54.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-29T05:41:54.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:41:54.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:41:54.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:41:54.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-29T05:41: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-29T05:41:56.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:41:56.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:41:56.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:41:56.636 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:41:56.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:41:56.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:41:56.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:41:56.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:41:56.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:41:56.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:41:56.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:41:56.667 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:41:56.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:41:56.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:41:56.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:41:56.898 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:41:56.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:41:56.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:41:56.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:41:56.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:41:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:41:56.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:41:56.991 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:41:57.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:41:48
2026-05-29T05:41:57.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71031, datetime.datetime(2026, 5, 29, 5, 41, 48), datetime.datetime(2026, 5, 29, 5, 41, 48), 'salt', 6.49, 84.67, None, 16.94, 92.71, 2.39, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:41:57.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:41:57.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:41:57.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:48, diff=9.067384s, valid=True
2026-05-29T05:41:57.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:41:57.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:41:57.070 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:12, diff=-14.929201s, valid=True
2026-05-29T05:41:57.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:41:57.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:41:57.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:41:47, diff=10.07866s, valid=True
2026-05-29T05:41:57.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:41:57.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:41:57.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:41:57.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:41:57.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:41:57.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:41:57.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:12, diff=-14.917712s, valid=True
2026-05-29T05:41:57.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:41:57.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:41:57.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:41:57.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958759.083077s, valid=True
2026-05-29T05:41:57.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:41:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:41:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:41:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:41:57.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:41:57.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:41:57.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:41:57.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:41:57.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:41:57.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:41:57.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:41:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:41:57.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:41:57.405 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:41:57.604 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:41:57.940 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:41:58.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:41:58.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:41:58.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-29T05:41:58.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-29T05:41:58.284 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:41:58.284 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:42:28.285 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:42:28.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:42:28.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:42:28.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:42:28.790 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:42:28.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:42:28.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-29T05:42:29.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:42:29.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-29T05:42:29.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:42:29.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:42:29.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:42:29.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-29T05:42:31.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-29T05:42:31.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:42:31.559 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:42:31.560 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:42:31.560 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:42:31.572 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:42:31.585 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:42:31.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:42:31.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:42:31.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:42:31.587 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:42:31.587 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:42:31.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:42:31.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:42:31.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:42:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:42:31.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:42:31.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:42:31.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:42:31.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:42:31.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:42:31.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:42:31.913 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:42:31.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:42:31.980 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:42:18
2026-05-29T05:42:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71032, datetime.datetime(2026, 5, 29, 5, 42, 18), datetime.datetime(2026, 5, 29, 5, 42, 18), 'salt', 6.92, 84.67, None, 16.73, 90.9, 2.39, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:42:31.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:42:31.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:42:31.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:18, diff=13.987608s, valid=True
2026-05-29T05:42:31.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:42:31.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:42:31.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:12, diff=19.991095s, valid=True
2026-05-29T05:42:31.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:42:31.991 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:14, diff=17.999067s, valid=True
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:42:31.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:42:32.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:12, diff=20.002774s, valid=True
2026-05-29T05:42:32.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:42:32.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:42:32.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:42:32.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958794.003585s, valid=True
2026-05-29T05:42:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:42:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:42:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:42:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:42:32.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:42:32.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:42:32.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:42:32.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:42:32.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:42:32.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:42:32.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:42:32.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:42:32.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:42:32.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:42:32.522 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:42:32.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:42:33.028 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:42:33.028 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:42:33.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-29T05:42:33.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-29T05:42:33.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:42:33.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:43:03.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:43:03.330 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:43:03.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:43:04.054 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:43:04.062 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:43:04.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:43:04.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-29T05:43:04.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:43:04.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-29T05:43:04.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:43:04.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:43:04.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:43:04.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:43:06.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-29T05:43:06.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:43:07.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:43:07.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:43:07.007 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:43:07.018 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:43:07.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:43:07.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:43:07.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:43:07.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:43:07.032 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:43:07.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:43:07.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:43:07.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:43:07.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:43:07.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:43:07.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:43:07.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:43:07.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:43:07.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:43:07.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:43:07.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:43:07.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:43:07.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:43:07.385 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:42:49
2026-05-29T05:43:07.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71033, datetime.datetime(2026, 5, 29, 5, 42, 49), datetime.datetime(2026, 5, 29, 5, 42, 48), 'salt', 6.42, 84.84, None, 16.09, 87.62, 2.35, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:43:07.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:43:07.386 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:43:07.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:48, diff=19.392668s, valid=True
2026-05-29T05:43:07.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:43:07.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:43:07.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:12, diff=-4.604128s, valid=True
2026-05-29T05:43:07.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:43:07.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:42:44, diff=23.403241s, valid=True
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:43:07.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:43:07.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:12, diff=-4.593331s, valid=True
2026-05-29T05:43:07.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:43:07.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:43:07.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:43:07.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958829.407402s, valid=True
2026-05-29T05:43:07.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:43:07.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:43:07.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:43:07.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:43:07.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:43:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:43:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:43:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:43:07.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:43:07.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:43:07.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:43:07.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:43:07.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:43:07.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:43:07.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:43:08.261 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:43:08.361 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:43:08.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:43:08.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-29T05:43:08.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-29T05:43:08.631 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:43:08.631 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:43:38.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:43:38.662 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:43:38.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:43:39.193 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:43:39.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:43:39.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:43:39.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-29T05:43:39.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:43:39.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-29T05:43:39.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:43:39.452 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:43:39.457 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:43:39.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-29T05:43:42.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-29T05:43:42.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:43:42.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:43:42.111 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:43:42.111 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:43:42.121 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:43:42.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:43:42.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:43:42.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:43:42.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:43:42.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:43:42.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:43:42.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:43:42.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:43:42.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:43:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:43:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:43:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:43:42.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:43:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:43:42.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:43:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:43:42.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:43:42.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:43:42.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:43:19
2026-05-29T05:43:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71034, datetime.datetime(2026, 5, 29, 5, 43, 19), datetime.datetime(2026, 5, 29, 5, 43, 18), 'salt', 6.42, 84.9, None, 16.69, 87.26, 2.34, 831.89, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:43:42.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:43:42.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:43:42.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:18, diff=24.608591s, valid=True
2026-05-29T05:43:42.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:43:42.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:43:42.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:12, diff=30.611505s, valid=True
2026-05-29T05:43:42.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:43:42.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:14, diff=28.618372s, valid=True
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:43:42.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:43:42.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:12, diff=30.621633s, valid=True
2026-05-29T05:43:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:43:42.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:43:42.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:43:42.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958864.622372s, valid=True
2026-05-29T05:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:43:42.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:43:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:43:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:43:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:43:42.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:43:42.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:43:42.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:43:42.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:43:42.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:43:42.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:43:42.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:43:42.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:43:43.004 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:43:43.269 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:43:43.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:43:43.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:43:43.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:43:43.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-29T05:43:43.702 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:43:43.902 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:43:43.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:44:13.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:44:13.923 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:44:13.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:44:14.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:44:14.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:44:14.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:44:14.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-29T05:44:14.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:44:14.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-29T05:44:14.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:44:14.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:44:14.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:44:14.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-29T05:44:18.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-29T05:44:18.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:44:18.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:44:18.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:44:18.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:44:18.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:44:18.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:44:18.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:44:18.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:44:18.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:44:18.525 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:44:18.525 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:44:18.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:44:18.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:44:18.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:44:18.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:44:18.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:44:18.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:44:18.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:44:18.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:44:18.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:44:18.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:44:18.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:44:18.867 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:44:18.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:43:49
2026-05-29T05:44:18.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71035, datetime.datetime(2026, 5, 29, 5, 43, 49), datetime.datetime(2026, 5, 29, 5, 43, 49), 'salt', 6.42, 85.1, None, 16.37, 87.1, 2.31, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:44:18.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:44:18.938 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:44:18.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:49, diff=29.945453s, valid=True
2026-05-29T05:44:18.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:44:18.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:44:18.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:44:12, diff=6.948897s, valid=True
2026-05-29T05:44:18.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:44:18.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:44:18.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:43:44, diff=34.956748s, valid=True
2026-05-29T05:44:18.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:44:18.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:44:18.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:44:18.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:44:18.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:44:18.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:44:18.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:44:12, diff=6.96033s, valid=True
2026-05-29T05:44:18.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:44:18.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:44:18.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:44:18.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958900.961124s, valid=True
2026-05-29T05:44:18.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:44:18.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:44:18.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:44:18.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:44:18.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:44:19.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:44:19.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:44:19.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:44:19.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:44:19.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:44:19.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:44:19.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:44:19.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:44:19.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:44:19.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:44:19.826 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:44:19.935 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:44:19.935 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:44:19.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-29T05:44:19.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-29T05:44:20.146 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:44:20.146 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:44:50.176 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:44:50.176 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:44:50.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:44:50.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:44:50.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:44:50.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:44:50.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-29T05:44:50.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:44:50.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-29T05:44:50.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:44:50.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:44:50.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:44:50.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-29T05:44:53.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-29T05:44:53.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:44:53.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:44:53.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:44:53.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:44:53.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:44:53.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:44:53.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:44:53.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:44:53.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:44:53.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:44:53.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:44:53.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:44:53.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:44:53.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:44:53.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:44:53.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:44:53.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:44:53.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:44:53.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:44:53.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:44:53.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:44:53.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:44:53.634 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:44:53.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:44:50
2026-05-29T05:44:53.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71037, datetime.datetime(2026, 5, 29, 5, 44, 50), datetime.datetime(2026, 5, 29, 5, 44, 50), 'salt', 6.36, 85.27, None, 16.48, 87.64, 2.29, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:44:53.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:44:53.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:44:53.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:44:50, diff=3.74009s, valid=True
2026-05-29T05:44:53.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:44:53.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:44:53.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:12, diff=-18.256372s, valid=True
2026-05-29T05:44:53.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:44:53.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:44:46, diff=7.752009s, valid=True
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:44:53.752 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:44:53.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:12, diff=-18.244193s, valid=True
2026-05-29T05:44:53.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:44:53.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:44:53.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:44:53.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958935.756646s, valid=True
2026-05-29T05:44:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:44:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:44:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:44:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:44:53.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:44:53.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:44:53.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:44:53.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:44:53.845 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:44:53.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:44:53.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:44:54.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:44:54.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:44:54.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:44:54.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:44:54.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:44:54.774 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:44:54.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:44:54.775 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:44:54.775 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:44:55.059 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:44:55.060 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:45:25.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:45:25.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:45:25.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:45:25.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:45:25.249 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:45:25.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:45:25.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-29T05:45:25.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:45:25.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-29T05:45:25.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:45:25.483 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:45:25.487 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:45:25.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-29T05:45:28.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-29T05:45:28.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:45:28.157 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:45:28.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:45:28.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:45:28.168 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:45:28.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:45:28.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:45:28.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:45:28.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:45:28.182 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:45:28.183 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:45:28.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:45:28.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:45:28.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:45:28.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:45:28.412 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:45:28.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:45:28.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:45:28.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:45:28.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:45:28.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:45:28.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:45:28.505 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:45:28.573 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:45:21
2026-05-29T05:45:28.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71038, datetime.datetime(2026, 5, 29, 5, 45, 21), datetime.datetime(2026, 5, 29, 5, 45, 20), 'salt', 6.29, 85.17, None, 16.2, 86.89, 2.3, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:45:28.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:45:28.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:45:28.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:20, diff=8.580427s, valid=True
2026-05-29T05:45:28.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:45:28.580 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:45:28.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:12, diff=16.583932s, valid=True
2026-05-29T05:45:28.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:45:28.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:17, diff=11.591982s, valid=True
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:45:28.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:45:28.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:12, diff=16.595901s, valid=True
2026-05-29T05:45:28.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:45:28.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:45:28.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:45:28.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=958970.596712s, valid=True
2026-05-29T05:45:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:45:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:45:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:45:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:45:28.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:45:28.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:45:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:45:28.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:45:28.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:45:28.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:45:28.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:45:28.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:45:28.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:45:28.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:45:29.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:45:29.449 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:45:29.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:45:29.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:45:29.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-29T05:45:29.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-29T05:45:29.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:45:29.787 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:45:59.802 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:45:59.803 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:45:59.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:45:59.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:45:59.925 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:46:00.125 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:46:00.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:46:00.137 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:46:00.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-29T05:46:00.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:46:00.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:46:00.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:46:00.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:46:03.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-29T05:46:03.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:46:03.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:46:03.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:46:03.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:46:03.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:46:03.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:46:03.114 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:46:03.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:46:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:46:03.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:46:03.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:46:03.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:46:03.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:46:03.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:46:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:46:03.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:46:03.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:46:03.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:46:03.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:46:03.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:46:03.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:46:03.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:46:03.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:46:03.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:45:51
2026-05-29T05:46:03.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71039, datetime.datetime(2026, 5, 29, 5, 45, 51), datetime.datetime(2026, 5, 29, 5, 45, 51), 'salt', 6.39, 85.43, None, 16.76, 90.01, 2.26, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:46:03.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:46:03.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:46:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:51, diff=12.522134s, valid=True
2026-05-29T05:46:03.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:46:03.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:46:03.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:12, diff=-8.474413s, valid=True
2026-05-29T05:46:03.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:46:03.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:46:03.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:45:49, diff=14.533831s, valid=True
2026-05-29T05:46:03.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:46:03.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:46:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:46:03.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:46:03.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:46:03.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:46:03.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:12, diff=-8.462526s, valid=True
2026-05-29T05:46:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:46:03.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:46:03.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:46:03.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959005.538272s, valid=True
2026-05-29T05:46:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:46:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:46:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:46:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:46:03.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:46:03.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:46:03.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:46:03.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:46:03.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:46:03.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:46:03.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:46:03.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:46:03.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:46:03.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:46:04.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:46:04.451 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:46:04.550 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:46:04.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:46:04.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-29T05:46:04.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-29T05:46:04.786 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:46:04.786 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:46:34.811 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:46:34.811 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:46:34.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:46:34.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:46:34.932 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:46:35.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:46:35.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-29T05:46:35.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:46:35.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-29T05:46:35.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:46:35.156 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:46:35.161 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:46:35.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-29T05:46:37.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:46:37.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:46:37.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:46:37.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:46:37.858 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:46:37.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:46:37.881 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:46:37.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:46:37.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:46:37.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:46:37.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:46:37.883 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:46:37.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:46:37.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:46:37.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:46:38.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:46:38.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:46:38.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:46:38.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:46:38.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:46:38.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:46:38.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:46:38.156 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:46:38.157 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:46:38.221 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:46:21
2026-05-29T05:46:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71040, datetime.datetime(2026, 5, 29, 5, 46, 21), datetime.datetime(2026, 5, 29, 5, 46, 20), 'salt', 6.36, 85.47, None, 15.63, 86.51, 2.25, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:46:38.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:46:38.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:46:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:20, diff=18.228189s, valid=True
2026-05-29T05:46:38.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:46:38.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:46:38.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:12, diff=26.231414s, valid=True
2026-05-29T05:46:38.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:46:38.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:46:38.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:20, diff=18.238871s, valid=True
2026-05-29T05:46:38.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:46:38.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:46:38.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:46:38.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:46:38.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:46:38.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:46:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:12, diff=26.242286s, valid=True
2026-05-29T05:46:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:46:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:46:38.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:46:38.243 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959040.243017s, valid=True
2026-05-29T05:46:38.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:46:38.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:46:38.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:46:38.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:46:38.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:46:38.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:46:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:46:38.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:46:38.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:46:38.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:46:38.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:46:38.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:46:38.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:46:38.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:46:38.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:46:39.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:46:39.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:46:39.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:46:39.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-29T05:46:39.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-29T05:46:39.472 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:46:39.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:47:09.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:47:09.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:47:09.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:47:10.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:47:10.161 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:47:10.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:47:10.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-29T05:47:10.436 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:47:10.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-29T05:47:10.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:47:10.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:47:10.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:47:10.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-29T05:47:13.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-29T05:47:13.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:47:13.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:47:13.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:47:13.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:47:13.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:47:13.172 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:47:13.173 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:47:13.173 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:47:13.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:47:13.174 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:47:13.174 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:47:13.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:47:13.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:47:13.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:47:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:47:13.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:47:13.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:47:13.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:47:13.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:47:13.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:47:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:47:13.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:47:13.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:47:13.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:46:52
2026-05-29T05:47:13.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71041, datetime.datetime(2026, 5, 29, 5, 46, 52), datetime.datetime(2026, 5, 29, 5, 46, 51), 'salt', 6.46, 85.83, None, 14.86, 89.7, 2.2, 831.95, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:47:13.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:47:13.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:47:13.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:51, diff=22.567949s, valid=True
2026-05-29T05:47:13.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:47:13.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:47:13.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:12, diff=1.571293s, valid=True
2026-05-29T05:47:13.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:47:13.571 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:46:46, diff=27.579261s, valid=True
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:47:13.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:47:13.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:12, diff=1.582871s, valid=True
2026-05-29T05:47:13.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:47:13.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:47:13.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:47:13.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959075.583672s, valid=True
2026-05-29T05:47:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:47:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:47:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:47:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:47:13.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:47:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:47:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:47:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:47:13.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:47:13.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:47:13.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:47:13.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:47:13.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:47:13.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:47:14.107 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:47:14.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:47:14.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:47:14.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:47:14.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-29T05:47:14.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-29T05:47:14.749 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:47:14.749 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:47:44.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:47:44.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:47:44.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:47:45.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:47:45.113 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:47:45.325 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:47:45.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-29T05:47:45.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:47: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-29T05:47:45.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:47:45.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:47:45.361 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:47:45.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-29T05:47:48.357 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:47:48.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:47:48.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:47:48.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:47:48.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:47:48.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:47:48.389 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:47:48.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:47:48.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:47:48.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:47:48.391 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:47:48.391 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:47:48.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:47:48.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:47:48.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:47:48.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:47:48.616 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:47:48.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:47:48.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:47:48.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:47:48.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:47:48.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:47:48.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:47:48.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:47:48.767 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:47:22
2026-05-29T05:47:48.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71042, datetime.datetime(2026, 5, 29, 5, 47, 22), datetime.datetime(2026, 5, 29, 5, 47, 22), 'salt', 6.46, 85.77, None, 16.09, 90.46, 2.21, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:47:48.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:47:48.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:47:48.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:22, diff=26.774611s, valid=True
2026-05-29T05:47:48.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:47:48.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:47:48.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:12, diff=36.777971s, valid=True
2026-05-29T05:47:48.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:47:48.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:47:48.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:16, diff=32.785816s, valid=True
2026-05-29T05:47:48.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:47:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:47:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:47:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:47:48.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:47:48.786 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:47:48.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:47:12, diff=36.78942s, valid=True
2026-05-29T05:47:48.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:47:48.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:47:48.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:47:48.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959110.790216s, valid=True
2026-05-29T05:47:48.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:47:48.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:47:48.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:47:48.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:47:48.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:47:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:47:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:47:48.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:47:48.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:47:48.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:47:48.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:47:49.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:47:49.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:47:49.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:47:49.306 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:47:49.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:47:49.792 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:47:49.792 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:47:49.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-29T05:47:49.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-29T05:47:50.093 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:47:50.093 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:48:20.122 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:48:20.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:48:20.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:48:20.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:48:20.441 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:48:20.657 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:48:20.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-29T05:48:20.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:48:20.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-29T05:48:20.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:48:20.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:48:20.691 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:48:20.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:48:23.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-29T05:48:23.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:48:23.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:48:23.290 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:48:23.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:48:23.302 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:48:23.314 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:48:23.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:48:23.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:48:23.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:48:23.316 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:48:23.316 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:48:23.323 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:48:23.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:48:23.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:48:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:48:23.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:48:23.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:48:23.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:48:23.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:48:23.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:48:23.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:48:23.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:48:23.639 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:48:23.697 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:48:22
2026-05-29T05:48:23.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71044, datetime.datetime(2026, 5, 29, 5, 48, 22), datetime.datetime(2026, 5, 29, 5, 48, 22), 'salt', 6.46, 85.86, None, 16.41, 92.19, 2.19, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:48:23.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:48:23.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:48:23.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:22, diff=1.704916s, valid=True
2026-05-29T05:48:23.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:48:23.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:48:23.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:12, diff=11.708264s, valid=True
2026-05-29T05:48:23.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:48:23.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:16, diff=7.715996s, valid=True
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:48:23.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:48:23.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:12, diff=11.719698s, valid=True
2026-05-29T05:48:23.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:48:23.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:48:23.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:48:23.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959145.720466s, valid=True
2026-05-29T05:48:23.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:48:23.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:48:23.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:48:23.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:48:23.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:48:23.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:48:23.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:48:23.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:48:23.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:48:23.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:48:23.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:48:23.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:48:24.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:48:24.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:48:24.254 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:48:24.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:48:24.683 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:48:24.683 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:48:24.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-29T05:48:24.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-29T05:48:24.957 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:48:24.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:48:54.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:48:54.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:48:54.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:48:55.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:48:55.130 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:48:55.335 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:48:55.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-29T05:48:55.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:48:55.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-29T05:48:55.363 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:48:55.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:48:55.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:48:55.369 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:48:58.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-29T05:48:58.072 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:48:58.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:48:58.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:48:58.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:48:58.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:48:58.105 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:48:58.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:48:58.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:48:58.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:48:58.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:48:58.107 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:48:58.114 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:48:58.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:48:58.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:48:58.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:48:58.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:48:58.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:48:58.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:48:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:48:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:48:58.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:48:58.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:48:58.425 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:48:58.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:48:53
2026-05-29T05:48:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71045, datetime.datetime(2026, 5, 29, 5, 48, 53), datetime.datetime(2026, 5, 29, 5, 48, 52), 'salt', 6.42, 86.03, None, 16.62, 89.87, 2.16, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:48:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:48:58.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:48:58.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:52, diff=6.49077s, valid=True
2026-05-29T05:48:58.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:48:58.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:48:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:12, diff=-13.505858s, valid=True
2026-05-29T05:48:58.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:48:58.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:48:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:48:47, diff=11.501959s, valid=True
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:48:58.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:48:58.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:12, diff=-13.494458s, valid=True
2026-05-29T05:48:58.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:48:58.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:48:58.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:48:58.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959180.506354s, valid=True
2026-05-29T05:48:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:48:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:48:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:48:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:48:58.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:48:58.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:48:58.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:48:58.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:48:58.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:48:58.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:48:58.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:48:58.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:48:58.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:48:58.827 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:48:59.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:48:59.423 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:48:59.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:48:59.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:48:59.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-29T05:48:59.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-29T05:48:59.743 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:48:59.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:49:29.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:49:29.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:49:29.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:49:30.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:49:30.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:49:30.423 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:49:30.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-29T05:49:30.435 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:49:30.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-29T05:49:30.447 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:49:30.447 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:49:30.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:49:30.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-29T05:49:33.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-29T05:49:33.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:49:33.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:49:33.076 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:49:33.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:49:33.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:49:33.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:49:33.103 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:49:33.103 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:49:33.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:49:33.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:49:33.104 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:49:33.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:49:33.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:49:33.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:49:33.289 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:49:33.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:49:33.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:49:33.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:49:33.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:49:33.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:49:33.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:49:33.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:49:33.375 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:49:33.443 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:49:23
2026-05-29T05:49:33.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71046, datetime.datetime(2026, 5, 29, 5, 49, 23), datetime.datetime(2026, 5, 29, 5, 49, 23), 'salt', 6.36, 85.96, None, 17.01, 91.96, 2.17, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:49:33.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:49:33.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:49:33.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:23, diff=10.450326s, valid=True
2026-05-29T05:49:33.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:49:33.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:49:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:12, diff=21.453524s, valid=True
2026-05-29T05:49:33.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:49:33.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:18, diff=15.461016s, valid=True
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:49:33.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:49:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:12, diff=21.465467s, valid=True
2026-05-29T05:49:33.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:49:33.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:49:33.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:49:33.466 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959215.466281s, valid=True
2026-05-29T05:49:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:49:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:49:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:49:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:49:33.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:49:33.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:49:33.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:49:33.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:49:33.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:49:33.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:49:33.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:49:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:49:33.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:49:33.786 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:49:33.982 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:49:34.310 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:49:34.409 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:49:34.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:49:34.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-29T05:49:34.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-29T05:49:34.607 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:49:34.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:50:04.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:50:04.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:50:04.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:50:04.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:50:04.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:50:04.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:50:04.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-29T05:50:04.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:50:04.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:50:05.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:50:05.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:50:05.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:50:05.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-29T05:50:07.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-29T05:50:07.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:50:07.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:50:07.612 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:50:07.612 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:50:07.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:50:07.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:50:07.633 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:50:07.633 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:50:07.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:50:07.633 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:50:07.633 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:50:07.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:50:07.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:50:07.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:50:07.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:50:07.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:50:07.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:50:07.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:50:07.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:50:07.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:50:07.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:50:07.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:50:07.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:50:07.958 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:49:53
2026-05-29T05:50:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71047, datetime.datetime(2026, 5, 29, 5, 49, 53), datetime.datetime(2026, 5, 29, 5, 49, 53), 'salt', 6.23, 85.96, None, 15.74, 88.6, 2.17, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:50:07.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:50:07.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:50:07.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:53, diff=14.965109s, valid=True
2026-05-29T05:50:07.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:50:07.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:50:07.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:12, diff=-4.031708s, valid=True
2026-05-29T05:50:07.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:50:07.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:50:07.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:49:50, diff=17.975829s, valid=True
2026-05-29T05:50:07.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:50:07.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:50:07.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:50:07.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:50:07.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:50:07.976 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:50:07.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:12, diff=-4.020603s, valid=True
2026-05-29T05:50:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:50:07.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:50:07.979 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:50:07.980 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959249.980157s, valid=True
2026-05-29T05:50:07.981 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:50:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:50:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:50:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:50:07.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:50:08.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:50:08.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:50:08.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:50:08.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:50:08.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:50:08.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:50:08.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:50:08.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:50:08.300 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:50:08.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:50:08.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:50:09.009 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:50:09.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:50:09.009 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:50:09.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:50:09.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:50:09.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:50:39.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:50:39.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:50:39.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:50:39.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:50:39.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:50:39.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:50:39.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-29T05:50:39.849 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:50:39.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-29T05:50:39.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:50:39.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:50:39.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:50:39.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:50:42.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-29T05:50:42.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:50:42.549 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:50:42.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:50:42.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:50:42.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:50:42.571 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:50:42.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:50:42.572 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:50:42.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:50:42.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:50:42.573 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:50:42.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:50:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:50:42.704 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:50:42.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:50:42.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:50:42.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:50:42.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:50:42.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:50:42.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:50:42.889 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:50:42.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:50:42.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:50:42.950 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:50:23
2026-05-29T05:50:42.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71048, datetime.datetime(2026, 5, 29, 5, 50, 23), datetime.datetime(2026, 5, 29, 5, 50, 23), 'salt', 6.23, 86.1, None, 17.71, 84.91, 2.15, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:50:42.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:50:42.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:50:42.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:23, diff=19.957436s, valid=True
2026-05-29T05:50:42.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:50:42.957 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:50:42.960 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:12, diff=30.960814s, valid=True
2026-05-29T05:50:42.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:50:42.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:50:42.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:21, diff=21.968653s, valid=True
2026-05-29T05:50:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:50:42.968 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:50:42.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:50:42.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:50:42.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:50:42.969 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:50:42.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:12, diff=30.972226s, valid=True
2026-05-29T05:50:42.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:50:42.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:50:42.972 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:50:42.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959284.973016s, valid=True
2026-05-29T05:50:42.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:50:42.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:50:42.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:50:42.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:50:42.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:50:43.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:50:43.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:50:43.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:50:43.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:50:43.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:50:43.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:50:43.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:50:43.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:50:43.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:50:43.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:50:43.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:50:43.933 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:50:43.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:50:43.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-29T05:50:43.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-29T05:50:44.213 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:50:44.213 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:51:14.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:51:14.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:51:14.243 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:51:14.557 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:51:14.571 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:51:14.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:51:14.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-29T05:51:14.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:51:14.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-29T05:51:14.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:51:14.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:51:14.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:51:14.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-29T05:51:17.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-29T05:51:17.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:51:17.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:51:17.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:51:17.790 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:51:17.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:51:17.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:51:17.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:51:17.815 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:51:17.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:51:17.816 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:51:17.816 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:51:17.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:51:17.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:51:17.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:51:18.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:51:18.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:51:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:51:18.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:51:18.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:51:18.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:51:18.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:51:18.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:51:18.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:51:18.198 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:50:54
2026-05-29T05:51:18.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71049, datetime.datetime(2026, 5, 29, 5, 50, 54), datetime.datetime(2026, 5, 29, 5, 50, 53), 'salt', 6.19, 86.3, None, 17.15, 87.57, 2.11, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:51:18.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:51:18.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:51:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:53, diff=25.206043s, valid=True
2026-05-29T05:51:18.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:51:18.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:51:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:12, diff=6.209427s, valid=True
2026-05-29T05:51:18.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:51:18.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:50:53, diff=25.21724s, valid=True
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:51:18.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:51:18.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:12, diff=6.220861s, valid=True
2026-05-29T05:51:18.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:51:18.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:51:18.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:51:18.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959320.221649s, valid=True
2026-05-29T05:51:18.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:51:18.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:51:18.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:51:18.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:51:18.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:51:18.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:51:18.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:51:18.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:51:18.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:51:18.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:51:18.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:51:18.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:51:18.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:51:18.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:51:18.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:51:19.176 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:51:19.277 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:51:19.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:51:19.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-29T05:51:19.278 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:51:19.534 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:51:19.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:51:49.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:51:49.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:51:49.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:51:49.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:51:49.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:51:49.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:51:49.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-29T05:51:49.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:51:49.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:51:49.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:51:49.964 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:51:49.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:51:49.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-29T05:51:52.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-29T05:51:52.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:51:52.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:51:52.961 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:51:52.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:51:52.972 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:51:52.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:51:52.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:51:52.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:51:52.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:51:52.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:51:52.989 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:51:52.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:51:53.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:51:53.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:51:53.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:51:53.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:51:53.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:51:53.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:51:53.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:51:53.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:51:53.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:51:53.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:51:53.317 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:51:53.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:51:24
2026-05-29T05:51:53.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71050, datetime.datetime(2026, 5, 29, 5, 51, 24), datetime.datetime(2026, 5, 29, 5, 51, 24), 'salt', 6.16, 86.43, None, 16.94, 84.12, 2.09, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:51:53.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:51:53.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:51:53.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:24, diff=29.384493s, valid=True
2026-05-29T05:51:53.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:51:53.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:51:53.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:12, diff=41.388061s, valid=True
2026-05-29T05:51:53.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:51:53.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:18, diff=35.396219s, valid=True
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:51:53.396 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:51:53.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:51:12, diff=41.400006s, valid=True
2026-05-29T05:51:53.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:51:53.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:51:53.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:51:53.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959355.400841s, valid=True
2026-05-29T05:51:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:51:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:51:53.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:51:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:51:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:51:53.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:51:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:51:53.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:51:53.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:51:53.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:51:53.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:51:53.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:51:53.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:51:53.723 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:51:53.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:51:54.268 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:51:54.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:51:54.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:51:54.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-29T05:51:54.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-29T05:51:54.524 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:51:54.524 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:52:24.555 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:52:24.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:52:24.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:52:24.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:52:24.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:52:25.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:52:25.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-29T05:52:25.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:52: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-29T05:52:25.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:52:25.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:52:25.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:52:25.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-29T05:52:28.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-29T05:52:28.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:52:28.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:52:28.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:52:28.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:52:28.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:52:28.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:52:28.769 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:52:28.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:52:28.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:52:28.770 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:52:28.770 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:52:28.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:52:28.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:52:28.904 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:52:28.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:52:29.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:52:29.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:52:29.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:52:29.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:52:29.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:52:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:52:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:52:29.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:52:29.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:52:25
2026-05-29T05:52:29.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71052, datetime.datetime(2026, 5, 29, 5, 52, 25), datetime.datetime(2026, 5, 29, 5, 52, 24), 'salt', 6.23, 86.79, None, 14.36, 84.12, 2.04, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:52:29.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:52:29.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:52:29.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:24, diff=5.157635s, valid=True
2026-05-29T05:52:29.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:52:29.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:52:29.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:12, diff=17.161082s, valid=True
2026-05-29T05:52:29.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:52:29.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:52:29.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:18, diff=11.168808s, valid=True
2026-05-29T05:52:29.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:52:29.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:52:29.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:52:29.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:52:29.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:52:29.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:52:29.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:12, diff=17.172391s, valid=True
2026-05-29T05:52:29.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:52:29.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:52:29.172 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:52:29.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959391.173179s, valid=True
2026-05-29T05:52:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:52:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:52:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:52:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:52:29.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:52:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:52:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:52:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:52:29.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:52:29.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:52:29.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:52:29.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:52:29.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:52:29.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:52:29.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:52:30.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:52:30.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:52:30.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:52:30.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-29T05:52:30.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-29T05:52:30.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:52:30.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:53:00.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:53:00.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:53:00.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:53:00.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:53:00.750 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:53:00.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:53:00.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:53:00.969 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:53:00.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-29T05:53:00.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:53:00.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:53:00.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:53:00.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-29T05:53:03.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-29T05:53:03.627 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:53:03.634 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:53:03.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:53:03.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:53:03.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:53:03.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:53:03.659 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:53:03.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:53:03.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:53:03.660 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:53:03.660 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:53:03.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:53:03.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:53:03.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:53:03.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:53:03.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:53:03.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:53:03.930 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:53:03.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:53:03.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:53:03.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:53:03.972 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:53:03.972 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:53:04.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:52:55
2026-05-29T05:53:04.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71053, datetime.datetime(2026, 5, 29, 5, 52, 55), datetime.datetime(2026, 5, 29, 5, 52, 54), 'salt', 6.32, 86.83, None, 15.6, 87.47, 2.02, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:53:04.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:53:04.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:53:04.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:54, diff=10.035973s, valid=True
2026-05-29T05:53:04.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:53:04.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:53:04.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:12, diff=-7.961125s, valid=True
2026-05-29T05:53:04.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:53:04.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:52:48, diff=16.045526s, valid=True
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:53:04.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:53:04.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:12, diff=-7.951421s, valid=True
2026-05-29T05:53:04.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:53:04.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:53:04.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:53:04.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959426.049246s, valid=True
2026-05-29T05:53:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:53:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:53:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:53:04.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:53:04.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:53:04.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:53:04.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:53:04.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:53:04.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:53:04.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:53:04.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:53:04.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:53:04.327 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:53:04.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:53:04.571 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:53:04.907 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:53:05.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:53:05.008 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:53:05.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-29T05:53:05.009 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:53:05.253 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:53:05.253 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:53:35.283 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:53:35.283 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:53:35.283 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:53:35.455 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:53:35.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:53:35.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:53:35.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-29T05:53:35.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:53:35.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-29T05:53:35.767 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:53:35.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:53:35.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:53:35.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-29T05:53:38.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-29T05:53:38.474 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:53:38.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:53:38.484 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:53:38.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:53:38.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:53:38.508 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:53:38.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:53:38.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:53:38.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:53:38.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:53:38.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:53:38.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:53:38.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:53:38.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:53:38.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:53:38.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:53:38.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:53:38.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:53:38.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:53:38.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:53:38.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:53:38.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:53:38.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:53:38.887 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:53:25
2026-05-29T05:53:38.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71054, datetime.datetime(2026, 5, 29, 5, 53, 25), datetime.datetime(2026, 5, 29, 5, 53, 25), 'salt', 6.23, 86.79, None, 15.28, 86.56, 2.04, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:53:38.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:53:38.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:53:38.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:25, diff=13.894712s, valid=True
2026-05-29T05:53:38.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:53:38.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:53:38.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:12, diff=26.898033s, valid=True
2026-05-29T05:53:38.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:53:38.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:53:38.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:19, diff=19.905846s, valid=True
2026-05-29T05:53:38.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:53:38.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:53:38.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:53:38.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:53:38.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:53:38.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:53:38.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:12, diff=26.909404s, valid=True
2026-05-29T05:53:38.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:53:38.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:53:38.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:53:38.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959460.910185s, valid=True
2026-05-29T05:53:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:53:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:53:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:53:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:53:38.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:53:38.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:53:38.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:53:38.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:53:38.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:53:39.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:53:39.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:53:39.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:53:39.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:53:39.231 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:53:39.438 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:53:39.779 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:53:39.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:53:39.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:53:39.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:53:39.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-29T05:53:40.084 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:53:40.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:54:10.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:54:10.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:54:10.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:54:10.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:54:10.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:54:10.633 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:54:10.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-29T05:54:10.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:54:10.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-29T05:54:10.666 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:54:10.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:54:10.673 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:54:10.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-29T05:54:13.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:54:13.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:54:13.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:54:13.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:54:13.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:54:13.426 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:54:13.438 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:54:13.439 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:54:13.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:54:13.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:54:13.440 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:54:13.440 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:54:13.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:54:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:54:13.575 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:54:13.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:54:13.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:54:13.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:54:13.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:54:13.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:54:13.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:54:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:54:13.762 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:54:13.762 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:54:13.824 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:53:56
2026-05-29T05:54:13.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71055, datetime.datetime(2026, 5, 29, 5, 53, 56), datetime.datetime(2026, 5, 29, 5, 53, 55), 'salt', 6.23, 86.76, None, 16.06, 87.45, 2.04, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:54:13.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:54:13.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:54:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:55, diff=18.832784s, valid=True
2026-05-29T05:54:13.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:54:13.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:54:13.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:12, diff=1.836198s, valid=True
2026-05-29T05:54:13.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:54:13.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:53:51, diff=22.844139s, valid=True
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:54:13.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:54:13.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:12, diff=1.847843s, valid=True
2026-05-29T05:54:13.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:54:13.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:54:13.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:54:13.848 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959495.84864s, valid=True
2026-05-29T05:54:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:54:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:54:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:54:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:54:13.850 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:54:13.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:54:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:54:13.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:54:13.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:54:13.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:54:14.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:54:14.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:54:14.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:54:14.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:54:14.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:54:14.727 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:54:14.888 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:54:14.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:54:14.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-29T05:54:14.889 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:54:15.094 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:54:15.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:54:45.125 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:54:45.125 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:54:45.125 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:54:45.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:54:45.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:54:45.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:54:45.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-29T05:54:45.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:54:45.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-29T05:54:46.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:54:46.000 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:54:46.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:54:46.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T05:54:48.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-29T05:54:48.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:54:49.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:54:49.008 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:54:49.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:54:49.017 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:54:49.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:54:49.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:54:49.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:54:49.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:54:49.031 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:54:49.032 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:54:49.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:54:49.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:54:49.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:54:49.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:54:49.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:54:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:54:49.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:54:49.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:54:49.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:54:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:54:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:54:49.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:54:49.395 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:54:26
2026-05-29T05:54:49.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71056, datetime.datetime(2026, 5, 29, 5, 54, 26), datetime.datetime(2026, 5, 29, 5, 54, 26), 'salt', 6.16, 86.79, None, 15.28, 84.42, 2.03, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:54:49.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:54:49.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:54:49.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:26, diff=23.402488s, valid=True
2026-05-29T05:54:49.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:54:49.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:54:49.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:12, diff=37.405924s, valid=True
2026-05-29T05:54:49.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:54:49.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:54:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:22, diff=27.413876s, valid=True
2026-05-29T05:54:49.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:54:49.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:54:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:54:49.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:54:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:54:49.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:54:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:12, diff=37.417455s, valid=True
2026-05-29T05:54:49.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:54:49.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:54:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:54:49.418 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959531.41824s, valid=True
2026-05-29T05:54:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:54:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:54:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:54:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:54:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:54:49.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:54:49.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:54:49.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:54:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:54:49.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:54:49.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:54:49.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:54:49.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:54:49.740 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:54:49.958 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:54:50.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:54:50.402 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:54:50.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:54:50.402 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T05:54:50.402 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:54:50.838 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:54:50.838 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:55:20.850 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:55:20.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:55: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-29T05:55:21.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:55:21.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:55:21.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:55:21.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-29T05:55:21.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:55:21.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-29T05:55:21.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:55:21.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:55:21.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:55:21.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-29T05:55:23.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-29T05:55:23.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:55:23.851 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:55:23.851 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:55:23.851 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:55:23.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:55:23.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:55:23.873 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:55:23.873 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:55:23.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:55:23.873 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:55:23.874 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:55:23.880 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:55:23.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:55:23.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:55:24.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:55:24.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:55:24.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:55:24.123 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:55:24.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:55:24.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:55:24.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:55:24.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:55:24.166 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:55:24.227 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:54:56
2026-05-29T05:55:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71057, datetime.datetime(2026, 5, 29, 5, 54, 56), datetime.datetime(2026, 5, 29, 5, 54, 56), 'salt', 6.13, 86.86, None, 14.89, 86.89, 2.02, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:55:24.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:55:24.228 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:55:24.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:56, diff=28.234377s, valid=True
2026-05-29T05:55:24.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:55:24.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:55:24.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:55:12, diff=12.237497s, valid=True
2026-05-29T05:55:24.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:55:24.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:55:24.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:54:54, diff=30.244661s, valid=True
2026-05-29T05:55:24.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:55:24.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:55:24.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:55:24.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:55:24.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:55:24.245 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:55:24.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:55:12, diff=12.247928s, valid=True
2026-05-29T05:55:24.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:55:24.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:55:24.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:55:24.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959566.248653s, valid=True
2026-05-29T05:55:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:55:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:55:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:55:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:55:24.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:55:24.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:55:24.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:55:24.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:55:24.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:55:24.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:55:24.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:55:24.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:55:24.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:55:24.569 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:55:24.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:55:25.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:55:25.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:55:25.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:55:25.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-29T05:55:25.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-29T05:55:25.502 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:55:25.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:55:55.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:55:55.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:55:55.514 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:55:55.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:55:55.684 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:55:55.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:55:55.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-29T05:55:55.899 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:55:55.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-29T05:55:55.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:55:55.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:55:55.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:55:55.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-29T05:55:59.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-29T05:55:59.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:55:59.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:55:59.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:55:59.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:55:59.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:55:59.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:55:59.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:55:59.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:55:59.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:55:59.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:55:59.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:55:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:55:59.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T05:55:59.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:55:59.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T05:55:59.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:55:59.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:55:59.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:55:59.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T05:55:59.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:55:59.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:55:59.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:55:59.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:55:59.502 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:55:57
2026-05-29T05:55:59.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71059, datetime.datetime(2026, 5, 29, 5, 55, 57), datetime.datetime(2026, 5, 29, 5, 55, 56), 'salt', 6.03, 87.06, None, 15.0, 89.99, 1.99, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:55:59.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:55:59.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T05:55:59.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:55:56, diff=3.509956s, valid=True
2026-05-29T05:55:59.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:55:59.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:55:59.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:12, diff=-12.486609s, valid=True
2026-05-29T05:55:59.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:55:59.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:55:57, diff=2.521385s, valid=True
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:55:59.521 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T05:55:59.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:12, diff=-12.474933s, valid=True
2026-05-29T05:55:59.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:55:59.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:55:59.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:55:59.525 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959601.525873s, valid=True
2026-05-29T05:55:59.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:55:59.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:55:59.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:55:59.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:55:59.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:55:59.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:55:59.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:55:59.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:55:59.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:55:59.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:55:59.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:55:59.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:55:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:55:59.858 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:56:00.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:56:00.431 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:56:00.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:56:00.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:56:00.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-29T05:56:00.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T05:56:00.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:56:00.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:56:30.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:56:30.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:56:30.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:56:31.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:56:31.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:56:31.261 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:56:31.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-29T05:56:31.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:56:31.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-29T05:56:31.314 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:56:31.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:56:31.321 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:56:31.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-29T05:56:33.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-29T05:56:33.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:56:33.920 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:56:33.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:56:33.921 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:56:33.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:56:33.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:56:33.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:56:33.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:56:33.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:56:33.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:56:33.946 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:56:33.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:56:34.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:56:34.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:56:34.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:56:34.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:56:34.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:56:34.226 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:56:34.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:56:34.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:56:34.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:56:34.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:56:34.273 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:56:34.339 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:56:27
2026-05-29T05:56:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71060, datetime.datetime(2026, 5, 29, 5, 56, 27), datetime.datetime(2026, 5, 29, 5, 56, 27), 'salt', 6.09, 87.33, None, 15.1, 86.6, 1.94, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:56:34.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:56:34.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:56:34.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:27, diff=7.348928s, valid=True
2026-05-29T05:56:34.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:56:34.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:56:34.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:12, diff=22.353643s, valid=True
2026-05-29T05:56:34.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:56:34.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:56:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:20, diff=14.364418s, valid=True
2026-05-29T05:56:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:56:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:56:34.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:56:34.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:56:34.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:56:34.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:56:34.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:12, diff=22.369351s, valid=True
2026-05-29T05:56:34.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:56:34.369 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:56:34.369 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:56:34.370 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959636.370463s, valid=True
2026-05-29T05:56:34.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:56:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:56:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:56:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:56:34.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:56:34.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:56:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:56:34.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:56:34.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:56:34.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:56:34.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:56:34.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:56:34.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:56:34.773 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:56:34.978 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:56:35.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:56:35.416 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:56:35.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:56:35.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-29T05:56:35.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-29T05:56:35.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:56:35.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:57:05.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:57:05.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:57:05.671 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:57:05.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:57:05.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:57:06.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:57:06.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-29T05:57:06.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:57:06.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-29T05:57:06.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:57:06.060 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:57:06.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:57:06.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-29T05:57:08.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T05:57:08.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:57:08.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:57:08.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:57:08.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:57:08.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:57:08.689 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:57:08.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:57:08.690 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:57:08.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:57:08.691 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:57:08.691 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:57:08.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:57:08.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:57:08.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:57:08.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:57:08.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:57:08.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:57:08.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:57:09.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:57:09.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:57:09.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:57:09.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:57:09.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:57:09.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:56:58
2026-05-29T05:57:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71061, datetime.datetime(2026, 5, 29, 5, 56, 58), datetime.datetime(2026, 5, 29, 5, 56, 58), 'salt', 6.13, 87.36, None, 16.13, 89.35, 1.94, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:57:09.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:57:09.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:57:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:58, diff=11.080997s, valid=True
2026-05-29T05:57:09.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:57:09.081 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:57:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:12, diff=-2.915732s, valid=True
2026-05-29T05:57:09.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:57:09.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:57:09.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:56:50, diff=19.09166s, valid=True
2026-05-29T05:57:09.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:57:09.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:57:09.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:57:09.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:57:09.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:57:09.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:57:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:12, diff=-2.904894s, valid=True
2026-05-29T05:57:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:57:09.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:57:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:57:09.095 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959671.095887s, valid=True
2026-05-29T05:57:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:57:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:57:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:57:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:57:09.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:57:09.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:57:09.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:57:09.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:57:09.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:57:09.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:57:09.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:57:09.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:57:09.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:57:09.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:57:09.619 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:57:09.966 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:57:10.075 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:57:10.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:57:10.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-29T05:57:10.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-29T05:57:10.265 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:57:10.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:57:40.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:57:40.292 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:57:40.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:57:40.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:57:40.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:57:40.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:57:40.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-29T05:57:40.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:57:40.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-29T05:57:40.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:57:40.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:57:40.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:57:40.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-29T05:57:43.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-29T05:57:43.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:57:43.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:57:43.681 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:57:43.681 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:57:43.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:57:43.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:57:43.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:57:43.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:57:43.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:57:43.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:57:43.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:57:43.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:57:43.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:57:43.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:57:43.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:57:43.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:57:43.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:57:43.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:57:44.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:57:44.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:57:44.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:57:44.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:57:44.024 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:57:44.083 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:57:28
2026-05-29T05:57:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71062, datetime.datetime(2026, 5, 29, 5, 57, 28), datetime.datetime(2026, 5, 29, 5, 57, 28), 'salt', 6.09, 87.42, None, 16.59, 86.39, 1.92, 832.01, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:57:44.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:57:44.084 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:57:44.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:28, diff=16.091113s, valid=True
2026-05-29T05:57:44.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:57:44.091 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:57:44.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:12, diff=32.094503s, valid=True
2026-05-29T05:57:44.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:57:44.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:20, diff=24.10239s, valid=True
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:57:44.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:57:44.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:12, diff=32.106023s, valid=True
2026-05-29T05:57:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:57:44.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:57:44.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:57:44.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959706.106808s, valid=True
2026-05-29T05:57:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:57:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:57:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:57:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:57:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:57:44.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:57:44.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:57:44.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:57:44.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:57:44.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:57:44.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:57:44.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:57:44.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:57:44.495 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:57:44.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:57:45.037 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:57:45.136 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:57:45.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:57:45.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-29T05:57:45.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-29T05:57:45.291 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:57:45.291 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:58:15.321 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:58:15.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:58:15.321 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:58:15.634 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:58:15.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:58:15.856 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:58:15.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:58:15.872 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:58:15.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T05:58:15.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:58:15.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:58:15.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:58:15.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-29T05:58:18.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-29T05:58:18.996 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:58:19.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:58:19.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:58:19.004 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:58:19.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:58:19.028 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:58:19.029 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:58:19.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:58:19.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:58:19.030 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:58:19.030 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:58:19.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:58:19.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:58:19.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:58:19.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:58:19.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:58:19.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:58:19.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:58:19.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:58:19.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:58:19.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:58:19.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:58:19.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:58:19.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:57:58
2026-05-29T05:58:19.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71063, datetime.datetime(2026, 5, 29, 5, 57, 58), datetime.datetime(2026, 5, 29, 5, 57, 58), 'salt', 6.09, 87.49, None, 15.1, 90.62, 1.91, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:58:19.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:58:19.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:58:19.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:58, diff=21.424167s, valid=True
2026-05-29T05:58:19.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:58:19.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:58:19.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:12, diff=7.427642s, valid=True
2026-05-29T05:58:19.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:58:19.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:58:19.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:57:52, diff=27.435652s, valid=True
2026-05-29T05:58:19.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:58:19.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:58:19.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:58:19.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:58:19.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:58:19.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:58:19.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:12, diff=7.43929s, valid=True
2026-05-29T05:58:19.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:58:19.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:58:19.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:58:19.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959741.440097s, valid=True
2026-05-29T05:58:19.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:58:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:58:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:58:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:58:19.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:58:19.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:58:19.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:58:19.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:58:19.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:58:19.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:58:19.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:58:19.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:58:19.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:58:19.761 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:58:20.000 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:58:20.342 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:58:20.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:58:20.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:58:20.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-29T05:58:20.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-29T05:58:20.630 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:58:20.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:58:50.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:58:50.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:58:50.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:58:50.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:58:50.985 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:58:51.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:58:51.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-29T05:58:51.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:58:51.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-29T05:58:51.217 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:58:51.217 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:58:51.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:58:51.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-29T05:58:53.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-29T05:58:53.889 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:58:53.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:58:53.894 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:58:53.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:58:53.902 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:58:53.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:58:53.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:58:53.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:58:53.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:58:53.915 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:58:53.915 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:58:53.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:58:54.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:58:54.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:58:54.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:58:54.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:58:54.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:58:54.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:58:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:58:54.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:58:54.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:58:54.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:58:54.188 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:58:54.256 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:58:29
2026-05-29T05:58:54.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71064, datetime.datetime(2026, 5, 29, 5, 58, 29), datetime.datetime(2026, 5, 29, 5, 58, 28), 'salt', 6.29, 87.49, None, 14.08, 83.6, 1.92, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:58:54.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:58:54.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:58:54.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:28, diff=26.262905s, valid=True
2026-05-29T05:58:54.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:58:54.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:58:54.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:12, diff=42.265915s, valid=True
2026-05-29T05:58:54.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:58:54.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:58:54.272 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:23, diff=31.272877s, valid=True
2026-05-29T05:58:54.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:58:54.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:58:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:58:54.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:58:54.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:58:54.273 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:58:54.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:12, diff=42.276022s, valid=True
2026-05-29T05:58:54.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:58:54.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:58:54.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:58:54.276 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959776.276718s, valid=True
2026-05-29T05:58:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:58:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:58:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:58:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:58:54.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:58:54.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:58:54.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:58:54.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:58:54.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:58:54.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:58:54.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:58:54.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:58:54.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:58:54.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:58:54.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:58:55.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:58:55.303 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:58:55.303 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:58:55.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-29T05:58:55.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-29T05:58:55.531 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:58:55.532 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T05:59:25.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T05:59:25.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T05:59:25.562 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T05:59:25.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T05:59:25.714 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T05:59:25.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T05:59:25.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T05:59:25.932 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T05:59:25.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-29T05:59:25.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T05:59:25.946 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T05:59:25.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T05:59:25.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-29T05:59:28.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-29T05:59:28.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T05:59:28.809 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T05:59:28.810 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T05:59:28.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T05:59:28.819 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T05:59:28.832 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T05:59:28.833 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T05:59:28.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T05:59:28.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T05:59:28.834 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T05:59:28.834 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T05:59:28.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T05:59:28.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T05:59:28.966 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T05:59:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T05:59:29.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:59:29.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:59:29.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T05:59:29.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T05:59:29.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T05:59:29.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T05:59:29.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T05:59:29.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T05:59:29.211 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 05:59:00
2026-05-29T05:59:29.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71065, datetime.datetime(2026, 5, 29, 5, 59), datetime.datetime(2026, 5, 29, 5, 58, 59), 'salt', 6.23, 87.36, None, 14.36, 82.57, 1.94, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T05:59:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T05:59:29.212 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T05:59:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:59, diff=30.219006s, valid=True
2026-05-29T05:59:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T05:59:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:59:29.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:59:12, diff=17.222393s, valid=True
2026-05-29T05:59:29.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T05:59:29.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:58:54, diff=35.230248s, valid=True
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T05:59:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T05:59:29.233 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:59:12, diff=17.233932s, valid=True
2026-05-29T05:59:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T05:59:29.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T05:59:29.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T05:59:29.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959811.234726s, valid=True
2026-05-29T05:59:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T05:59:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T05:59:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T05:59:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T05:59:29.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T05:59:29.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T05:59:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T05:59:29.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T05:59:29.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T05:59:29.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T05:59:29.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T05:59:29.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T05:59:29.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T05:59:29.558 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T05:59:29.761 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:59:30.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T05:59:30.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T05:59:30.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T05:59:30.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-29T05:59:30.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-29T05:59:30.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T05:59:30.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:00:00.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:00:00.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:00:00.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:00:00.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:00:00.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:00:01.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:00:01.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-29T06:00:01.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:00:01.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-29T06:00:01.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:00:01.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:00:01.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:00:01.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:00: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-29T06:00:04.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:00:04.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:00:04.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:00:04.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:00:04.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:00:04.642 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:00:04.642 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:00:04.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:00:04.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:00:04.643 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:00:04.643 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:00:04.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:00:04.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:00:04.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:00:04.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:00:04.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:00:04.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:00:04.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:00:04.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:00:04.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:00:04.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:00:04.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:00:04.919 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:00:04.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:00:00
2026-05-29T06:00:04.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71067, datetime.datetime(2026, 5, 29, 6, 0), datetime.datetime(2026, 5, 29, 6, 0), 'salt', 6.16, 87.22, None, 15.67, 83.9, 1.96, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:00:04.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:00:04.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:00:04.984 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:00, diff=4.984812s, valid=True
2026-05-29T06:00:04.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:00:04.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:00:04.987 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:12, diff=-7.012052s, valid=True
2026-05-29T06:00:04.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:00:04.988 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 05:59:57, diff=7.995451s, valid=True
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:00:04.995 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:00:04.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:00:04.998 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:12, diff=-7.00117s, valid=True
2026-05-29T06:00:04.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:00:04.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:00:04.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:00:04.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959846.999564s, valid=True
2026-05-29T06:00:05.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:00:05.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:00:05.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:00:05.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:00:05.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:00:05.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:00:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:00:05.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:00:05.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:00:05.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:00:05.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:00:05.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:00:05.284 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:00:05.325 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:00:05.533 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:00:05.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:00:05.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:00:05.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:00:05.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-29T06:00:05.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-29T06:00:06.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:00:06.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:00:36.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:00:36.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:00:36.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:00:36.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:00:36.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:00:36.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:00:36.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-29T06:00:36.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:00:36.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:00:36.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:00:36.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:00:36.998 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:00:36.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-29T06:00:40.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-29T06:00:40.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:00:40.828 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:00:40.829 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:00:40.829 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:00:40.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:00:40.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:00:40.853 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:00:40.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:00:40.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:00:40.854 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:00:40.854 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:00:40.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:00:40.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:00:40.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:00:41.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:00:41.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:00:41.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:00:41.129 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:00:41.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:00:41.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:00:41.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:00:41.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:00:41.175 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:00:41.235 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:00:30
2026-05-29T06:00:41.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71068, datetime.datetime(2026, 5, 29, 6, 0, 30), datetime.datetime(2026, 5, 29, 6, 0, 30), 'salt', 6.03, 87.23, None, 16.41, 87.66, 1.96, 832.07, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:00:41.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:00:41.235 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:00:41.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:30, diff=11.242762s, valid=True
2026-05-29T06:00:41.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:00:41.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:00:41.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:12, diff=29.246187s, valid=True
2026-05-29T06:00:41.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:00:41.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:29, diff=12.254046s, valid=True
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:00:41.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:00:41.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:00:12, diff=29.25777s, valid=True
2026-05-29T06:00:41.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:00:41.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:00:41.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:00:41.258 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959883.258584s, valid=True
2026-05-29T06:00:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:00:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:00:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:00:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:00:41.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:00:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:00:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:00:41.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:00:41.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:00:41.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:00:41.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:00:41.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:00:41.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:00:41.580 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:00:41.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:00:42.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:00:42.286 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:00:42.286 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:00:42.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-29T06:00: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-29T06:00:42.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:00:42.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:01:12.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:01:12.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:01:12.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:01:12.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:01:12.857 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:01:13.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:01:13.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-29T06:01:13.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:01:13.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-29T06:01:13.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:01:13.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:01:13.083 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:01:13.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:01:16.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-29T06:01:16.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:01:16.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:01:16.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:01:16.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:01:16.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:01:16.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:01:16.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:01:16.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:01:16.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:01:16.266 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:01:16.266 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:01:16.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:01:16.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:01:16.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:01:16.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:01:16.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:01:16.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:01:16.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:01:16.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:01:16.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:01:16.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:01:16.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:01:16.528 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:01:16.586 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:01:01
2026-05-29T06:01:16.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71069, datetime.datetime(2026, 5, 29, 6, 1, 1), datetime.datetime(2026, 5, 29, 6, 1), 'salt', 5.99, 87.32, None, 15.03, 86.06, 1.94, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:01:16.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:01:16.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:01:16.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:00, diff=16.593083s, valid=True
2026-05-29T06:01:16.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:01:16.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:01:16.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:12, diff=4.596225s, valid=True
2026-05-29T06:01:16.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:01:16.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:00, diff=16.603504s, valid=True
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:01:16.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:01:16.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:01:16.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:12, diff=4.606813s, valid=True
2026-05-29T06:01:16.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:01:16.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:01:16.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:01:16.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959918.607525s, valid=True
2026-05-29T06:01:16.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:01:16.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:01:16.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:01:16.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:01:16.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:01:16.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:01:16.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:01:16.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:01:16.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:01:16.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:01:16.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:01:16.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:01:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:01:16.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:01:17.133 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:01:17.471 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:01:17.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:01:17.570 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:01:17.570 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:01:17.570 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:01:17.757 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:01:17.758 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:01:47.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:01:47.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:01:47.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:01:48.103 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:01:48.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:01:48.318 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:01:48.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-29T06:01:48.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:01: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-29T06:01:48.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:01:48.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:01:48.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:01:48.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-29T06:01:51.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:01:51.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:01:51.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:01:51.181 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:01:51.181 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:01:51.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:01:51.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:01:51.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:01:51.206 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:01:51.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:01:51.206 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:01:51.207 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:01:51.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:01:51.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:01:51.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:01:51.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:01:51.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:01:51.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:01:51.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:01:51.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:01:51.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:01:51.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:01:51.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:01:51.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:01:51.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:01:31
2026-05-29T06:01:51.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71070, datetime.datetime(2026, 5, 29, 6, 1, 31), datetime.datetime(2026, 5, 29, 6, 1, 31), 'salt', 6.13, 87.56, None, 15.32, 87.07, 1.91, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:01:51.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:01:51.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:01:51.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:31, diff=20.591986s, valid=True
2026-05-29T06:01:51.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:01:51.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:01:51.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:12, diff=39.59544s, valid=True
2026-05-29T06:01:51.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:01:51.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:22, diff=29.603348s, valid=True
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:01:51.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:01:51.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:12, diff=39.606967s, valid=True
2026-05-29T06:01:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:01:51.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:01:51.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:01:51.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959953.607758s, valid=True
2026-05-29T06:01:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:01:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:01:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:01:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:01:51.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:01:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:01:51.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:01:51.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:01:51.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:01:51.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:01:51.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:01:51.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:01:51.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:01:51.931 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:01:52.209 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:01:52.546 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:01:52.645 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:01:52.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:01:52.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-29T06:01:52.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-29T06:01:52.891 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:01:52.892 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:02:22.900 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:02:22.901 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:02:22.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:02:23.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:02:23.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:02:23.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:02:23.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-29T06:02:23.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:02:23.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:02:23.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:02:23.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:02:23.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:02:23.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-29T06:02:26.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-29T06:02:26.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:02:26.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:02:26.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:02:26.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:02:26.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:02:26.130 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:02:26.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:02:26.131 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:02:26.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:02:26.132 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:02:26.132 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:02:26.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:02:26.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:02:26.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:02:26.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:02:26.361 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:02:26.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:02:26.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:02:26.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:02:26.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:02:26.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:02:26.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:02:26.453 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:02:26.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:02:01
2026-05-29T06:02:26.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71071, datetime.datetime(2026, 5, 29, 6, 2, 1), datetime.datetime(2026, 5, 29, 6, 2, 1), 'salt', 6.13, 87.56, None, 13.37, 80.99, 1.91, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:02:26.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:02:26.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:02:26.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:01, diff=25.523039s, valid=True
2026-05-29T06:02:26.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:02:26.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:02:26.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:12, diff=14.529139s, valid=True
2026-05-29T06:02:26.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:02:26.529 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:02:26.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:01:53, diff=33.542599s, valid=True
2026-05-29T06:02:26.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:02:26.542 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:02:26.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:02:26.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:02:26.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:02:26.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:02:26.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:12, diff=14.546262s, valid=True
2026-05-29T06:02:26.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:02:26.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:02:26.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:02:26.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=959988.547054s, valid=True
2026-05-29T06:02:26.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:02:26.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:02:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:02:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:02:26.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:02:26.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:02:26.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:02:26.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:02:26.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:02:26.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:02:26.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:02:26.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:02:26.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:02:26.868 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:02:27.073 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:02:27.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:02:27.511 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:02:27.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:02:27.511 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:02:27.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-29T06:02:27.702 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:02:27.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:02:57.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:02:57.733 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:02:57.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:02:57.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:02:57.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:02:58.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:02:58.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-29T06:02:58.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:02:58.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-29T06:02:58.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:02:58.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:02:58.136 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:02:58.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-29T06:03:00.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-29T06:03:00.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:03:00.839 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:03:00.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:03:00.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:03:00.852 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:03:00.864 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:03:00.865 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:03:00.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:03:00.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:03:00.866 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:03:00.866 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:03:00.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:03:00.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:03:00.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:03:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:03:01.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:03:01.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:03:01.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:03:01.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:03:01.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:03:01.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:03:01.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:03:01.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:03:01.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:02:31
2026-05-29T06:03:01.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71072, datetime.datetime(2026, 5, 29, 6, 2, 31), datetime.datetime(2026, 5, 29, 6, 2, 31), 'salt', 6.09, 87.42, None, 13.87, 85.38, 1.92, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:03:01.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:03:01.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:03:01.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:31, diff=30.251247s, valid=True
2026-05-29T06:03:01.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:03:01.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:03:01.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:12, diff=49.25469s, valid=True
2026-05-29T06:03:01.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:03:01.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:03:01.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:24, diff=37.262847s, valid=True
2026-05-29T06:03:01.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:03:01.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:03:01.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:03:01.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:03:01.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:03:01.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:03:01.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:02:12, diff=49.266491s, valid=True
2026-05-29T06:03:01.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:03:01.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:03:01.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:03:01.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960023.267312s, valid=True
2026-05-29T06:03:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:03:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:03:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:03:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:03:01.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:03:01.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:03:01.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:03:01.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:03:01.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:03:01.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:03:01.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:03:01.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:03:01.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:03:01.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:03:01.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:03:02.239 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:03:02.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:03:02.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:03:02.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-29T06:03:02.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-29T06:03:02.538 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:03:02.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:03:32.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:03:32.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:03:32.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:03:32.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:03:32.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:03:33.124 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:03:33.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-29T06:03:33.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:03:33.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-29T06:03:33.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:03:33.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:03:33.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:03:33.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:03: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-29T06:03:35.759 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:03:35.767 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:03:35.768 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:03:35.768 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:03:35.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:03:35.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:03:35.793 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:03:35.793 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:03:35.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:03:35.794 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:03:35.794 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:03:35.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:03:35.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:03:35.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:03:36.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:03:36.021 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:03:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:03:36.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:03:36.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:03:36.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:03:36.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:03:36.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:03:36.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:03:36.178 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:03:32
2026-05-29T06:03:36.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71074, datetime.datetime(2026, 5, 29, 6, 3, 32), datetime.datetime(2026, 5, 29, 6, 3, 31), 'salt', 6.13, 87.42, None, 14.43, 82.57, 1.93, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:03:36.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:03:36.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:03:36.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:31, diff=5.186043s, valid=True
2026-05-29T06:03:36.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:03:36.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:03:36.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=24.189456s, valid=True
2026-05-29T06:03:36.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:03:36.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:27, diff=9.197456s, valid=True
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:03:36.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:03:36.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:03:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=24.201081s, valid=True
2026-05-29T06:03:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:03:36.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:03:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:03:36.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960058.201887s, valid=True
2026-05-29T06:03:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:03:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:03:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:03:36.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:03:36.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:03:36.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:03:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:03:36.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:03:36.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:03:36.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:03:36.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:03:36.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:03:36.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:03:36.522 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:03:36.726 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:03:37.064 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:03:37.164 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:03:37.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:03:37.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-29T06:03:37.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-29T06:03:37.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:03:37.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:04:07.458 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:04:07.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:04:07.458 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:04:07.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:04:07.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:04:07.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:04:07.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:04:07.985 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:04:07.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-29T06:04:08.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:04:08.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:04:08.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:04:08.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-29T06:04:10.709 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:04:10.710 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:04:10.717 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:04:10.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:04:10.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:04:10.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:04:10.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:04:10.744 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:04:10.745 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:04:10.745 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:04:10.745 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:04:10.745 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:04:10.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:04:10.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:04:10.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:04:10.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:04:10.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:04:11.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:04:11.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:04:11.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:04:11.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:04:11.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:04:11.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:04:11.076 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:04:11.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:04:02
2026-05-29T06:04:11.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71075, datetime.datetime(2026, 5, 29, 6, 4, 2), datetime.datetime(2026, 5, 29, 6, 4, 2), 'salt', 6.23, 87.46, None, 14.19, 85.76, 1.93, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:04:11.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:04:11.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:04:11.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:04:02, diff=9.147509s, valid=True
2026-05-29T06:04:11.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:04:11.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:04:11.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=59.15094s, valid=True
2026-05-29T06:04:11.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:04:11.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:04:11.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:58, diff=13.158695s, valid=True
2026-05-29T06:04:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:04:11.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:04:11.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:04:11.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:04:11.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:04:11.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:04:11.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=59.162278s, valid=True
2026-05-29T06:04:11.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:04:11.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:04:11.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:04:11.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960093.163064s, valid=True
2026-05-29T06:04:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:04:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:04:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:04:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:04:11.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:04:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:04:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:04:11.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:04:11.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:04:11.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:04:11.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:04:11.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:04:11.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:04:11.555 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:04:11.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:04:12.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:04:12.204 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:04:12.204 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:04:12.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-29T06:04:12.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-29T06:04:12.398 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:04:12.399 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:04:42.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:04:42.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:04:42.424 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:04:42.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:04:42.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:04:43.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:04:43.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-29T06:04:43.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:04:43.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:04:43.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:04:43.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:04:43.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:04:43.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:04:45.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-29T06:04:45.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:04:45.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:04:45.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:04:45.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:04:45.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:04:45.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:04:45.781 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:04:45.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:04:45.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:04:45.782 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:04:45.782 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:04:45.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:04:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:04:45.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:04:46.009 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:04:46.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:04:46.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:04:46.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:04:46.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:04:46.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:04:46.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:04:46.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:04:46.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:04:46.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:04:32
2026-05-29T06:04:46.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71076, datetime.datetime(2026, 5, 29, 6, 4, 32), datetime.datetime(2026, 5, 29, 6, 4, 31), 'salt', 6.23, 87.29, None, 14.01, 84.75, 1.95, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:04:46.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:04:46.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:04:46.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:04:31, diff=15.176679s, valid=True
2026-05-29T06:04:46.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:04:46.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:04:46.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=94.179938s, valid=True
2026-05-29T06:04:46.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:04:46.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:04:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:04:30, diff=16.187558s, valid=True
2026-05-29T06:04:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:04:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:04:46.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:04:46.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:04:46.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:04:46.188 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:04:46.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=94.191072s, valid=True
2026-05-29T06:04:46.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:04:46.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:04:46.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:04:46.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960128.191856s, valid=True
2026-05-29T06:04:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:04:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:04:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:04:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:04:46.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:04:46.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:04:46.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:04:46.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:04:46.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:04:46.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:04:46.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:04:46.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:04:46.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:04:46.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:04:46.717 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:04:47.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:04:47.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:04:47.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:04:47.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-29T06:04:47.152 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:04:47.348 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:04:47.349 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:05:17.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:05:17.350 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:05:17.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:05:17.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:05:17.649 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:05:17.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:05:17.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-29T06:05:17.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:05:17.866 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:05:17.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:05:17.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:05:17.886 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:05:17.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-29T06:05:21.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-29T06:05:21.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:05:21.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:05:21.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:05:21.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:05:21.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:05:21.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:05:21.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:05:21.288 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:05:21.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:05:21.289 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:05:21.289 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:05:21.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:05:21.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:05:21.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:05:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:05:21.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:05:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:05:21.580 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:05:21.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:05:21.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:05:21.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:05:21.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:05:21.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:05:21.689 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:05:03
2026-05-29T06:05:21.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71077, datetime.datetime(2026, 5, 29, 6, 5, 3), datetime.datetime(2026, 5, 29, 6, 5, 2), 'salt', 6.09, 87.16, None, 13.48, 85.41, 1.97, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:05:21.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:05:21.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:05:21.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:05:02, diff=19.697108s, valid=True
2026-05-29T06:05:21.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:05:21.697 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:05:21.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=129.700561s, valid=True
2026-05-29T06:05:21.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:05:21.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:05:01, diff=20.708515s, valid=True
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:05:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:05:21.709 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:05:21.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=129.712194s, valid=True
2026-05-29T06:05:21.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:05:21.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:05:21.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:05:21.713 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960163.713017s, valid=True
2026-05-29T06:05:21.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:05:21.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:05:21.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:05:21.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:05:21.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:05:21.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:05:21.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:05:21.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:05:21.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:05:21.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:05:21.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:05:22.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:05:22.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:05:22.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:05:22.307 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:05:22.649 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:05:22.750 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:05:22.750 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:05:22.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-29T06:05:22.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-29T06:05:23.008 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:05:23.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:05:53.009 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:05:53.009 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:05:53.010 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:05:53.554 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:05:53.575 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:05:53.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:05:53.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-29T06:05:53.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:05:53.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-29T06:05:53.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:05:53.835 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:05:53.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:05: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-29T06:05:56.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-29T06:05:56.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:05:56.563 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:05:56.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:05:56.565 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:05:56.575 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:05:56.588 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:05:56.589 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:05:56.589 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:05:56.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:05:56.590 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:05:56.590 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:05:56.599 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:05:56.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:05:56.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:05:56.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:05:56.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:05:56.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:05:56.897 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:05:56.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:05:56.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:05:56.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:05:56.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:05:56.946 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:05:57.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:05:33
2026-05-29T06:05:57.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71078, datetime.datetime(2026, 5, 29, 6, 5, 33), datetime.datetime(2026, 5, 29, 6, 5, 32), 'salt', 6.13, 87.23, None, 14.05, 83.39, 1.96, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:05:57.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:05:57.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:05:57.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:05:32, diff=25.023448s, valid=True
2026-05-29T06:05:57.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:05:57.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:05:57.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=165.026979s, valid=True
2026-05-29T06:05:57.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:05:57.027 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:05:24, diff=33.035294s, valid=True
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:05:57.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:05:57.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=165.039344s, valid=True
2026-05-29T06:05:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:05:57.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:05:57.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:05:57.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960199.040194s, valid=True
2026-05-29T06:05:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:05:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:05:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:05:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:05:57.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:05:57.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:05:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:05:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:05:57.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:05:57.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:05:57.243 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:05:57.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:05:57.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:05:57.364 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:05:57.570 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:05:57.906 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:05:58.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:05:58.006 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:05:58.006 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:05:58.006 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:05:58.233 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:05:58.234 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:06:28.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:06:28.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:06:28.237 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:06:28.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:06:28.719 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:06:28.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:06: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-29T06:06:28.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:06:28.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-29T06:06:28.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:06:28.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:06:28.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:06:28.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-29T06:06:31.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-29T06:06:31.669 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:06:31.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:06:31.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:06:31.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:06:31.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:06:31.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:06:31.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:06:31.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:06:31.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:06:31.702 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:06:31.702 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:06:31.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:06:31.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:06:31.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:06:32.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:06:32.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:06:32.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:06:32.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:06:32.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:06:32.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:06:32.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:06:32.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:06:32.086 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:06:32.144 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:06:03
2026-05-29T06:06:32.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71079, datetime.datetime(2026, 5, 29, 6, 6, 3), datetime.datetime(2026, 5, 29, 6, 6, 3), 'salt', 6.13, 87.23, None, 14.15, 83.86, 1.96, 832.13, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:06:32.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:06:32.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:06:32.150 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:06:03, diff=29.150854s, valid=True
2026-05-29T06:06:32.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:06:32.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:06:32.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=200.153759s, valid=True
2026-05-29T06:06:32.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:06:32.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:05:54, diff=38.160447s, valid=True
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:06:32.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:06:32.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=200.163524s, valid=True
2026-05-29T06:06:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:06:32.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:06:32.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:06:32.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960234.164194s, valid=True
2026-05-29T06:06:32.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:06:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:06:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:06:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:06:32.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:06:32.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:06:32.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:06:32.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:06:32.245 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:06:32.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:06:32.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:06:32.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:06:32.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:06:32.487 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:06:32.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:06:33.050 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:06:33.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:06:33.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:06:33.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-29T06:06:33.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-29T06:06:33.376 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:06:33.376 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:07:03.405 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:07:03.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:07:03.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:07:03.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:07:03.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:07:03.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:07:03.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:07:03.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:07: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-29T06:07:03.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:07:03.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:07:03.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:07:03.801 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:07:07.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-29T06:07:07.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:07:07.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:07:07.231 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:07:07.231 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:07:07.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:07:07.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:07:07.256 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:07:07.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:07:07.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:07:07.257 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:07:07.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:07:07.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:07:07.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:07:07.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:07:07.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:07:07.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:07:07.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:07:07.513 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:07:07.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:07:07.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:07:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:07:07.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:07:07.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:07:07.619 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:07:04
2026-05-29T06:07:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71081, datetime.datetime(2026, 5, 29, 6, 7, 4), datetime.datetime(2026, 5, 29, 6, 7, 3), 'salt', 6.09, 86.99, None, 14.75, 83.74, 1.99, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:07:07.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:07:07.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:07:07.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:07:03, diff=4.626446s, valid=True
2026-05-29T06:07:07.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:07:07.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:07:07.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=235.629754s, valid=True
2026-05-29T06:07:07.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:07:07.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:07:07.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:06:56, diff=11.637649s, valid=True
2026-05-29T06:07:07.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:07:07.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:07:07.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:07:07.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:07:07.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:07:07.638 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:07:07.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:03:12, diff=235.641337s, valid=True
2026-05-29T06:07:07.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:07:07.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:07:07.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:07:07.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960269.642126s, valid=True
2026-05-29T06:07:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:07:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:07:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:07:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:07:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:07:07.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:07:07.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:07:07.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:07:07.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:07:07.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:07:07.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:07:07.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:07:07.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:07:07.983 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:07:08.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:07:08.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:07:08.692 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:07:08.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:07:08.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-29T06:07:08.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-29T06:07:08.851 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:07:08.851 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:07:38.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:07:38.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:07:38.856 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:07:39.190 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:07:39.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:07:39.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:07:39.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-29T06:07:39.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:07:39.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-29T06:07:39.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:07:39.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:07:39.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:07:39.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-29T06:07:42.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-29T06:07:42.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:07:42.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:07:42.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:07:42.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:07:42.118 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:07:42.131 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:07:42.131 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:07:42.132 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:07:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:07:42.133 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:07:42.133 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:07:42.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:07:42.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:07:42.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:07:42.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:07:42.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:07:42.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:07:42.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:07:42.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:07:42.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:07:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:07:42.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:07:42.455 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:07:42.515 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:07:34
2026-05-29T06:07:42.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71082, datetime.datetime(2026, 5, 29, 6, 7, 34), datetime.datetime(2026, 5, 29, 6, 7, 33), 'salt', 6.16, 86.73, None, 14.4, 83.95, 2.04, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:07:42.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:07:42.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:07:42.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:07:33, diff=9.522845s, valid=True
2026-05-29T06:07:42.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:07:42.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:07:42.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:12, diff=-29.473793s, valid=True
2026-05-29T06:07:42.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:07:42.526 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:07:42.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:07:28, diff=14.533967s, valid=True
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:07:42.534 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:07:42.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:12, diff=-29.462451s, valid=True
2026-05-29T06:07:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:07:42.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:07:42.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:07:42.538 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960304.538337s, valid=True
2026-05-29T06:07:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:07:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:07:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:07:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:07:42.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:07:42.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:07:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:07:42.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:07:42.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:07:42.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:07:42.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:07:42.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:07:42.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:07:42.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:07:43.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:07:43.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:07:43.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:07:43.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:07:43.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-29T06:07:43.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-29T06:07:43.714 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:07:43.714 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:08:13.744 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:08:13.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:08:13.744 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:08:14.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:08:14.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:08:14.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:08:14.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-29T06:08:14.284 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:08:14.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-29T06:08:14.298 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:08:14.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:08:14.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:08:14.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-29T06:08:17.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-29T06:08:17.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:08:17.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:08:17.801 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:08:17.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:08:17.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:08:17.826 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:08:17.826 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:08:17.827 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:08:17.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:08:17.828 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:08:17.828 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:08:17.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:08:17.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:08:17.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:08:18.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:08:18.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:08:18.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:08:18.104 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:08:18.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:08:18.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:08:18.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:08:18.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:08:18.149 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:08:18.215 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:08:04
2026-05-29T06:08:18.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71083, datetime.datetime(2026, 5, 29, 6, 8, 4), datetime.datetime(2026, 5, 29, 6, 8, 4), 'salt', 6.16, 86.79, None, 14.54, 82.96, 2.03, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:08:18.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:08:18.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:08:18.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:04, diff=14.222501s, valid=True
2026-05-29T06:08:18.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:08:18.222 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:08:18.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:12, diff=6.225974s, valid=True
2026-05-29T06:08:18.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:08:18.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:07:59, diff=19.234004s, valid=True
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:08:18.234 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:08:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:12, diff=6.237653s, valid=True
2026-05-29T06:08:18.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:08:18.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:08:18.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:08:18.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960340.238447s, valid=True
2026-05-29T06:08:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:08:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:08:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:08:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:08:18.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:08:18.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:08:18.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:08:18.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:08:18.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:08:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:08:18.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:08:18.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:08:18.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:08:18.559 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:08:18.763 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:08:19.173 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:08:19.272 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:08:19.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:08:19.272 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:08:19.272 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:08:19.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:08:19.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:08:49.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:08:49.491 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:08:49.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:08:49.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:08:49.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:08:50.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:08:50.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-29T06:08:50.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:08:50.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-29T06:08:50.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:08:50.064 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:08:50.069 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:08:50.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-29T06:08:52.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-29T06:08:52.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:08:52.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:08:52.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:08:52.834 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:08:52.844 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:08:52.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:08:52.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:08:52.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:08:52.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:08:52.858 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:08:52.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:08:52.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:08:52.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:08:52.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:08:53.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:08:53.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:08:53.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:08:53.130 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:08:53.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:08:53.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:08:53.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:08:53.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:08:53.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:08:53.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:08:34
2026-05-29T06:08:53.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71084, datetime.datetime(2026, 5, 29, 6, 8, 34), datetime.datetime(2026, 5, 29, 6, 8, 33), 'salt', 6.29, 86.59, None, 14.57, 81.86, 2.06, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:08:53.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:08:53.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:08:53.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:33, diff=20.249684s, valid=True
2026-05-29T06:08:53.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:08:53.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:08:53.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:12, diff=-18.7469s, valid=True
2026-05-29T06:08:53.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:08:53.253 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:08:31, diff=22.26099s, valid=True
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:08:53.261 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:08:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:12, diff=-18.735405s, valid=True
2026-05-29T06:08:53.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:08:53.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:08:53.264 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:08:53.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960375.265382s, valid=True
2026-05-29T06:08:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:08:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:08:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:08:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:08:53.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:08:53.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:08:53.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:08:53.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:08:53.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:08:53.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:08:53.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:08:53.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:08:53.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:08:53.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:08:53.790 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:08:54.128 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:08:54.228 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:08:54.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:08:54.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-29T06:08:54.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-29T06:08:54.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:08:54.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:09:24.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:09:24.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:09:24.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:09:25.025 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:09:25.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:09:25.224 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:09:25.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-29T06:09:25.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:09:25.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-29T06:09:25.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:09:25.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:09:25.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:09:25.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-29T06:09:27.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:09:27.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:09:27.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:09:27.885 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:09:27.885 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:09:27.895 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:09:27.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:09:27.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:09:27.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:09:27.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:09:27.910 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:09:27.910 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:09:27.917 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:09:28.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:09:28.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:09:28.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:09:28.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:09:28.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:09:28.183 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:09:28.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:09:28.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:09:28.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:09:28.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:09:28.225 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:09:28.288 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:09:05
2026-05-29T06:09:28.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71085, datetime.datetime(2026, 5, 29, 6, 9, 5), datetime.datetime(2026, 5, 29, 6, 9, 4), 'salt', 6.26, 86.59, None, 14.08, 81.63, 2.07, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:09:28.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:09:28.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:09:28.296 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:04, diff=24.296804s, valid=True
2026-05-29T06:09:28.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:09:28.297 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:09:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:12, diff=16.300326s, valid=True
2026-05-29T06:09:28.300 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:09:28.300 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:09:28.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:02, diff=26.308555s, valid=True
2026-05-29T06:09:28.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:09:28.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:09:28.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:09:28.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:09:28.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:09:28.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:09:28.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:12, diff=16.312227s, valid=True
2026-05-29T06:09:28.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:09:28.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:09:28.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:09:28.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960410.313025s, valid=True
2026-05-29T06:09:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:09:28.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:09:28.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:09:28.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:09:28.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:09:28.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:09:28.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:09:28.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:09:28.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:09:28.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:09:28.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:09:28.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:09:28.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:09:28.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:09:28.909 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:09:29.247 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:09:29.348 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:09:29.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:09:29.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-29T06:09:29.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-29T06:09:29.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:09:29.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:09:59.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:09:59.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:09:59.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:09:59.940 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:09:59.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:10:00.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:10:00.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-29T06:10:00.188 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:10:00.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-29T06:10:00.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:10:00.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:10:00.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:10:00.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:10:02.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-29T06:10:02.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:10:02.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:10:02.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:10:02.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:10:02.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:10:02.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:10:02.988 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:10:02.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:10:02.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:10:02.989 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:10:02.990 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:10:02.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:10:03.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:10:03.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:10:03.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:10:03.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:10:03.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:10:03.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:10:03.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:10:03.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:10:03.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:10:03.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:10:03.337 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:10:03.399 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:09:35
2026-05-29T06:10:03.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71086, datetime.datetime(2026, 5, 29, 6, 9, 35), datetime.datetime(2026, 5, 29, 6, 9, 34), 'salt', 6.36, 86.3, None, 13.73, 81.51, 2.12, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:10:03.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:10:03.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:10:03.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:34, diff=29.40757s, valid=True
2026-05-29T06:10:03.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:10:03.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:10:03.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:10:12, diff=-8.588688s, valid=True
2026-05-29T06:10:03.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:10:03.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:10:03.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:09:34, diff=29.419853s, valid=True
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:10:03.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:10:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:10:12, diff=-8.576404s, valid=True
2026-05-29T06:10:03.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:10:03.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:10:03.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:10:03.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960445.424348s, valid=True
2026-05-29T06:10:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:10:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:10:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:10:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:10:03.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:10:03.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:10:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:10:03.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:10:03.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:10:03.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:10:03.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:10:03.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:10:03.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:10:03.755 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:10:03.961 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:10:04.343 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:10:04.447 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:10:04.447 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:10:04.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-29T06:10:04.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-29T06:10:04.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:10:04.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:10:34.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:10:34.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:10:34.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:10:35.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:10:35.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:10:35.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:10:35.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-29T06:10:35.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:10:35.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-29T06:10:35.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:10:35.272 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:10:35.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:10:35.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-29T06:10:38.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-29T06:10:38.232 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:10:38.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:10:38.240 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:10:38.240 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:10:38.250 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:10:38.263 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:10:38.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:10:38.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:10:38.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:10:38.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:10:38.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:10:38.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:10:38.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:10:38.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:10:38.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:10:38.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:10:38.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:10:38.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:10:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:10:38.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:10:38.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:10:38.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:10:38.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:10:38.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:10:35
2026-05-29T06:10:38.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71088, datetime.datetime(2026, 5, 29, 6, 10, 35), datetime.datetime(2026, 5, 29, 6, 10, 35), 'salt', 6.39, 86.0, None, 13.41, 82.19, 2.16, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:10:38.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:10:38.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:10:38.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:10:35, diff=3.688107s, valid=True
2026-05-29T06:10:38.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:10:38.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:10:38.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:12, diff=-33.308483s, valid=True
2026-05-29T06:10:38.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:10:38.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:10:38.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:10:26, diff=12.699519s, valid=True
2026-05-29T06:10:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:10:38.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:10:38.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:10:38.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:10:38.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:10:38.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:10:38.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:12, diff=-33.296823s, valid=True
2026-05-29T06:10:38.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:10:38.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:10:38.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:10:38.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960480.703986s, valid=True
2026-05-29T06:10:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:10:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:10:38.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:10:38.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:10:38.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:10:38.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:10:38.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:10:38.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:10:38.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:10:38.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:10:38.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:10:39.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:10:39.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:10:39.101 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:10:39.308 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:10:39.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:10:39.756 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:10:39.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:10:39.757 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:10:39.757 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:10:40.055 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:10:40.055 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:11:10.084 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:11:10.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:11:10.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:11:10.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:11:10.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:11:10.394 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:11:10.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:11:10.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:11:10.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:11:10.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:11:10.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:11:10.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:11:10.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-29T06:11:13.307 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:11:13.308 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:11:13.316 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:11:13.317 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:11:13.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:11:13.329 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:11:13.341 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:11:13.342 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:11:13.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:11:13.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:11:13.343 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:11:13.343 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:11:13.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:11:13.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:11:13.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:11:13.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:11:13.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:11:13.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:11:13.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:11:13.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T06:11:13.665 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:11:13.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:11:13.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:11:13.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:11:13.727 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:11:05
2026-05-29T06:11:13.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71089, datetime.datetime(2026, 5, 29, 6, 11, 5), datetime.datetime(2026, 5, 29, 6, 11, 5), 'salt', 6.36, 85.77, None, 13.83, 81.6, 2.2, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:11:13.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:11:13.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:11:13.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:05, diff=8.735437s, valid=True
2026-05-29T06:11:13.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:11:13.735 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:11:13.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:12, diff=1.738811s, valid=True
2026-05-29T06:11:13.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:11:13.739 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:11:13.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:10:57, diff=16.746579s, valid=True
2026-05-29T06:11:13.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:11:13.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:11:13.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:11:13.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:11:13.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:11:13.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T06:11:13.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:12, diff=1.750164s, valid=True
2026-05-29T06:11:13.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:11:13.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:11:13.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:11:13.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960515.750962s, valid=True
2026-05-29T06:11:13.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:11:13.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:11:13.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:11:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:11:13.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:11:13.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:11:13.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:11:13.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:11:13.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:11:13.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:11:13.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:11:13.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:11:14.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:11:14.071 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:11:14.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:11:14.614 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:11:14.713 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:11:14.714 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:11:14.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-29T06:11:14.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-29T06:11:17.593 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:11:17.593 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:11:47.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:11:47.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:11:47.624 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:11:48.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:11:48.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:11:48.375 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:11:48.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-29T06:11:48.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:11:48.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-29T06:11:48.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:11:48.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:11:48.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:11:48.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-29T06:11:50.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-29T06:11:50.940 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:11:50.947 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:11:50.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:11:50.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:11:50.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:11:50.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:11:50.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:11:50.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:11:50.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:11:50.972 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:11:50.972 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:11:50.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:11:51.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:11:51.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:11:51.221 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:11:51.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:11:51.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:11:51.271 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:11:51.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:11:51.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:11:51.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:11:51.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:11:51.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:11:51.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:11:36
2026-05-29T06:11:51.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71090, datetime.datetime(2026, 5, 29, 6, 11, 36), datetime.datetime(2026, 5, 29, 6, 11, 35), 'salt', 6.39, 85.67, None, 14.12, 80.52, 2.22, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:11:51.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:11:51.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:11:51.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:35, diff=16.389056s, valid=True
2026-05-29T06:11:51.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:11:51.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:11:51.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:12, diff=-20.607433s, valid=True
2026-05-29T06:11:51.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:11:51.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:11:51.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:11:29, diff=22.400806s, valid=True
2026-05-29T06:11:51.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:11:51.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:11:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:11:51.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:11:51.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:11:51.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:11:51.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:12, diff=-20.595465s, valid=True
2026-05-29T06:11:51.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:11:51.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:11:51.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:11:51.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960553.405356s, valid=True
2026-05-29T06:11:51.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:11:51.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:11:51.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:11:51.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:11:51.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:11:51.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:11:51.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:11:51.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:11:51.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:11:51.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:11:51.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:11:51.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:11:51.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:11:51.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:11:52.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:11:52.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:11:52.440 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:11:52.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:11:52.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-29T06:11:52.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-29T06:11:52.695 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:11:52.695 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:12:22.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:12:22.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:12:22.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:12:23.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:12:23.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:12:23.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:12:23.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-29T06:12:23.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:12:23.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:12:23.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:12:23.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:12:23.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:12:23.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-29T06:12:25.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-29T06:12:25.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:12:25.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:12:25.971 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:12:25.971 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:12:25.983 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:12:25.995 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:12:25.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:12:25.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:12:25.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:12:25.997 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:12:25.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:12:26.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:12:26.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:12:26.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:12:26.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:12:26.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:12:26.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:12:26.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:12:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T06:12:26.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:12:26.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:12:26.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:12:26.351 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:12:26.418 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:12:06
2026-05-29T06:12:26.418 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71091, datetime.datetime(2026, 5, 29, 6, 12, 6), datetime.datetime(2026, 5, 29, 6, 12, 6), 'salt', 6.29, 85.47, None, 14.05, 78.55, 2.25, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:12:26.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:12:26.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:12:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:06, diff=20.42618s, valid=True
2026-05-29T06:12:26.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:12:26.426 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:12:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:12, diff=14.429686s, valid=True
2026-05-29T06:12:26.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:12:26.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:12:26.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:00, diff=26.437875s, valid=True
2026-05-29T06:12:26.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:12:26.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:12:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:12:26.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:12:26.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:12:26.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T06:12:26.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:12, diff=14.4416s, valid=True
2026-05-29T06:12:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:12:26.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:12:26.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:12:26.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960588.442421s, valid=True
2026-05-29T06:12:26.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:12:26.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:12:26.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:12:26.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:12:26.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:12:26.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:12:26.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:12:26.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:12:26.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:12:26.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:12:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:12:26.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:12:26.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:12:26.766 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:12:26.970 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:12:27.305 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:12:27.404 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:12:27.405 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:12:27.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-29T06:12:27.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-29T06:12:27.598 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:12:27.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:12:57.604 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:12:57.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:12:57.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:12:58.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:12:58.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:12:58.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:12:58.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:12:58.228 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:12:58.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-29T06:12:58.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:12:58.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:12:58.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:12:58.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-29T06:13:00.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:13:00.877 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:13:00.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:13:00.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:13:00.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:13:00.892 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:13:00.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:13:00.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:13:00.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:13:00.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:13:00.906 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:13:00.906 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:13:00.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:13:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:13:00.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:13:01.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:13:01.097 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:13:01.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:13:01.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:13:01.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:13:01.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:13:01.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:13:01.251 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:13:01.251 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:13:01.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:12:36
2026-05-29T06:13:01.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71092, datetime.datetime(2026, 5, 29, 6, 12, 36), datetime.datetime(2026, 5, 29, 6, 12, 36), 'salt', 6.36, 85.5, None, 14.15, 78.53, 2.25, 832.38, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:13:01.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:13:01.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:13:01.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:36, diff=25.328494s, valid=True
2026-05-29T06:13:01.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:13:01.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:13:01.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:12, diff=-10.668616s, valid=True
2026-05-29T06:13:01.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:13:01.331 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:12:32, diff=29.338249s, valid=True
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:13:01.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:13:01.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:12, diff=-10.658671s, valid=True
2026-05-29T06:13:01.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:13:01.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:13:01.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:13:01.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960623.341991s, valid=True
2026-05-29T06:13:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:13:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:13:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:13:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:13:01.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:13:01.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:13:01.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:13:01.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:13:01.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:13:01.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:13:01.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:13:01.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:13:01.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:13:01.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:13:01.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:13:02.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:13:02.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:13:02.302 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:13:02.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-29T06:13:02.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-29T06:13:02.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:13:02.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:13:32.576 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:13:32.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:13:32.577 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:13:33.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:13:33.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:13:33.367 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:13: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-29T06:13:33.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:13:33.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-29T06:13:33.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:13:33.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:13:33.407 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:13:33.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:13:36.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-29T06:13:36.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:13:36.124 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:13:36.125 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:13:36.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:13:36.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:13:36.149 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:13:36.150 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:13:36.150 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:13:36.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:13:36.151 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:13:36.151 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:13:36.157 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:13:36.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:13:36.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:13:36.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:13:36.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:13:36.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:13:36.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:13:36.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T06:13:36.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:13:36.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:13:36.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:13:36.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:13:36.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:13:07
2026-05-29T06:13:36.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71093, datetime.datetime(2026, 5, 29, 6, 13, 7), datetime.datetime(2026, 5, 29, 6, 13, 6), 'salt', 6.36, 85.17, None, 13.76, 76.23, 2.3, 832.19, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:13:36.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:13:36.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:13:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:06, diff=30.563511s, valid=True
2026-05-29T06:13:36.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:13:36.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:13:36.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:12, diff=24.566945s, valid=True
2026-05-29T06:13:36.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:13:36.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:13:36.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:03, diff=33.574764s, valid=True
2026-05-29T06:13:36.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:13:36.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:13:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:13:36.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:13:36.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:13:36.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T06:13:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:13:12, diff=24.578404s, valid=True
2026-05-29T06:13:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:13:36.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:13:36.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:13:36.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960658.579203s, valid=True
2026-05-29T06:13:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:13:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:13:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:13:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:13:36.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:13:36.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:13:36.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:13:36.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:13:36.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:13:36.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:13:36.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:13:36.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:13:36.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:13:36.912 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:13:37.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:13:37.453 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:13:37.553 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:13:37.553 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:13:37.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-29T06:13:37.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-29T06:13:37.870 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:13:37.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:14:07.874 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:14:07.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:14:07.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:14:08.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:14:08.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:14:08.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:14:08.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-29T06:14:08.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:14:08.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:14:08.584 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:14:08.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:14:08.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:14:08.590 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:14:11.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-29T06:14:11.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:14:11.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:14:11.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:14:11.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:14:11.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:14:11.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:14:11.272 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:14:11.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:14:11.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:14:11.273 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:14:11.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:14:11.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:14:11.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:14:11.414 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:14:11.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:14:11.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:14:11.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:14:11.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:14:11.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T06:14:11.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:14:11.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:14:11.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:14:11.610 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:14:11.671 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:14:07
2026-05-29T06:14:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71095, datetime.datetime(2026, 5, 29, 6, 14, 7), datetime.datetime(2026, 5, 29, 6, 14, 7), 'salt', 6.42, 84.9, None, 14.15, 76.67, 2.34, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:14:11.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:14:11.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:14:11.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:07, diff=4.678827s, valid=True
2026-05-29T06:14:11.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:14:11.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:14:11.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:12, diff=-0.31764s, valid=True
2026-05-29T06:14:11.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:14:11.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:06, diff=5.69022s, valid=True
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:14:11.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T06:14:11.693 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:12, diff=-0.30617s, valid=True
2026-05-29T06:14:11.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:14:11.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:14:11.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:14:11.694 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960693.694613s, valid=True
2026-05-29T06:14:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:14:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:14:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:14:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:14:11.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:14:11.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:14:11.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:14:11.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:14:11.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:14:11.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:14:11.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:14:11.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:14:11.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:14:12.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:14:12.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:14:12.561 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:14:12.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:14:12.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:14:12.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-29T06:14:12.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-29T06:14:12.894 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:14:12.894 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:14:42.924 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:14:42.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:14:42.924 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:14:43.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:14:43.111 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:14:43.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:14:43.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-29T06:14:43.330 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:14:43.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-29T06:14:43.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:14:43.344 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:14:43.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:14:43.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-29T06:14:46.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-29T06:14:46.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:14:46.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:14:46.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:14:46.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:14:46.045 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:14:46.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:14:46.068 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:14:46.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:14:46.069 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:14:46.069 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:14:46.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:14:46.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:14:46.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:14:46.213 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:14:46.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:14:46.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:14:46.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:14:46.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:14:46.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:14:46.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:14:46.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:14:46.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:14:46.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:14:46.476 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:14:37
2026-05-29T06:14:46.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71096, datetime.datetime(2026, 5, 29, 6, 14, 37), datetime.datetime(2026, 5, 29, 6, 14, 37), 'salt', 6.42, 84.67, None, 14.29, 77.14, 2.38, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:14:46.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:14:46.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:14:46.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:37, diff=9.484261s, valid=True
2026-05-29T06:14:46.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:14:46.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:14:46.487 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:12, diff=-25.512169s, valid=True
2026-05-29T06:14:46.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:14:46.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:14:46.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:28, diff=18.495801s, valid=True
2026-05-29T06:14:46.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:14:46.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:14:46.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:14:46.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:14:46.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:14:46.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:14:46.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:12, diff=-25.500546s, valid=True
2026-05-29T06:14:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:14:46.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:14:46.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:14:46.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960728.500253s, valid=True
2026-05-29T06:14:46.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:14:46.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:14:46.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:14:46.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:14:46.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:14:46.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:14:46.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:14:46.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:14:46.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:14:46.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:14:46.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:14:46.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:14:46.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:14:46.824 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:14:47.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:14:47.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:14:47.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:14:47.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:14:47.526 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:14:47.526 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:14:47.717 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:14:47.718 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:15:17.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:15:17.748 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:15:17.748 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:15:17.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:15:17.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:15:18.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:15:18.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-29T06:15:18.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:15:18.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-29T06:15:18.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:15:18.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:15:18.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:15: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-29T06:15:21.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-29T06:15:21.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:15:21.253 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:15:21.254 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:15:21.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:15:21.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:15:21.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:15:21.280 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:15:21.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:15:21.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:15:21.281 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:15:21.281 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:15:21.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:15:21.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:15:21.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:15:21.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:15:21.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:15:21.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:15:21.517 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:15:21.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:15:21.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:15:21.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:15:21.559 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:15:21.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:15:21.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:15:08
2026-05-29T06:15:21.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71097, datetime.datetime(2026, 5, 29, 6, 15, 8), datetime.datetime(2026, 5, 29, 6, 15, 7), 'salt', 6.39, 84.47, None, 14.47, 76.67, 2.42, 832.38, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:15:21.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:15:21.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:15:21.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:07, diff=14.632548s, valid=True
2026-05-29T06:15:21.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:15:21.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:15:21.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:12, diff=9.635416s, valid=True
2026-05-29T06:15:21.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:15:21.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:14:58, diff=23.642142s, valid=True
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:15:21.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:15:21.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:12, diff=9.645224s, valid=True
2026-05-29T06:15:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:15:21.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:15:21.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:15:21.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960763.645891s, valid=True
2026-05-29T06:15:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:15:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:15:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:15:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:15:21.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:15:21.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:15:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:15:21.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:15:21.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:15:21.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:15:21.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:15:21.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:15:21.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:15:22.008 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:15:22.213 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:15:22.551 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:15:22.650 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:15:22.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:15:22.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-29T06:15:22.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-29T06:15:22.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:15:22.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:15:52.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:15:52.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:15:52.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:15:52.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:15:52.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:15:53.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:15:53.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-29T06:15:53.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:15:53.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-29T06:15:53.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:15:53.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:15:53.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:15:53.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-29T06:15:55.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:15:55.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:15:55.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:15:55.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:15:55.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:15:55.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:15:56.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:15:56.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:15:56.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:15:56.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:15:56.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:15:56.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:15:56.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:15:56.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:15:56.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:15:56.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:15:56.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:15:56.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:15:56.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:15:56.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:15:56.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:15:56.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:15:56.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:15:56.369 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:15:56.430 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:15:38
2026-05-29T06:15:56.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71098, datetime.datetime(2026, 5, 29, 6, 15, 38), datetime.datetime(2026, 5, 29, 6, 15, 37), 'salt', 6.36, 84.37, None, 14.64, 76.77, 2.44, 832.5, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:15:56.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:15:56.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:15:56.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:37, diff=19.438593s, valid=True
2026-05-29T06:15:56.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:15:56.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:15:56.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:12, diff=-15.557829s, valid=True
2026-05-29T06:15:56.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:15:56.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:15:30, diff=26.450419s, valid=True
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:15:56.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:15:56.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:15:56.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:12, diff=-15.545757s, valid=True
2026-05-29T06:15:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:15:56.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:15:56.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:15:56.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960798.45509s, valid=True
2026-05-29T06:15:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:15:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:15:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:15:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:15:56.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:15:56.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:15:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:15:56.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:15:56.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:15:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:15:56.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:15:56.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:15:56.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:15:56.777 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:15:57.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:15:57.395 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:15:57.496 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:15:57.497 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:15:57.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-29T06:15:57.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-29T06:15:57.687 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:15:57.687 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:16:27.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:16:27.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:16:27.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:16:27.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:16:27.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:16:28.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:16:28.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:16:28.089 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:16: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-29T06:16:28.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:16:28.101 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:16:28.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:16:28.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-29T06:16:30.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-29T06:16:30.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:16:30.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:16:30.790 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:16:30.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:16:30.801 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:16:30.813 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:16:30.814 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:16:30.814 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:16:30.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:16:30.815 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:16:30.815 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:16:30.821 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:16:30.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:16:30.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:16:31.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:16:31.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:16:31.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:16:31.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:16:31.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:16:31.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:16:31.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:16:31.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:16:31.118 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:16:31.179 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:16:08
2026-05-29T06:16:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71099, datetime.datetime(2026, 5, 29, 6, 16, 8), datetime.datetime(2026, 5, 29, 6, 16, 8), 'salt', 6.26, 84.01, None, 14.08, 77.64, 2.5, 832.31, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:16:31.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:16:31.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:16:31.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:08, diff=23.186091s, valid=True
2026-05-29T06:16:31.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:16:31.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:16:31.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:12, diff=19.189425s, valid=True
2026-05-29T06:16:31.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:16:31.189 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:01, diff=30.197296s, valid=True
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:16:31.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:16:31.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:12, diff=19.200887s, valid=True
2026-05-29T06:16:31.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:16:31.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:16:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:16:31.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960833.201688s, valid=True
2026-05-29T06:16:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:16:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:16:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:16:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:16:31.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:16:31.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:16:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:16:31.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:16:31.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:16:31.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:16:31.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:16:31.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:16:31.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:16:31.525 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:16:31.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:16:32.093 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:16:32.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:16:32.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:16:32.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-29T06:16:32.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-29T06:16:32.347 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:16:32.347 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:17:02.378 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:17:02.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:17:02.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:17:02.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:17:02.886 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:17:03.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:17:03.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-29T06:17:03.112 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:17:03.112 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:17:03.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:17:03.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:17:03.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:17:03.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-29T06:17:05.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-29T06:17:05.717 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:17:05.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:17:05.725 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:17:05.725 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:17:05.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:17:05.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:17:05.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:17:05.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:17:05.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:17:05.751 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:17:05.752 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:17:05.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:17:05.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:17:05.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:17:05.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:17:05.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:17:06.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:17:06.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:17:06.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:17:06.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:17:06.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:17:06.078 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:17:06.078 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:17:06.139 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:16:38
2026-05-29T06:17:06.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71100, datetime.datetime(2026, 5, 29, 6, 16, 38), datetime.datetime(2026, 5, 29, 6, 16, 38), 'salt', 6.32, 84.07, None, 14.36, 77.52, 2.48, 832.25, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T06:17:06.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:17:06.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:17:06.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:38, diff=28.147681s, valid=True
2026-05-29T06:17:06.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:17:06.147 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:17:06.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:17:12, diff=-5.848623s, valid=True
2026-05-29T06:17:06.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:17:06.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:17:06.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:16:33, diff=33.15956s, valid=True
2026-05-29T06:17:06.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:17:06.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:17:06.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:17:06.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:17:06.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:17:06.160 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:17:06.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:17:12, diff=-5.836972s, valid=True
2026-05-29T06:17:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:17:06.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:17:06.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:17:06.163 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960868.163799s, valid=True
2026-05-29T06:17:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:17:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:17:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:17:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:17:06.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:17:06.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:17:06.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:17:06.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:17:06.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:17:06.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:17:06.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:17:06.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:17:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:17:06.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:17:06.769 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:17:07.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:17:07.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:17:07.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:17:07.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-29T06:17:07.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-29T06:17:07.473 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:17:07.473 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:17:37.503 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:17:37.504 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:17:37.504 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:17:37.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:17:37.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:17:38.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:17:38.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-29T06:17:38.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:17:38.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-29T06:17:38.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:17:38.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:17:38.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:17:38.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-29T06:17:41.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:17:41.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:17:41.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:17:41.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:17:41.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:17:41.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:17:41.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:17:41.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:17:41.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:17:41.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:17:41.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:17:41.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:17:41.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:17:41.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:17:41.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:17:41.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:17:41.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:17:41.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:17:41.307 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:17:41.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:17:41.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:17:41.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:17:41.354 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:17:41.354 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:17:41.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:17:39
2026-05-29T06:17:41.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71102, datetime.datetime(2026, 5, 29, 6, 17, 39), datetime.datetime(2026, 5, 29, 6, 17, 38), 'salt', 6.32, 83.81, None, 14.5, 78.43, 2.53, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:17:41.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:17:41.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:17:41.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:17:38, diff=3.421299s, valid=True
2026-05-29T06:17:41.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:17:41.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:17:41.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:12, diff=-30.575347s, valid=True
2026-05-29T06:17:41.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:17:41.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:17:36, diff=5.432466s, valid=True
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:17:41.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:17:41.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:17:41.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:12, diff=-30.563985s, valid=True
2026-05-29T06:17:41.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:17:41.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:17:41.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:17:41.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960903.436793s, valid=True
2026-05-29T06:17:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:17:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:17:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:17:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:17:41.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:17:41.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:17:41.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:17:41.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:17:41.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:17:41.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:17:41.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:17:41.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:17:41.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:17:41.758 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:17:41.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:17:42.300 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:17:42.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:17:42.399 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:17:42.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-29T06:17:42.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-29T06:17:42.680 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:17:42.680 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:18:12.702 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:18:12.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:18:12.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:18:13.155 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:18:13.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:18:13.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:18:13.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-29T06:18:13.397 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:18:13.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-29T06:18:13.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:18:13.412 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:18:13.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:18:13.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-29T06:18:16.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-29T06:18:16.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:18:16.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:18:16.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:18:16.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:18:16.465 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:18:16.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:18:16.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:18:16.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:18:16.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:18:16.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:18:16.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:18:16.485 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:18:16.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:18:16.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:18:16.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:18:16.711 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:18:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:18:16.757 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:18:16.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:18:16.802 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:18:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:18:16.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:18:16.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:18:16.865 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:18:09
2026-05-29T06:18:16.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71103, datetime.datetime(2026, 5, 29, 6, 18, 9), datetime.datetime(2026, 5, 29, 6, 18, 9), 'salt', 6.39, 83.64, None, 14.01, 79.4, 2.56, 832.19, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:18:16.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:18:16.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:18:16.872 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:09, diff=7.872823s, valid=True
2026-05-29T06:18:16.872 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:18:16.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:18:16.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:12, diff=4.876267s, valid=True
2026-05-29T06:18:16.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:18:16.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:07, diff=9.884214s, valid=True
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:18:16.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:18:16.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:12, diff=4.887854s, valid=True
2026-05-29T06:18:16.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:18:16.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:18:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:18:16.888 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960938.888642s, valid=True
2026-05-29T06:18:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:18:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:18:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:18:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:18:16.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:18:16.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:18:16.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:18:16.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:18:16.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:18:17.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:18:17.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:18:17.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:18:17.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:18:17.278 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:18:17.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:18:17.824 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:18:17.924 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:18:17.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:18:17.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:18:17.925 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:18:18.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:18:18.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:18:48.133 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:18:48.133 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:18:48.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:18:48.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:18:48.297 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:18:48.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:18:48.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-29T06:18:48.507 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:18:48.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-29T06:18:48.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:18:48.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:18:48.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:18:48.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-29T06:18: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-29T06:18:51.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:18:51.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:18:51.485 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:18:51.485 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:18:51.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:18:51.512 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:18:51.513 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:18:51.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:18:51.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:18:51.514 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:18:51.514 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:18:51.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:18:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:18:51.645 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:18:51.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:18:51.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:18:51.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:18:51.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:18:51.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:18:51.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:18:51.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:18:51.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:18:51.836 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:18:51.900 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:18:40
2026-05-29T06:18:51.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71104, datetime.datetime(2026, 5, 29, 6, 18, 40), datetime.datetime(2026, 5, 29, 6, 18, 39), 'salt', 6.32, 83.51, None, 14.61, 79.28, 2.58, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:18:51.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:18:51.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:18:51.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:39, diff=12.907609s, valid=True
2026-05-29T06:18:51.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:18:51.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:18:51.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:12, diff=-20.089009s, valid=True
2026-05-29T06:18:51.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:18:51.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:18:51.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:18:38, diff=13.918758s, valid=True
2026-05-29T06:18:51.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:18:51.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:18:51.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:18:51.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:18:51.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:18:51.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:18:51.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:12, diff=-20.077652s, valid=True
2026-05-29T06:18:51.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:18:51.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:18:51.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:18:51.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=960973.923157s, valid=True
2026-05-29T06:18:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:18:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:18:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:18:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:18:51.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:18:51.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:18:51.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:18:51.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:18:52.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:18:52.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:18:52.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:18:52.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:18:52.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:18:52.245 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:18:52.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:18:52.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:18:52.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:18:52.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:18:52.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-29T06:18:52.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-29T06:18:53.090 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:18:53.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:19:23.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:19:23.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:19:23.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:19:23.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:19:23.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:19:23.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:19:23.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:19:23.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:19:23.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-29T06:19:23.902 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:19:23.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:19:23.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:19:23.910 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:19:26.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-29T06:19:26.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:19:26.493 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:19:26.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:19:26.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:19:26.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:19:26.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:19:26.518 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:19:26.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:19:26.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:19:26.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:19:26.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:19:26.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:19:26.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:19:26.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:19:26.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:19:26.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:19:26.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:19:26.792 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:19:26.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:19:26.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:19:26.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:19:26.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:19:26.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:19:26.898 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:19:11
2026-05-29T06:19:26.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71105, datetime.datetime(2026, 5, 29, 6, 19, 11), datetime.datetime(2026, 5, 29, 6, 19, 10), 'salt', 6.42, 83.54, None, 14.82, 78.67, 2.57, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:19:26.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:19:26.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:19:26.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:10, diff=16.90626s, valid=True
2026-05-29T06:19:26.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:19:26.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:19:26.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:12, diff=14.909703s, valid=True
2026-05-29T06:19:26.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:19:26.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:19:26.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:10, diff=16.917554s, valid=True
2026-05-29T06:19:26.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:19:26.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:19:26.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:19:26.917 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:19:26.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:19:26.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:19:26.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:12, diff=14.921196s, valid=True
2026-05-29T06:19:26.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:19:26.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:19:26.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:19:26.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961008.921986s, valid=True
2026-05-29T06:19:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:19:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:19:26.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:19:26.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:19:26.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:19:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:19:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:19:26.987 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:19:27.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:19:27.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:19:27.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:19:27.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:19:27.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:19:27.311 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:19:27.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:19:27.855 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:19:27.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:19:27.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:19:27.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-29T06:19:27.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-29T06:19:28.107 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:19:28.107 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:19:58.115 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:19:58.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:19:58.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:19:58.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:19:58.554 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:19:58.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:19:58.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-29T06:19:58.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:19: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-29T06:19:58.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:19:58.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:19:58.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:19:58.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-29T06:20:01.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-29T06:20:01.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:20:01.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:20:01.909 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:20:01.909 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:20:01.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:20:01.930 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:20:01.930 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:20:01.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:20:01.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:20:01.930 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:20:01.930 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:20:01.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:20:02.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:20:02.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:20:02.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:20:02.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:20:02.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:20:02.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:20:02.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:20:02.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:20:02.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:20:02.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:20:02.243 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:20:02.304 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:19:41
2026-05-29T06:20:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71106, datetime.datetime(2026, 5, 29, 6, 19, 41), datetime.datetime(2026, 5, 29, 6, 19, 40), 'salt', 6.36, 83.31, None, 14.54, 80.1, 2.62, 832.19, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:20:02.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:20:02.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:20:02.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:40, diff=22.311268s, valid=True
2026-05-29T06:20:02.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:20:02.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:20:02.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:12, diff=-9.685289s, valid=True
2026-05-29T06:20:02.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:20:02.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:20:02.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:19:40, diff=22.32261s, valid=True
2026-05-29T06:20:02.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:20:02.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:20:02.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:20:02.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:20:02.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:20:02.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:20:02.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:12, diff=-9.673756s, valid=True
2026-05-29T06:20:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:20:02.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:20:02.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:20:02.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961044.327029s, valid=True
2026-05-29T06:20:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:20:02.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:20:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:20:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:20:02.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:20:02.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:20:02.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:20:02.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:20:02.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:20:02.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:20:02.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:20:02.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:20:02.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:20:02.652 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:20:02.874 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:20:03.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:20:03.310 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:20:03.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:20:03.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-29T06:20:03.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-29T06:20:03.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:20:03.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:20:33.491 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:20:33.492 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:20:33.492 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:20:33.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:20:33.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:20:34.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:20:34.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-29T06:20:34.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:20:34.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-29T06:20:34.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:20:34.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:20:34.087 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:20:34.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-29T06:20:36.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-29T06:20:36.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:20:36.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:20:36.779 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:20:36.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:20:36.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:20:36.804 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:20:36.805 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:20:36.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:20:36.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:20:36.806 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:20:36.806 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:20:36.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:20:37.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:20:37.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:20:37.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:20:37.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:20:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:20:37.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:20:37.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:20:37.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:20:37.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:20:37.169 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:20:37.169 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:20:37.232 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:20:11
2026-05-29T06:20:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71107, datetime.datetime(2026, 5, 29, 6, 20, 11), datetime.datetime(2026, 5, 29, 6, 20, 11), 'salt', 6.46, 83.18, None, 14.72, 77.82, 2.64, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:20:37.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:20:37.232 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:20:37.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:11, diff=26.238471s, valid=True
2026-05-29T06:20:37.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:20:37.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:20:37.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:12, diff=25.241288s, valid=True
2026-05-29T06:20:37.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:20:37.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:20:37.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:10, diff=27.247762s, valid=True
2026-05-29T06:20:37.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:20:37.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:20:37.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:20:37.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:20:37.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:20:37.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:20:37.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:20:12, diff=25.250744s, valid=True
2026-05-29T06:20:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:20:37.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:20:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:20:37.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961079.251433s, valid=True
2026-05-29T06:20:37.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:20:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:20:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:20:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:20:37.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:20:37.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:20:37.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:20:37.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:20:37.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:20:37.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:20:37.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:20:37.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:20:37.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:20:37.565 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:20:37.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:20:38.113 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:20:38.217 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:20:38.218 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:20:38.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-29T06:20:38.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-29T06:20:41.748 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:20:41.748 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:21:11.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:21:11.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:21:11.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:21:11.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:21:11.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:21:12.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:21: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-29T06:21:12.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:21:12.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-29T06:21:12.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:21:12.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:21:12.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:21:12.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-29T06:21:15.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-29T06:21:15.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:21:15.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:21:15.542 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:21:15.542 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:21:15.554 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:21:15.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:21:15.568 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:21:15.568 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:21:15.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:21:15.569 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:21:15.569 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:21:15.576 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:21:15.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:21:15.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:21:15.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:21:15.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:21:15.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:21:15.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:21:15.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:21:15.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:21:15.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:21:15.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:21:15.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:21:15.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:21:12
2026-05-29T06:21:15.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71109, datetime.datetime(2026, 5, 29, 6, 21, 12), datetime.datetime(2026, 5, 29, 6, 21, 11), 'salt', 6.49, 82.94, None, 14.75, 78.36, 2.68, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:21:15.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:21:15.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:21:15.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:11, diff=4.959502s, valid=True
2026-05-29T06:21:15.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:21:15.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:21:15.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:12, diff=3.962799s, valid=True
2026-05-29T06:21:15.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:21:15.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:11, diff=4.970386s, valid=True
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:21:15.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:21:15.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:12, diff=3.973901s, valid=True
2026-05-29T06:21:15.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:21:15.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:21:15.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:21:15.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961117.974666s, valid=True
2026-05-29T06:21:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:21:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:21:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:21:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:21:15.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:21:16.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:21:16.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:21:16.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:21:16.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:21:16.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:21:16.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:21:16.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:21:16.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:21:16.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:21:16.499 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:21:16.837 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:21:16.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:21:16.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:21:16.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-29T06:21:16.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-29T06:21:17.207 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:21:17.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:21:47.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:21:47.209 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:21:47.209 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:21:47.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:21:47.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:21:47.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:21:47.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-29T06:21:47.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:21:47.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-29T06:21:47.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:21:47.775 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:21:47.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:21:47.781 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:21:50.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:21:50.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:21:50.369 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:21:50.370 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:21:50.371 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:21:50.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:21:50.394 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:21:50.395 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:21:50.395 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:21:50.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:21:50.396 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:21:50.396 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:21:50.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:21:50.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:21:50.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:21:50.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:21:50.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:21:50.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:21:50.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:21:50.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:21:50.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:21:50.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:21:50.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:21:50.728 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:21:50.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:21:42
2026-05-29T06:21:50.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71110, datetime.datetime(2026, 5, 29, 6, 21, 42), datetime.datetime(2026, 5, 29, 6, 21, 41), 'salt', 6.46, 82.71, None, 14.61, 79.23, 2.72, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:21:50.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:21:50.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:21:50.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:41, diff=9.806815s, valid=True
2026-05-29T06:21:50.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:21:50.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:21:50.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:12, diff=-21.18972s, valid=True
2026-05-29T06:21:50.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:21:50.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:21:41, diff=9.818019s, valid=True
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:21:50.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:21:50.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:12, diff=-21.178729s, valid=True
2026-05-29T06:21:50.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:21:50.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:21:50.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:21:50.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961152.822073s, valid=True
2026-05-29T06:21:50.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:21:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:21:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:21:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:21:50.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:21:50.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:21:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:21:50.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:21:50.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:21:50.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:21:51.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:21:51.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:21:51.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:21:51.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:21:51.353 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:21:51.695 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:21:51.793 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:21:51.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:21:51.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-29T06:21:51.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-29T06:21:52.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:21:52.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:22:22.032 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:22:22.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:22:22.032 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:22:22.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:22:22.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:22:22.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:22:22.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-29T06:22:22.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:22:22.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-29T06:22:22.434 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:22:22.435 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:22:22.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:22:22.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-29T06:22:24.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-29T06:22:24.805 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:22:24.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:22:24.813 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:22:24.814 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:22:24.824 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:22:24.836 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:22:24.837 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:22:24.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:22:24.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:22:24.838 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:22:24.838 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:22:24.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:22:24.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:22:24.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:22:25.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:22:25.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:22:25.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:22:25.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:22:25.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:22:25.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:22:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:22:25.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:22:25.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:22:25.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:22:12
2026-05-29T06:22:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71111, datetime.datetime(2026, 5, 29, 6, 22, 12), datetime.datetime(2026, 5, 29, 6, 22, 12), 'salt', 6.62, 82.48, None, 14.75, 80.41, 2.76, 832.31, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:22:25.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:22:25.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:22:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:12, diff=13.247517s, valid=True
2026-05-29T06:22:25.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:22:25.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:22:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:12, diff=13.251033s, valid=True
2026-05-29T06:22:25.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:22:25.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:11, diff=14.259036s, valid=True
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:22:25.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:22:25.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:12, diff=13.262669s, valid=True
2026-05-29T06:22:25.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:22:25.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:22:25.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:22:25.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961187.263445s, valid=True
2026-05-29T06:22:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:22:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:22:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:22:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:22:25.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:22:25.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:22:25.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:22:25.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:22:25.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:22:25.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:22:25.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:22:25.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:22:25.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:22:25.584 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:22:25.788 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:22:26.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:22:26.301 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:22:26.301 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:22:26.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-29T06:22:26.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-29T06:22:26.507 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:22:26.507 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:22:56.537 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:22:56.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:22:56.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:22:56.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:22:56.872 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:22:57.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:22:57.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:22:57.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:22:57.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-29T06:22:57.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:22:57.098 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:22:57.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:22:57.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-29T06:22: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-29T06:22:59.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:22:59.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:22:59.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:22:59.460 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:22:59.470 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:22:59.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:22:59.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:22:59.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:22:59.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:22:59.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:22:59.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:22:59.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:22:59.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:22:59.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:22:59.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:22:59.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:22:59.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:22:59.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:22:59.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:22:59.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:22:59.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:22:59.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:22:59.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:22:59.799 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:22:42
2026-05-29T06:22:59.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71112, datetime.datetime(2026, 5, 29, 6, 22, 42), datetime.datetime(2026, 5, 29, 6, 22, 42), 'salt', 6.56, 82.21, None, 14.93, 79.16, 2.81, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:22:59.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:22:59.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:22:59.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:42, diff=17.806582s, valid=True
2026-05-29T06:22:59.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:22:59.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:22:59.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:12, diff=-12.190234s, valid=True
2026-05-29T06:22:59.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:22:59.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:22:41, diff=18.817151s, valid=True
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:22:59.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:22:59.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:12, diff=-12.17953s, valid=True
2026-05-29T06:22:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:22:59.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:22:59.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:22:59.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961221.821197s, valid=True
2026-05-29T06:22:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:22:59.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:22:59.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:22:59.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:22:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:22:59.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:22:59.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:22:59.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:23:00.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:23:00.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:23:00.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:23:00.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:23:00.367 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:23:00.708 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:23:00.810 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:23:00.810 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:23:00.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-29T06:23:00.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-29T06:23:01.072 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:23:01.072 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:23:31.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:23:31.084 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:23:31.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:23:31.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:23:31.429 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:23:31.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:23:31.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-29T06:23:31.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:23:31.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-29T06:23:31.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:23:31.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:23:31.668 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:23:31.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-29T06:23:34.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-29T06:23:34.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:23:34.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:23:34.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:23:34.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:23:34.707 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:23:34.719 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:23:34.720 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:23:34.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:23:34.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:23:34.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:23:34.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:23:34.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:23:34.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:23:34.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:23:34.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:23:34.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:23:34.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:23:34.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:23:35.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:23:35.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:23:35.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:23:35.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:23:35.034 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:23:35.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:23:13
2026-05-29T06:23:35.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71113, datetime.datetime(2026, 5, 29, 6, 23, 13), datetime.datetime(2026, 5, 29, 6, 23, 12), 'salt', 6.66, 81.95, None, 15.1, 79.56, 2.86, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:23:35.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:23:35.092 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:23:35.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:12, diff=23.099533s, valid=True
2026-05-29T06:23:35.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:23:35.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:23:35.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:12, diff=23.102826s, valid=True
2026-05-29T06:23:35.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:23:35.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:23:35.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:11, diff=24.110666s, valid=True
2026-05-29T06:23:35.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:23:35.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:23:35.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:23:35.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:23:35.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:23:35.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:23:35.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:12, diff=23.114199s, valid=True
2026-05-29T06:23:35.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:23:35.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:23:35.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:23:35.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961257.114966s, valid=True
2026-05-29T06:23:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:23:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:23:35.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:23:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:23:35.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:23:35.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:23:35.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:23:35.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:23:35.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:23:35.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:23:35.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:23:35.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:23:35.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:23:35.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:23:35.718 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:23:36.054 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:23:36.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:23:36.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:23:36.155 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:23:36.155 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:23:36.470 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:23:36.470 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:24:06.484 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:24:06.484 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:24: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-29T06:24:06.643 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:24:06.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:24:06.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:24:06.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-29T06:24:06.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:24:06.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-29T06:24:06.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:24:06.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:24:06.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:24:06.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:24:09.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-29T06:24:09.211 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:24:09.219 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:24:09.220 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:24:09.220 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:24:09.230 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:24:09.243 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:24:09.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:24:09.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:24:09.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:24:09.245 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:24:09.245 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:24:09.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:24:09.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:24:09.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:24:09.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:24:09.444 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:24:09.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:24:09.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:24:09.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:24:09.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:24:09.531 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:24:09.532 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:24:09.532 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:24:09.591 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:23:43
2026-05-29T06:24:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71114, datetime.datetime(2026, 5, 29, 6, 23, 43), datetime.datetime(2026, 5, 29, 6, 23, 42), 'salt', 6.66, 81.98, None, 14.43, 79.59, 2.85, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:24:09.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:24:09.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:24:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:42, diff=27.598775s, valid=True
2026-05-29T06:24:09.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:24:09.598 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:24:09.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:24:12, diff=-2.398056s, valid=True
2026-05-29T06:24:09.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:24:09.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:23:42, diff=27.609292s, valid=True
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:24:09.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:24:09.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:24:12, diff=-2.387267s, valid=True
2026-05-29T06:24:09.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:24:09.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:24:09.612 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:24:09.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961291.613461s, valid=True
2026-05-29T06:24:09.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:24:09.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:24:09.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:24:09.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:24:09.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:24:09.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:24:09.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:24:09.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:24:09.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:24:09.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:24:09.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:24:09.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:24:09.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:24:09.944 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:24:10.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:24:10.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:24:10.597 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:24:10.597 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:24:10.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-29T06:24:10.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-29T06:24:10.855 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:24:10.855 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:24:40.870 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:24:40.870 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:24:40.870 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:24:41.047 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:24:41.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:24:41.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:24:41.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-29T06:24:41.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:24:41.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-29T06:24:41.302 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:24:41.302 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:24:41.311 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:24:41.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-29T06:24:43.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-29T06:24:43.743 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:24:43.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:24:43.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:24:43.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:24:43.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:24:43.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:24:43.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:24:43.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:24:43.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:24:43.760 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:24:43.760 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:24:43.766 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:24:43.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:24:43.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:24:43.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:24:43.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:24:43.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:24:43.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:24:44.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:24:44.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:24:44.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:24:44.031 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:24:44.031 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:24:44.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:24:43
2026-05-29T06:24:44.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71116, datetime.datetime(2026, 5, 29, 6, 24, 43), datetime.datetime(2026, 5, 29, 6, 24, 43), 'salt', 6.49, 81.32, None, 15.03, 81.44, 2.96, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:24:44.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:24:44.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:24:44.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:24:43, diff=1.097064s, valid=True
2026-05-29T06:24:44.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:24:44.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:24:44.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:12, diff=-27.899759s, valid=True
2026-05-29T06:24:44.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:24:44.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:24:44.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:24:42, diff=2.107662s, valid=True
2026-05-29T06:24:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:24:44.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:24:44.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:24:44.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:24:44.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:24:44.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:24:44.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:12, diff=-27.889027s, valid=True
2026-05-29T06:24:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:24:44.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:24:44.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:24:44.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961326.111714s, valid=True
2026-05-29T06:24:44.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:24:44.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:24:44.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:24:44.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:24:44.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:24:44.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:24:44.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:24:44.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:24:44.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:24:44.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:24:44.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:24:44.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:24:44.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:24:44.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:24:44.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:24:45.041 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:24:45.140 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:24:45.140 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:24:45.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-29T06:24:45.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-29T06:24:45.300 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:24:45.300 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:25:15.330 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:25:15.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:25:15.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:25:15.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:25:15.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:25:15.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:25:15.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-29T06:25:15.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:25:15.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-29T06:25:15.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:25:15.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:25:15.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:25:15.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-29T06:25:18.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-29T06:25:18.139 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:25:18.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:25:18.148 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:25:18.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:25:18.159 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:25:18.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:25:18.172 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:25:18.172 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:25:18.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:25:18.172 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:25:18.172 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:25:18.178 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:25:18.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:25:18.255 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:25:18.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:25:18.348 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:25:18.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:25:18.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:25:18.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:25:18.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:25:18.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:25:18.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:25:18.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:25:18.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:25:14
2026-05-29T06:25:18.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71117, datetime.datetime(2026, 5, 29, 6, 25, 14), datetime.datetime(2026, 5, 29, 6, 25, 13), 'salt', 6.59, 81.32, None, 15.24, 81.09, 2.96, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:25:18.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:25:18.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:25:18.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:13, diff=5.504479s, valid=True
2026-05-29T06:25:18.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:25:18.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:25:18.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:12, diff=6.507673s, valid=True
2026-05-29T06:25:18.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:25:18.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:12, diff=6.515029s, valid=True
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:25:18.515 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:25:18.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:12, diff=6.518425s, valid=True
2026-05-29T06:25:18.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:25:18.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:25:18.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:25:18.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961360.519165s, valid=True
2026-05-29T06:25:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:25:18.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:25:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:25:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:25:18.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:25:18.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:25:18.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:25:18.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:25:18.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:25:18.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:25:18.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:25:18.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:25:18.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:25:18.838 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:25:19.043 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:25:19.380 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:25:19.479 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:25:19.479 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:25:19.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-29T06:25:19.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-29T06:25:19.692 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:25:19.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:25:49.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:25:49.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:25:49.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:25:49.962 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:25:49.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:25:50.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:25:50.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-29T06:25:50.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:25: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-29T06:25:50.203 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:25:50.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:25:50.208 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:25:50.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-29T06:25:53.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-29T06:25:53.065 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:25:53.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:25:53.073 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:25:53.073 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:25:53.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:25:53.097 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:25:53.098 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:25:53.098 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:25:53.098 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:25:53.099 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:25:53.099 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:25:53.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:25:53.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:25:53.232 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:25:53.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:25:53.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:25:53.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:25:53.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:25:53.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:25:53.417 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:25:53.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:25:53.423 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:25:53.423 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:25:53.483 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:25:44
2026-05-29T06:25:53.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71118, datetime.datetime(2026, 5, 29, 6, 25, 44), datetime.datetime(2026, 5, 29, 6, 25, 43), 'salt', 6.59, 81.22, None, 15.24, 80.27, 2.98, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:25:53.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:25:53.483 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:25:53.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:43, diff=10.49054s, valid=True
2026-05-29T06:25:53.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:25:53.490 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:25:53.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:12, diff=-18.506077s, valid=True
2026-05-29T06:25:53.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:25:53.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:25:53.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:25:43, diff=10.501656s, valid=True
2026-05-29T06:25:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:25:53.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:25:53.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:25:53.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:25:53.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:25:53.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:25:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:12, diff=-18.494719s, valid=True
2026-05-29T06:25:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:25:53.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:25:53.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:25:53.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961395.506084s, valid=True
2026-05-29T06:25:53.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:25:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:25:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:25:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:25:53.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:25:53.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:25:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:25:53.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:25:53.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:25:53.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:25:53.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:25:53.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:25:53.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:25:53.894 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:25:54.115 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:25:54.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:25:54.554 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:25:54.554 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:25:54.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-29T06:25:54.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-29T06:25:54.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:25:54.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:26:24.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:26:24.764 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:26:24.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:26:25.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:26:25.080 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:26:25.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:26:25.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-29T06:26:25.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:26:25.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-29T06:26:25.327 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:26:25.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:26:25.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:26:25.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-29T06:26:27.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-29T06:26:27.969 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:26:27.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:26:27.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:26:27.978 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:26:27.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:26:28.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:26:28.001 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:26:28.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:26:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:26:28.002 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:26:28.002 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:26:28.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:26:28.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:26:28.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:26:28.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:26:28.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:26:28.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:26:28.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:26:28.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:26:28.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:26:28.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:26:28.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:26:28.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:26:28.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:26:14
2026-05-29T06:26:28.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71119, datetime.datetime(2026, 5, 29, 6, 26, 14), datetime.datetime(2026, 5, 29, 6, 26, 14), 'salt', 6.69, 81.02, None, 15.46, 81.11, 3.02, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:26:28.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:26:28.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:26:28.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:14, diff=14.391029s, valid=True
2026-05-29T06:26:28.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:26:28.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:26:28.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:12, diff=16.394421s, valid=True
2026-05-29T06:26:28.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:26:28.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:13, diff=15.402355s, valid=True
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:26:28.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:26:28.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:12, diff=16.406022s, valid=True
2026-05-29T06:26:28.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:26:28.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:26:28.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:26:28.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961430.406828s, valid=True
2026-05-29T06:26:28.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:26:28.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:26:28.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:26:28.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:26:28.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:26:28.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:26:28.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:26:28.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:26:28.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:26:28.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:26:28.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:26:28.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:26:28.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:26:28.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:26:28.931 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:26:29.267 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:26:29.366 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:26:29.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:26:29.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-29T06:26:29.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-29T06:26:29.568 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:26:29.568 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:26:59.598 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:26:59.599 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:26:59.599 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:26:59.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:26:59.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:26:59.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:26:59.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:27:00.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:27:00.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-29T06:27:00.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:27:00.013 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:27:00.020 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:27:00.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-29T06:27:02.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-29T06:27:02.301 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:27:02.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:27:02.309 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:27:02.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:27:02.319 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:27:02.332 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:27:02.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:27:02.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:27:02.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:27:02.334 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:27:02.334 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:27:02.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:27:02.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:27:02.470 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:27:02.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:27:02.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:27:02.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:27:02.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:27:02.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:27:02.717 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:27:02.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:27:02.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:27:02.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:27:02.784 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:26:44
2026-05-29T06:27:02.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71120, datetime.datetime(2026, 5, 29, 6, 26, 44), datetime.datetime(2026, 5, 29, 6, 26, 44), 'salt', 6.59, 80.82, None, 15.21, 80.81, 3.05, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:27:02.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:27:02.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:27:02.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:44, diff=18.790806s, valid=True
2026-05-29T06:27:02.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:27:02.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:27:02.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:12, diff=-9.20615s, valid=True
2026-05-29T06:27:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:27:02.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:27:02.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:26:43, diff=19.80067s, valid=True
2026-05-29T06:27:02.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:27:02.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:27:02.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:27:02.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:27:02.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:27:02.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:27:02.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:12, diff=-9.196171s, valid=True
2026-05-29T06:27:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:27:02.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:27:02.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:27:02.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961464.804505s, valid=True
2026-05-29T06:27:02.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:27:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:27:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:27:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:27:02.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:27:02.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:27:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:27:02.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:27:02.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:27:02.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:27:03.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:27:03.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:27:03.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:27:03.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:27:03.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:27:03.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:27:03.777 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:27:03.777 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:27:03.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-29T06:27:03.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-29T06:27:04.069 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:27:04.069 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:27:34.100 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:27:34.100 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:27:34.100 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:27:34.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:27:34.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:27:34.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:27:34.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-29T06:27:34.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:27:34.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-29T06:27:34.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:27:34.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:27:34.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:27:34.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-29T06:27:37.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-29T06:27:37.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:27:37.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:27:37.556 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:27:37.556 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:27:37.568 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:27:37.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:27:37.581 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:27:37.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:27:37.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:27:37.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:27:37.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:27:37.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:27:37.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:27:37.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:27:37.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:27:37.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:27:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:27:37.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:27:37.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:27:37.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:27:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:27:37.911 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:27:37.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:27:37.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:27:15
2026-05-29T06:27:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71121, datetime.datetime(2026, 5, 29, 6, 27, 15), datetime.datetime(2026, 5, 29, 6, 27, 14), 'salt', 6.62, 80.59, None, 14.93, 80.08, 3.09, 832.31, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:27:37.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:27:37.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:27:37.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:14, diff=23.989029s, valid=True
2026-05-29T06:27:37.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:27:37.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:27:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:12, diff=25.99237s, valid=True
2026-05-29T06:27:37.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:27:37.992 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:13, diff=25.000216s, valid=True
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:27:38.000 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:27:38.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:12, diff=26.003821s, valid=True
2026-05-29T06:27:38.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:27:38.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:27:38.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:27:38.004 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961500.00461s, valid=True
2026-05-29T06:27:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:27:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:27:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:27:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:27:38.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:27:38.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:27:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:27:38.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:27:38.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:27:38.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:27:38.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:27:38.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:27:38.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:27:38.330 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:27:38.535 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:27:38.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:27:38.971 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:27:38.971 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:27:38.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-29T06:27:38.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-29T06:27:39.168 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:27:39.169 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:28:09.199 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:28:09.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:28:09.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:28:09.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:28:09.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:28:09.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:28:09.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-29T06:28:09.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:28:09.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-29T06:28:09.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:28:09.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:28:09.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:28:09.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-29T06:28:12.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-29T06:28:12.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:28:12.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:28:12.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:28:12.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:28:12.225 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:28:12.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:28:12.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:28:12.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:28:12.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:28:12.239 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:28:12.240 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:28:12.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:28:12.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:28:12.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:28:12.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:28:12.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:28:12.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:28:12.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:28:12.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:28:12.560 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:28:12.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:28:12.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:28:12.565 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:28:12.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:27:45
2026-05-29T06:28:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71122, datetime.datetime(2026, 5, 29, 6, 27, 45), datetime.datetime(2026, 5, 29, 6, 27, 44), 'salt', 6.62, 80.62, None, 14.5, 80.71, 3.08, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:28:12.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:28:12.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:28:12.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:44, diff=28.629941s, valid=True
2026-05-29T06:28:12.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:28:12.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:28:12.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:28:12, diff=0.63309s, valid=True
2026-05-29T06:28:12.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:28:12.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:27:44, diff=28.640342s, valid=True
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:28:12.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:28:12.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:28:12, diff=0.643678s, valid=True
2026-05-29T06:28:12.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:28:12.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:28:12.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:28:12.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961534.644389s, valid=True
2026-05-29T06:28:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:28:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:28:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:28:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:28:12.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:28:12.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:28:12.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:28:12.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:28:12.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:28:12.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:28:12.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:28:12.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:28:12.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:28:12.963 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:28:13.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:28:13.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:28:13.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:28:13.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:28:13.601 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:28:13.601 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:28:13.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:28:13.808 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:28:43.833 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:28:43.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:28:43.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:28:44.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:28:44.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:28:44.551 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:28:44.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:28:44.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:28:44.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:28:44.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:28:44.579 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:28:44.587 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:28:44.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-29T06:28:47.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:28:47.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:28:47.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:28:47.185 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:28:47.186 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:28:47.195 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:28:47.207 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:28:47.208 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:28:47.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:28:47.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:28:47.209 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:28:47.209 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:28:47.215 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:28:47.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:28:47.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:28:47.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:28:47.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:28:47.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:28:47.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:28:47.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:28:47.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:28:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:28:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:28:47.525 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:28:47.585 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:28:45
2026-05-29T06:28:47.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71124, datetime.datetime(2026, 5, 29, 6, 28, 45), datetime.datetime(2026, 5, 29, 6, 28, 45), 'salt', 6.52, 80.29, None, 14.64, 81.02, 3.14, 832.25, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:28:47.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:28:47.585 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:28:47.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:28:45, diff=2.592888s, valid=True
2026-05-29T06:28:47.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:28:47.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:28:47.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:12, diff=-24.403721s, valid=True
2026-05-29T06:28:47.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:28:47.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:28:44, diff=3.604263s, valid=True
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:28:47.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:28:47.607 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:12, diff=-24.392145s, valid=True
2026-05-29T06:28:47.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:28:47.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:28:47.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:28:47.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961569.608649s, valid=True
2026-05-29T06:28:47.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:28:47.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:28:47.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:28:47.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:28:47.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:28:47.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:28:47.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:28:47.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:28:47.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:28:47.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:28:47.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:28:47.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:28:47.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:28:47.930 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:28:48.134 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:28:48.473 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:28:48.631 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:28:48.632 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:28:48.632 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:28:48.632 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:28:48.834 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:28:48.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:29:18.864 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:29:18.864 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:29:18.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:29:19.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:29:19.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:29:19.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:29:19.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-29T06:29:19.408 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:29:19.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-29T06:29:19.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:29:19.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:29:19.424 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:29:19.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-29T06:29:22.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:29:22.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:29:22.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:29:22.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:29:22.136 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:29:22.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:29:22.160 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:29:22.161 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:29:22.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:29:22.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:29:22.162 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:29:22.162 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:29:22.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:29:22.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:29:22.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:29:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:29:22.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:29:22.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:29:22.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:29:22.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:29:22.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:29:22.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:29:22.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:29:22.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:29:22.540 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:29:16
2026-05-29T06:29:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71125, datetime.datetime(2026, 5, 29, 6, 29, 16), datetime.datetime(2026, 5, 29, 6, 29, 15), 'salt', 6.62, 80.12, None, 14.79, 82.54, 3.17, 832.31, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T06:29:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:29:22.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:29:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:15, diff=7.547158s, valid=True
2026-05-29T06:29:22.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:29:22.547 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:29:22.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:12, diff=10.550016s, valid=True
2026-05-29T06:29:22.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:29:22.550 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:29:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:14, diff=8.556676s, valid=True
2026-05-29T06:29:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:29:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:29:22.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:29:22.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:29:22.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:29:22.557 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:29:22.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:12, diff=10.55975s, valid=True
2026-05-29T06:29:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:29:22.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:29:22.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:29:22.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961604.560401s, valid=True
2026-05-29T06:29:22.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:29:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:29:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:29:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:29:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:29:22.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:29:22.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:29:22.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:29:22.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:29:22.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:29:22.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:29:22.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:29:22.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:29:22.882 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:29:23.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:29:23.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:29:23.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:29:23.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:29:23.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-29T06:29:23.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:29:23.727 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:29:23.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:29:53.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:29:53.756 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:29:53.756 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:29:53.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:29:53.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:29:54.060 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:29:54.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-29T06:29:54.077 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:29:54.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-29T06:29:54.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:29:54.090 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:29:54.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:29:54.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-29T06:29:56.697 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:29:56.698 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:29:56.705 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:29:56.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:29:56.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:29:56.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:29:56.730 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:29:56.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:29:56.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:29:56.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:29:56.732 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:29:56.732 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:29:56.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:29:56.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:29:56.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:29:56.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:29:56.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:29:56.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:29:56.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:29:57.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:29:57.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:29:57.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:29:57.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:29:57.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:29:57.108 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:29:46
2026-05-29T06:29:57.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71126, datetime.datetime(2026, 5, 29, 6, 29, 46), datetime.datetime(2026, 5, 29, 6, 29, 45), 'salt', 6.59, 79.99, None, 15.21, 82.36, 3.2, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:29:57.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:29:57.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:29:57.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:45, diff=12.116377s, valid=True
2026-05-29T06:29:57.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:29:57.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:29:57.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:12, diff=-14.880169s, valid=True
2026-05-29T06:29:57.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:29:57.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:29:57.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:29:44, diff=13.127892s, valid=True
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:29:57.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:29:57.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:12, diff=-14.86853s, valid=True
2026-05-29T06:29:57.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:29:57.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:29:57.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:29:57.132 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961639.132285s, valid=True
2026-05-29T06:29:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:29:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:29:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:29:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:29:57.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:29:57.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:29:57.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:29:57.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:29:57.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:29:57.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:29:57.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:29:57.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:29:57.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:29:57.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:29:57.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:29:58.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:29:58.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:29:58.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:29:58.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-29T06:29:58.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-29T06:29:58.350 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:29:58.350 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:30:28.371 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:30:28.371 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:30:28.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:30:28.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:30:28.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:30:29.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:30:29.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-29T06:30:29.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:30:29.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-29T06:30:29.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:30:29.041 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:30:29.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:30:29.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-29T06:30:31.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-29T06:30:31.442 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:30:31.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:30:31.451 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:30:31.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:30:31.463 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:30:31.475 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:30:31.476 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:30:31.476 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:30:31.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:30:31.477 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:30:31.477 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:30:31.483 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:30:31.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:30:31.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:30:31.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:30:31.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:30:31.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:30:31.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:30:31.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:30:31.789 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:30:31.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:30:31.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:30:31.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:30:31.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:30:16
2026-05-29T06:30:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71127, datetime.datetime(2026, 5, 29, 6, 30, 16), datetime.datetime(2026, 5, 29, 6, 30, 16), 'salt', 6.59, 79.89, None, 15.14, 83.48, 3.22, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:30:31.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:30:31.852 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:30:31.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:16, diff=15.859554s, valid=True
2026-05-29T06:30:31.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:30:31.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:30:31.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:12, diff=19.862975s, valid=True
2026-05-29T06:30:31.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:30:31.863 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:30:31.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:15, diff=16.870824s, valid=True
2026-05-29T06:30:31.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:30:31.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:30:31.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:30:31.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:30:31.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:30:31.871 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:30:31.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:12, diff=19.874418s, valid=True
2026-05-29T06:30:31.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:30:31.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:30:31.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:30:31.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961673.87522s, valid=True
2026-05-29T06:30:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:30:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:30:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:30:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:30:31.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:30:31.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:30:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:30:31.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:30:31.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:30:32.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:30:32.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:30:32.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:30:32.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:30:32.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:30:32.403 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:30:32.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:30:32.844 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:30:32.844 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:30:32.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-29T06:30:32.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-29T06:30:33.070 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:30:33.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:31:03.094 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:31:03.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:31:03.095 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:31:03.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:31:03.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:31:03.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:31:03.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:31:03.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:31:03.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-29T06:31:03.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:31:03.817 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:31:03.825 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:31:03.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-29T06:31:06.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:31:06.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:31:06.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:31:06.182 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:31:06.182 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:31:06.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:31:06.204 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:31:06.204 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:31:06.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:31:06.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:31:06.206 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:31:06.206 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:31:06.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:31:06.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:31:06.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:31:06.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:31:06.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:31:06.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:31:06.480 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:31:06.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:31:06.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:31:06.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:31:06.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:31:06.530 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:31:06.594 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:30:46
2026-05-29T06:31:06.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71128, datetime.datetime(2026, 5, 29, 6, 30, 46), datetime.datetime(2026, 5, 29, 6, 30, 46), 'salt', 6.59, 79.69, None, 15.6, 84.02, 3.25, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:31:06.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:31:06.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:31:06.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:46, diff=20.601714s, valid=True
2026-05-29T06:31:06.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:31:06.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:31:06.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:12, diff=-5.394891s, valid=True
2026-05-29T06:31:06.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:31:06.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:30:45, diff=21.613053s, valid=True
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:31:06.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:31:06.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:12, diff=-5.383274s, valid=True
2026-05-29T06:31:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:31:06.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:31:06.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:31:06.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961708.617536s, valid=True
2026-05-29T06:31:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:31:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:31:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:31:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:31:06.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:31:06.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:31:06.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:31:06.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:31:06.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:31:06.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:31:06.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:31:06.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:31:06.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:31:06.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:31:07.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:31:07.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:31:07.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:31:07.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:31:07.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-29T06:31:07.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-29T06:31:07.935 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:31:07.935 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:31:37.965 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:31:37.965 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:31:37.966 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:31:38.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:31:38.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:31:38.478 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:31:38.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-29T06:31:38.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:31:38.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-29T06:31:38.509 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:31:38.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:31:38.513 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:31:38.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-29T06:31:40.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-29T06:31:40.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:31:40.820 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:31:40.821 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:31:40.822 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:31:40.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:31:40.846 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:31:40.846 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:31:40.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:31:40.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:31:40.847 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:31:40.847 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:31:40.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:31:40.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:31:40.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:31:41.082 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:31:41.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:31:41.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:31:41.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:31:41.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:31:41.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:31:41.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:31:41.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:31:41.176 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:31:41.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:31:17
2026-05-29T06:31:41.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71129, datetime.datetime(2026, 5, 29, 6, 31, 17), datetime.datetime(2026, 5, 29, 6, 31, 16), 'salt', 6.69, 79.59, None, 15.53, 84.09, 3.27, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:31:41.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:31:41.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:31:41.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:16, diff=25.247954s, valid=True
2026-05-29T06:31:41.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:31:41.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:31:41.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:12, diff=29.251337s, valid=True
2026-05-29T06:31:41.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:31:41.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:15, diff=26.259282s, valid=True
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:31:41.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:31:41.262 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:12, diff=29.262939s, valid=True
2026-05-29T06:31:41.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:31:41.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:31:41.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:31:41.263 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961743.263744s, valid=True
2026-05-29T06:31:41.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:31:41.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:31:41.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:31:41.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:31:41.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:31:41.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:31:41.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:31:41.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:31:41.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:31:41.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:31:41.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:31:41.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:31:41.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:31:41.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:31:41.787 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:31:42.122 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:31:42.222 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:31:42.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:31:42.222 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:31:42.222 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:31:42.432 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:31:42.499 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:32:12.510 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:32:12.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:32:12.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:32:12.847 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:32:12.860 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:32:13.064 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:32:13.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-29T06:32:13.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:32:13.078 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:32:13.092 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:32:13.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:32:13.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:32:13.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-29T06:32:15.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-29T06:32:15.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:32:15.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:32:15.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:32:15.993 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:32:16.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:32:16.016 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:32:16.016 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:32:16.017 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:32:16.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:32:16.018 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:32:16.018 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:32:16.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:32:16.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:32:16.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:32:16.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:32:16.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:32:16.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:32:16.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:32:16.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:32:16.281 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:32:16.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:32:16.285 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:32:16.285 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:32:16.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:31:47
2026-05-29T06:32:16.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71130, datetime.datetime(2026, 5, 29, 6, 31, 47), datetime.datetime(2026, 5, 29, 6, 31, 47), 'salt', 6.62, 79.36, None, 15.63, 84.8, 3.31, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:32:16.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:32:16.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:32:16.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:47, diff=29.352681s, valid=True
2026-05-29T06:32:16.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:32:16.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:32:16.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:32:12, diff=4.355675s, valid=True
2026-05-29T06:32:16.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:32:16.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:31:45, diff=31.362366s, valid=True
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:32:16.362 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:32:16.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:32:12, diff=4.365581s, valid=True
2026-05-29T06:32:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:32:16.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:32:16.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:32:16.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961778.366319s, valid=True
2026-05-29T06:32:16.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:32:16.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:32:16.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:32:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:32:16.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:32:16.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:32:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:32:16.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:32:16.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:32:16.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:32:16.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:32:16.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:32:16.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:32:16.831 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:32:17.034 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:32:17.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:32:17.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:32:17.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:32:17.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-29T06:32:17.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-29T06:32:18.721 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:32:18.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:32:48.752 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:32:48.752 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:32:48.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:32:49.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:32:49.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:32:49.255 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:32:49.255 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:32:49.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:32:49.269 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:32:49.282 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:32:49.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:32:49.286 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:32:49.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:32:51.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-29T06:32:51.713 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:32:51.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:32:51.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:32:51.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:32:51.732 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:32:51.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:32:51.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:32:51.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:32:51.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:32:51.747 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:32:51.747 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:32:51.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:32:51.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:32:51.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:32:51.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:32:51.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:32:52.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:32:52.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:32:52.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:32:52.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:32:52.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:32:52.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:32:52.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:32:52.127 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:32:47
2026-05-29T06:32:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71132, datetime.datetime(2026, 5, 29, 6, 32, 47), datetime.datetime(2026, 5, 29, 6, 32, 47), 'salt', 6.72, 78.96, None, 15.67, 84.89, 3.38, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:32:52.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:32:52.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:32:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:32:47, diff=5.134147s, valid=True
2026-05-29T06:32:52.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:32:52.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:32:52.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:12, diff=-19.862552s, valid=True
2026-05-29T06:32:52.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:32:52.137 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:32:47, diff=5.145272s, valid=True
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:32:52.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:32:52.148 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:12, diff=-19.851162s, valid=True
2026-05-29T06:32:52.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:32:52.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:32:52.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:32:52.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961814.149612s, valid=True
2026-05-29T06:32:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:32:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:32:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:32:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:32:52.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:32:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:32:52.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:32:52.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:32:52.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:32:52.287 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:32:52.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:32:52.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:32:52.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:32:52.471 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:32:52.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:32:53.010 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:32:53.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:32:53.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:32:53.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-29T06:32:53.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-29T06:32:53.204 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:32:53.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:33:23.230 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:33:23.230 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:33:23.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:33:23.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:33:23.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:33:23.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:33:23.574 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:33:23.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:33:23.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-29T06:33:23.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:33:23.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:33:23.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:33:23.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-29T06:33:26.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-29T06:33:26.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:33:26.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:33:26.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:33:26.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:33:26.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:33:26.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:33:26.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:33:26.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:33:26.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:33:26.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:33:26.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:33:26.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:33:26.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:33:26.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:33:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:33:26.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:33:26.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:33:26.364 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:33:26.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:33:26.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:33:26.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:33:26.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:33:26.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:33:26.469 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:33:18
2026-05-29T06:33:26.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71133, datetime.datetime(2026, 5, 29, 6, 33, 18), datetime.datetime(2026, 5, 29, 6, 33, 17), 'salt', 6.69, 78.83, None, 16.06, 84.02, 3.41, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:33:26.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:33:26.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:33:26.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:17, diff=9.477254s, valid=True
2026-05-29T06:33:26.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:33:26.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:33:26.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:12, diff=14.480743s, valid=True
2026-05-29T06:33:26.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:33:26.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:33:26.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:16, diff=10.488642s, valid=True
2026-05-29T06:33:26.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:33:26.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:33:26.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:33:26.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:33:26.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:33:26.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:33:26.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:12, diff=14.49225s, valid=True
2026-05-29T06:33:26.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:33:26.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:33:26.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:33:26.493 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961848.49306s, valid=True
2026-05-29T06:33:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:33:26.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:33:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:33:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:33:26.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:33:26.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:33:26.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:33:26.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:33:26.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:33:26.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:33:26.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:33:26.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:33:26.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:33:26.879 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:33:27.082 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:33:27.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:33:27.521 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:33:27.521 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:33:27.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-29T06:33:27.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-29T06:33:27.752 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:33:27.753 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:33:57.783 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:33:57.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:33:57.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:33:57.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:33:57.933 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:33:58.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:33:58.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:33:58.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:33: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-29T06:33:58.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:33:58.168 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:33:58.176 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:33:58.176 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:34:00.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-29T06:34:00.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:34:00.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:34:00.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:34:00.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:34:00.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:34:00.646 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:34:00.647 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:34:00.647 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:34:00.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:34:00.648 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:34:00.648 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:34:00.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:34:00.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:34:00.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:34:00.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:34:00.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:34:00.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:34:00.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:34:00.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:34:00.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:34:00.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:34:00.967 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:34:00.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:34:01.035 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:33:48
2026-05-29T06:34:01.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71134, datetime.datetime(2026, 5, 29, 6, 33, 48), datetime.datetime(2026, 5, 29, 6, 33, 48), 'salt', 6.72, 78.8, None, 15.88, 82.36, 3.41, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:34:01.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:34:01.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:34:01.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:48, diff=13.042422s, valid=True
2026-05-29T06:34:01.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:34:01.042 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:34:01.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:12, diff=-10.954114s, valid=True
2026-05-29T06:34:01.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:34:01.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:34:01.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:33:47, diff=14.053963s, valid=True
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:34:01.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:34:01.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:12, diff=-10.942344s, valid=True
2026-05-29T06:34:01.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:34:01.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:34:01.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:34:01.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961883.058443s, valid=True
2026-05-29T06:34:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:34:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:34:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:34:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:34:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:34:01.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:34:01.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:34:01.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:34:01.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:34:01.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:34:01.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:34:01.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:34:01.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:34:01.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:34:01.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:34:01.959 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:34:02.059 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:34:02.059 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:34:02.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-29T06:34:02.060 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:34:02.267 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:34:02.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:34:32.275 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:34:32.275 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:34:32.275 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:34:32.431 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:34:32.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:34:32.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:34:32.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-29T06:34:32.717 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:34:32.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-29T06:34:32.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:34:32.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:34:32.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:34:32.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-29T06:34:35.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-29T06:34:35.170 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:34:35.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:34:35.179 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:34:35.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:34:35.190 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:34:35.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:34:35.203 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:34:35.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:34:35.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:34:35.204 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:34:35.204 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:34:35.211 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:34:35.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:34:35.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:34:35.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:34:35.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:34:35.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:34:35.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:34:35.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:34:35.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:34:35.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:34:35.524 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:34:35.524 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:34:35.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:34:18
2026-05-29T06:34:35.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71135, datetime.datetime(2026, 5, 29, 6, 34, 18), datetime.datetime(2026, 5, 29, 6, 34, 18), 'salt', 6.69, 78.63, None, 16.16, 83.18, 3.44, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:34:35.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:34:35.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:34:35.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:18, diff=17.589817s, valid=True
2026-05-29T06:34:35.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:34:35.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:34:35.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:12, diff=23.593164s, valid=True
2026-05-29T06:34:35.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:34:35.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:34:35.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:17, diff=18.600884s, valid=True
2026-05-29T06:34:35.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:34:35.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:34:35.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:34:35.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:34:35.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:34:35.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:34:35.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:12, diff=23.604499s, valid=True
2026-05-29T06:34:35.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:34:35.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:34:35.604 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:34:35.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961917.6053s, valid=True
2026-05-29T06:34:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:34:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:34:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:34:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:34:35.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:34:35.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:34:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:34:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:34:35.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:34:35.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:34:35.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:34:35.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:34:35.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:34:35.926 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:34:36.152 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:34:36.494 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:34:36.593 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:34:36.593 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:34:36.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-29T06:34:36.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-29T06:34:36.792 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:34:36.793 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:35:06.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:35:06.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:35:06.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:35:07.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:35:07.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:35:07.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:35:07.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-29T06:35:07.529 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:35:07.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-29T06:35:07.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:35:07.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:35:07.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:35:07.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-29T06:35:10.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-29T06:35:10.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:35:10.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:35:10.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:35:10.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:35:10.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:35:10.726 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:35:10.727 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:35:10.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:35:10.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:35:10.727 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:35:10.727 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:35:10.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:35:10.815 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:35:10.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:35:10.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:35:10.910 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:35:10.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:35:10.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:35:10.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:35:10.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:35:10.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:35:10.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:35:10.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:35:11.054 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:34:48
2026-05-29T06:35:11.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71136, datetime.datetime(2026, 5, 29, 6, 34, 48), datetime.datetime(2026, 5, 29, 6, 34, 48), 'salt', 6.69, 78.53, None, 16.2, 83.01, 3.46, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:35:11.054 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:35:11.054 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:35:11.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:48, diff=23.060809s, valid=True
2026-05-29T06:35:11.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:35:11.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:35:11.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:12, diff=-0.9361s, valid=True
2026-05-29T06:35:11.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:35:11.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:34:47, diff=24.071065s, valid=True
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:35:11.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:35:11.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:12, diff=-0.925655s, valid=True
2026-05-29T06:35:11.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:35:11.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:35:11.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:35:11.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961953.075062s, valid=True
2026-05-29T06:35:11.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:35:11.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:35:11.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:35:11.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:35:11.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:35:11.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:35:11.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:35:11.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:35:11.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:35:11.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:35:11.276 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:35:11.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:35:11.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:35:11.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:35:11.600 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:35:11.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:35:12.089 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:35:12.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:35:12.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-29T06:35:12.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-29T06:35:12.351 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:35:12.351 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:35:42.361 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:35:42.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:35:42.362 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:35:42.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:35:42.533 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:35:42.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:35:42.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:35:42.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:35:42.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-29T06:35:42.757 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:35:42.757 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:35:42.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:35: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-29T06:35:45.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-29T06:35:45.186 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:35:45.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:35:45.190 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:35:45.191 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:35:45.199 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:35:45.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:35:45.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:35:45.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:35:45.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:35:45.211 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:35:45.211 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:35:45.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:35:45.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:35:45.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:35:45.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:35:45.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:35:45.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:35:45.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:35:45.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:35:45.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:35:45.522 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:35:45.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:35:45.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:35:45.584 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:35:19
2026-05-29T06:35:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71137, datetime.datetime(2026, 5, 29, 6, 35, 19), datetime.datetime(2026, 5, 29, 6, 35, 18), 'salt', 6.69, 78.56, None, 16.27, 81.42, 3.46, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:35:45.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:35:45.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:35:45.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:18, diff=27.591151s, valid=True
2026-05-29T06:35:45.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:35:45.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:35:45.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:12, diff=33.594545s, valid=True
2026-05-29T06:35:45.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:35:45.594 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:17, diff=28.602307s, valid=True
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:35:45.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:35:45.605 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:35:12, diff=33.605895s, valid=True
2026-05-29T06:35:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:35:45.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:35:45.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:35:45.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=961987.606719s, valid=True
2026-05-29T06:35:45.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:35:45.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:35:45.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:35:45.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:35:45.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:35:45.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:35:45.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:35:45.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:35:45.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:35:45.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:35:45.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:35:45.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:35:45.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:35:45.927 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:35:46.129 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:35:46.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:35:46.570 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:35:46.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:35:46.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-29T06:35:46.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-29T06:35:46.814 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:35:46.814 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:36:16.844 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:36:16.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:36:16.845 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:36:17.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:36:17.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:36:17.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:36:17.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-29T06:36:17.384 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:36:17.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-29T06:36:17.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:36:17.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:36:17.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:36:17.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-29T06:36:19.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-29T06:36:19.836 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:36:19.840 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:36:19.840 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:36:19.840 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:36:19.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:36:19.860 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:36:19.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:36:19.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:36:19.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:36:19.861 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:36:19.861 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:36:19.867 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:36:19.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:36:19.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:36:20.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:36:20.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:36:20.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:36:20.086 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:36:20.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:36:20.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:36:20.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:36:20.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:36:20.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:36:20.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:36:19
2026-05-29T06:36:20.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71139, datetime.datetime(2026, 5, 29, 6, 36, 19), datetime.datetime(2026, 5, 29, 6, 36, 19), 'salt', 6.76, 78.3, None, 15.84, 82.36, 3.51, 832.19, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:36:20.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:36:20.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:36:20.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:19, diff=1.199173s, valid=True
2026-05-29T06:36:20.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:36:20.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:36:20.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:12, diff=8.202369s, valid=True
2026-05-29T06:36:20.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:36:20.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:36:20.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:18, diff=2.20981s, valid=True
2026-05-29T06:36:20.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:36:20.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:36:20.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:36:20.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:36:20.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:36:20.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:36:20.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:12, diff=8.21324s, valid=True
2026-05-29T06:36:20.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:36:20.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:36:20.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:36:20.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962022.214001s, valid=True
2026-05-29T06:36:20.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:36:20.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:36:20.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:36:20.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:36:20.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:36:20.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:36:20.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:36:20.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:36:20.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:36:20.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:36:20.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:36:20.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:36:20.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:36:20.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:36:20.733 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:36:21.141 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:36:21.241 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:36:21.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:36:21.241 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:36:21.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-29T06:36:21.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:36:21.440 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:36:51.467 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:36:51.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:36:51.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:36:52.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:36:52.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:36:52.309 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:36: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-29T06:36:52.326 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:36:52.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-29T06:36:52.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:36:52.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:36:52.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:36:52.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-29T06:36:55.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-29T06:36:55.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:36:55.708 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:36:55.709 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:36:55.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:36:55.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:36:55.731 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:36:55.731 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:36:55.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:36:55.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:36:55.733 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:36:55.733 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:36:55.739 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:36:55.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:36:55.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:36:55.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:36:55.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:36:56.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:36:56.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:36:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:36:56.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:36:56.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:36:56.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:36:56.068 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:36:56.132 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:36:49
2026-05-29T06:36:56.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71140, datetime.datetime(2026, 5, 29, 6, 36, 49), datetime.datetime(2026, 5, 29, 6, 36, 49), 'salt', 6.76, 78.23, None, 15.84, 83.15, 3.52, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:36:56.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:36:56.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:36:56.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:49, diff=7.139922s, valid=True
2026-05-29T06:36:56.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:36:56.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:36:56.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:12, diff=-15.856723s, valid=True
2026-05-29T06:36:56.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:36:56.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:36:48, diff=8.151133s, valid=True
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:36:56.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:36:56.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:12, diff=-15.845252s, valid=True
2026-05-29T06:36:56.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:36:56.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:36:56.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:36:56.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962058.155534s, valid=True
2026-05-29T06:36:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:36:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:36:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:36:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:36:56.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:36:56.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:36:56.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:36:56.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:36:56.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:36:56.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:36:56.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:36:56.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:36:56.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:36:56.476 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:36:56.670 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:36:56.997 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:36:57.095 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:36:57.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:36:57.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-29T06:36:57.095 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:36:57.251 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:36:57.252 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:37:27.282 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:37:27.282 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:37:27.282 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:37:27.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:37:27.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:37:27.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:37:27.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:37:27.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:37:27.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-29T06:37:27.846 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:37:27.846 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:37:27.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:37:27.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-29T06:37:30.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-29T06:37:30.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:37:30.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:37:30.376 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:37:30.376 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:37:30.385 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:37:30.396 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:37:30.397 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:37:30.397 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:37:30.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:37:30.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:37:30.397 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:37:30.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:37:30.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:37:30.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:37:30.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:37:30.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:37:30.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:37:30.610 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:37:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:37:30.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:37:30.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:37:30.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:37:30.652 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:37:30.710 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:37:20
2026-05-29T06:37:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71141, datetime.datetime(2026, 5, 29, 6, 37, 20), datetime.datetime(2026, 5, 29, 6, 37, 19), 'salt', 6.76, 78.16, None, 16.23, 82.05, 3.53, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:37:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:37:30.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:37:30.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:19, diff=11.717271s, valid=True
2026-05-29T06:37:30.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:37:30.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:37:30.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:12, diff=18.720662s, valid=True
2026-05-29T06:37:30.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:37:30.720 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:19, diff=11.728139s, valid=True
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:37:30.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:37:30.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:12, diff=18.731482s, valid=True
2026-05-29T06:37:30.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:37:30.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:37:30.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:37:30.732 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962092.732234s, valid=True
2026-05-29T06:37:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:37:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:37:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:37:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:37:30.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:37:30.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:37:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:37:30.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:37:30.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:37:30.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:37:31.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:37:31.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:37:31.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:37:31.236 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:37:31.523 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:37:31.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:37:31.951 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:37:31.951 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:37:31.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-29T06:37:31.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-29T06:37:32.160 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:37:32.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:38:02.190 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:38:02.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:38:02.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:38:02.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:38:02.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:38:02.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:38:02.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-29T06:38:02.929 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:38:02.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-29T06:38:02.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:38:02.944 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:38:02.948 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:38:02.948 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:38:05.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-29T06:38:05.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:38:05.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:38:05.295 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:38:05.295 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:38:05.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:38:05.318 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:38:05.319 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:38:05.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:38:05.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:38:05.320 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:38:05.320 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:38:05.326 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:38:05.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:38:05.454 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:38:05.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:38:05.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:38:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:38:05.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:38:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:38:05.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:38:05.639 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:38:05.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:38:05.640 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:38:05.700 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:37:50
2026-05-29T06:38:05.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71142, datetime.datetime(2026, 5, 29, 6, 37, 50), datetime.datetime(2026, 5, 29, 6, 37, 50), 'salt', 6.72, 78.03, None, 16.8, 83.98, 3.55, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:38:05.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:38:05.700 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:38:05.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:50, diff=15.707716s, valid=True
2026-05-29T06:38:05.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:38:05.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:38:05.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:12, diff=-6.288884s, valid=True
2026-05-29T06:38:05.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:38:05.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:37:49, diff=16.71906s, valid=True
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:38:05.719 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:38:05.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:12, diff=-6.277359s, valid=True
2026-05-29T06:38:05.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:38:05.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:38:05.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:38:05.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962127.723418s, valid=True
2026-05-29T06:38:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:38:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:38:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:38:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:38:05.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:38:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:38:05.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:38:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:38:05.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:38:05.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:38:05.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:38:05.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:38:06.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:38:06.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:38:06.241 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:38:06.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:38:06.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:38:06.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:38:06.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-29T06:38:06.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-29T06:38:06.759 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:38:06.759 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:38:36.779 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:38:36.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:38:36.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:38:37.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:38:37.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:38:37.315 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:38:37.315 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:38:37.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:38:37.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-29T06:38:37.341 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:38:37.341 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:38:37.345 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:38:37.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-29T06:38:39.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-29T06:38:39.729 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:38:39.736 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:38:39.737 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:38:39.737 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:38:39.747 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:38:39.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:38:39.760 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:38:39.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:38:39.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:38:39.761 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:38:39.761 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:38:39.767 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:38:39.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:38:39.863 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:38:39.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:38:39.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:38:39.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:38:39.999 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:38:40.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:38:40.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:38:40.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:38:40.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:38:40.047 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:38:40.107 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:38:20
2026-05-29T06:38:40.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71143, datetime.datetime(2026, 5, 29, 6, 38, 20), datetime.datetime(2026, 5, 29, 6, 38, 20), 'salt', 6.72, 77.87, None, 16.3, 84.7, 3.58, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:38:40.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:38:40.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:38:40.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:20, diff=20.113338s, valid=True
2026-05-29T06:38:40.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:38:40.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:38:40.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:12, diff=28.116749s, valid=True
2026-05-29T06:38:40.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:38:40.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:38:40.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:19, diff=21.124816s, valid=True
2026-05-29T06:38:40.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:38:40.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:38:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:38:40.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:38:40.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:38:40.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:38:40.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:12, diff=28.127968s, valid=True
2026-05-29T06:38:40.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:38:40.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:38:40.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:38:40.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962162.128671s, valid=True
2026-05-29T06:38:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:38:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:38:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:38:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:38:40.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:38:40.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:38:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:38:40.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:38:40.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:38:40.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:38:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:38:40.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:38:40.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:38:40.585 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:38:40.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:38:41.109 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:38:41.207 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:38:41.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:38:41.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-29T06:38:41.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-29T06:38:41.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:38:41.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:39:11.424 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:39:11.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:39:11.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:39:11.699 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:39:11.706 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:39:11.893 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:39:11.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-29T06:39:11.910 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:39:11.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-29T06:39:11.923 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:39:11.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:39:11.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:39:11.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-29T06:39:14.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-29T06:39:14.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:39:14.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:39:14.264 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:39:14.264 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:39:14.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:39:14.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:39:14.285 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:39:14.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:39:14.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:39:14.286 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:39:14.286 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:39:14.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:39:14.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:39:14.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:39:14.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:39:14.505 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:39:14.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:39:14.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:39:14.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:39:14.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:39:14.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:39:14.596 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:39:14.597 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:39:14.659 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:38:50
2026-05-29T06:39:14.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71144, datetime.datetime(2026, 5, 29, 6, 38, 50), datetime.datetime(2026, 5, 29, 6, 38, 50), 'salt', 6.59, 77.9, None, 16.8, 86.0, 3.57, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:39:14.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:39:14.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:39:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:50, diff=24.667068s, valid=True
2026-05-29T06:39:14.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:39:14.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:39:14.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:12, diff=2.670436s, valid=True
2026-05-29T06:39:14.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:39:14.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:38:49, diff=25.678331s, valid=True
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:39:14.678 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:39:14.681 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:12, diff=2.681897s, valid=True
2026-05-29T06:39:14.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:39:14.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:39:14.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:39:14.682 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962196.682691s, valid=True
2026-05-29T06:39:14.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:39:14.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:39:14.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:39:14.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:39:14.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:39:14.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:39:14.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:39:14.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:39:14.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:39:14.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:39:14.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:39:14.917 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:39:14.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:39:15.006 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:39:15.207 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:39:15.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:39:15.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:39:15.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:39:15.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:39:15.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:39:15.869 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:39:15.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:39:45.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:39:45.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:39:45.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:39:46.376 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:39:46.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:39:46.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:39:46.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-29T06:39:46.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:39:46.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-29T06:39:46.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:39:46.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:39:46.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:39:46.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-29T06:39:49.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-29T06:39:49.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:39:49.047 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:39:49.047 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:39:49.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:39:49.057 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:39:49.069 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:39:49.070 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:39:49.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:39:49.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:39:49.071 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:39:49.071 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:39:49.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:39:49.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:39:49.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:39:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:39:49.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:39:49.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:39:49.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:39:49.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:39:49.357 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:39:49.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:39:49.362 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:39:49.362 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:39:49.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:39:21
2026-05-29T06:39:49.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71145, datetime.datetime(2026, 5, 29, 6, 39, 21), datetime.datetime(2026, 5, 29, 6, 39, 20), 'salt', 6.69, 78.0, None, 16.16, 84.92, 3.56, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:39:49.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:39:49.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:39:49.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:20, diff=29.428099s, valid=True
2026-05-29T06:39:49.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:39:49.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:39:49.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:12, diff=37.431292s, valid=True
2026-05-29T06:39:49.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:39:49.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:39:49.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:19, diff=30.438814s, valid=True
2026-05-29T06:39:49.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:39:49.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:39:49.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:39:49.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:39:49.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:39:49.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:39:49.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:39:12, diff=37.442133s, valid=True
2026-05-29T06:39:49.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:39:49.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:39:49.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:39:49.442 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962231.44288s, valid=True
2026-05-29T06:39:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:39:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:39:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:39:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:39:49.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:39:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:39:49.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:39:49.507 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:39:49.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:39:49.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:39:49.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:39:49.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:39:49.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:39:49.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:39:50.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:39:50.382 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:39:50.480 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:39:50.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:39:50.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-29T06:39:50.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-29T06:39:50.670 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:39:50.670 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:40:20.671 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:40:20.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:40:20.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:40:20.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:40:20.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:40:21.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:40:21.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-29T06:40:21.202 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:40:21.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-29T06:40:21.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:40:21.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:40:21.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:40:21.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-29T06:40:23.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-29T06:40:23.691 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:40:23.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:40:23.697 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:40:23.697 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:40:23.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:40:23.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:40:23.718 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:40:23.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:40:23.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:40:23.719 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:40:23.719 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:40:23.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:40:23.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:40:23.808 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:40:23.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:40:23.899 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:40:23.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:40:23.943 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:40:23.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:40:23.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:40:23.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:40:23.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:40:23.983 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:40:24.057 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:40:21
2026-05-29T06:40:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71147, datetime.datetime(2026, 5, 29, 6, 40, 21), datetime.datetime(2026, 5, 29, 6, 40, 21), 'salt', 6.69, 77.87, None, 17.29, 86.02, 3.58, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:40:24.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:40:24.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:40:24.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:21, diff=3.064057s, valid=True
2026-05-29T06:40:24.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:40:24.064 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:40:24.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:12, diff=12.067097s, valid=True
2026-05-29T06:40:24.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:40:24.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:20, diff=4.074239s, valid=True
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:40:24.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:40:24.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:12, diff=12.077501s, valid=True
2026-05-29T06:40:24.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:40:24.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:40:24.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:40:24.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962266.078229s, valid=True
2026-05-29T06:40:24.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:40:24.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:40:24.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:40:24.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:40:24.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:40:24.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:40:24.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:40:24.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:40:24.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:40:24.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:40:24.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:40:24.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:40:24.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:40:24.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:40:24.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:40:25.027 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:40:25.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:40:25.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:40:25.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-29T06:40:25.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-29T06:40:25.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:40:25.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:40:55.353 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:40:55.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:40:55.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:40:55.463 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:40:55.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:40:55.655 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:40:55.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-29T06:40:55.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:40:55.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-29T06:40:55.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:40:55.683 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:40:55.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:40:55.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-29T06:40:58.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-29T06:40:58.026 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:40:58.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:40:58.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:40:58.035 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:40:58.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:40:58.058 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:40:58.059 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:40:58.060 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:40:58.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:40:58.060 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:40:58.060 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:40:58.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:40:58.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:40:58.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:40:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:40:58.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:40:58.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:40:58.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:40:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:40:58.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:40:58.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:40:58.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:40:58.424 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:40:58.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:40:52
2026-05-29T06:40:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71148, datetime.datetime(2026, 5, 29, 6, 40, 52), datetime.datetime(2026, 5, 29, 6, 40, 51), 'salt', 6.76, 77.7, None, 15.24, 93.79, 3.62, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:40:58.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:40:58.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:40:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:51, diff=7.50147s, valid=True
2026-05-29T06:40:58.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:40:58.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:40:58.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:12, diff=-13.495735s, valid=True
2026-05-29T06:40:58.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:40:58.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:40:58.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:40:50, diff=8.510838s, valid=True
2026-05-29T06:40:58.510 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:40:58.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:40:58.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:40:58.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:40:58.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:40:58.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:40:58.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:12, diff=-13.486162s, valid=True
2026-05-29T06:40:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:40:58.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:40:58.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:40:58.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962300.514493s, valid=True
2026-05-29T06:40:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:40:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:40:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:40:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:40:58.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:40:58.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:40:58.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:40:58.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:40:58.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:40:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:40:58.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:40:58.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:40:58.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:40:58.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:40:59.030 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:40:59.360 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:40:59.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:40:59.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:40:59.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-29T06:40:59.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-29T06:40:59.661 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:40:59.661 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:41:29.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:41:29.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:41:29.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:41:30.127 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:41:30.207 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:41:30.415 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:41:30.415 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:41:30.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:41:30.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-29T06:41:30.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:41:30.440 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:41:30.445 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:41:30.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-29T06:41:34.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:41:34.127 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:41:34.134 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:41:34.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:41:34.135 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:41:34.145 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:41:34.158 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:41:34.158 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:41:34.159 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:41:34.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:41:34.159 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:41:34.160 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:41:34.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:41:34.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:41:34.298 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:41:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:41:34.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:41:34.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:41:34.443 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:41:34.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:41:34.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:41:34.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:41:34.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:41:34.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:41:34.554 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:41:22
2026-05-29T06:41:34.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71149, datetime.datetime(2026, 5, 29, 6, 41, 22), datetime.datetime(2026, 5, 29, 6, 41, 21), 'salt', 6.69, 77.7, None, 16.23, 91.7, 3.61, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:41:34.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:41:34.554 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:41:34.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:21, diff=13.561712s, valid=True
2026-05-29T06:41:34.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:41:34.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:41:34.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:12, diff=22.565115s, valid=True
2026-05-29T06:41:34.565 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:41:34.565 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:41:34.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:20, diff=14.57291s, valid=True
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:41:34.573 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:41:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:12, diff=22.576541s, valid=True
2026-05-29T06:41:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:41:34.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:41:34.576 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:41:34.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962336.577357s, valid=True
2026-05-29T06:41:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:41:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:41:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:41:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:41:34.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:41:34.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:41:34.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:41:34.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:41:34.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:41:34.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:41:34.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:41:34.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:41:34.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:41:34.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:41:35.102 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:41:35.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:41:35.531 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:41:35.531 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:41:35.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-29T06:41:35.532 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:41:36.086 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:41:36.086 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:42:06.116 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:42:06.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:42:06.117 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:42:06.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:42:06.288 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:42:06.544 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:42:06.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-29T06:42:06.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:42:06.559 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:42:06.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:42:06.573 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:42:06.578 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:42:06.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:42:10.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:42:10.202 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:42:10.210 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:42:10.211 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:42:10.211 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:42:10.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:42:10.234 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:42:10.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:42:10.235 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:42:10.235 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:42:10.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:42:10.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:42:10.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:42:10.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:42:10.375 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:42:10.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:42:10.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:42:10.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:42:10.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:42:10.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:42:10.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:42:10.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:42:10.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:42:10.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:42:10.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:41:52
2026-05-29T06:42:10.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71150, datetime.datetime(2026, 5, 29, 6, 41, 52), datetime.datetime(2026, 5, 29, 6, 41, 51), 'salt', 6.66, 78.13, None, 16.48, 87.83, 3.54, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:42:10.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:42:10.635 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:42:10.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:51, diff=19.642591s, valid=True
2026-05-29T06:42:10.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:42:10.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:42:10.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:12, diff=-1.354086s, valid=True
2026-05-29T06:42:10.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:42:10.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:42:10.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:41:52, diff=18.653585s, valid=True
2026-05-29T06:42:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:42:10.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:42:10.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:42:10.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:42:10.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:42:10.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:42:10.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:12, diff=-1.342852s, valid=True
2026-05-29T06:42:10.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:42:10.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:42:10.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:42:10.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962372.657941s, valid=True
2026-05-29T06:42:10.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:42:10.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:42:10.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:42:10.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:42:10.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:42:10.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:42:10.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:42:10.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:42:10.742 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:42:10.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:42:10.856 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:42:10.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:42:10.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:42:10.979 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:42:11.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:42:11.504 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:42:11.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:42:11.602 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:42:11.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:42:11.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:42:11.756 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:42:11.756 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:42:41.768 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:42:41.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:42:41.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:42:42.090 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:42:42.108 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:42:42.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:42:42.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-29T06:42:42.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:42:42.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-29T06:42:42.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:42:42.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:42:42.365 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:42:42.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-29T06:42:45.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:42:45.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:42:45.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:42:45.414 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:42:45.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:42:45.424 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:42:45.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:42:45.436 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:42:45.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:42:45.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:42:45.437 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:42:45.437 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:42:45.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:42:45.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:42:45.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:42:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:42:45.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:42:45.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:42:45.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:42:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:42:45.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:42:45.740 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:42:45.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:42:45.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:42:45.807 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:42:22
2026-05-29T06:42:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71151, datetime.datetime(2026, 5, 29, 6, 42, 22), datetime.datetime(2026, 5, 29, 6, 42, 21), 'salt', 6.62, 78.43, None, 15.99, 89.14, 3.47, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:42:45.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:42:45.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:42:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:21, diff=24.814564s, valid=True
2026-05-29T06:42:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:42:45.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:42:45.817 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:12, diff=33.817862s, valid=True
2026-05-29T06:42:45.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:42:45.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:42:45.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:21, diff=24.82553s, valid=True
2026-05-29T06:42:45.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:42:45.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:42:45.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:42:45.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:42:45.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:42:45.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:42:45.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:12, diff=33.829024s, valid=True
2026-05-29T06:42:45.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:42:45.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:42:45.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:42:45.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962407.829808s, valid=True
2026-05-29T06:42:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:42:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:42:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:42:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:42:45.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:42:45.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:42:45.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:42:45.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:42:45.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:42:45.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:42:46.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:42:46.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:42:46.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:42:46.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:42:46.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:42:46.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:42:46.834 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:42:46.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:42:46.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-29T06:42:46.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-29T06:42:47.034 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:42:47.034 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:43:17.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:43:17.043 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:43:17.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:43:17.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:43:17.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:43:17.425 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:43:17.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-29T06:43:17.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:43:17.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-29T06:43:17.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:43:17.454 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:43:17.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:43:17.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-29T06:43:20.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-29T06:43:20.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:43:20.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:43:20.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:43:20.524 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:43:20.535 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:43:20.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:43:20.548 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:43:20.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:43:20.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:43:20.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:43:20.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:43:20.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:43:20.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:43:20.684 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:43:20.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:43:20.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:43:20.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:43:20.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:43:20.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:43:20.877 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:43:20.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:43:20.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:43:20.883 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:43:20.943 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:42:53
2026-05-29T06:43:20.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71152, datetime.datetime(2026, 5, 29, 6, 42, 53), datetime.datetime(2026, 5, 29, 6, 42, 52), 'salt', 6.59, 78.89, None, 16.23, 88.84, 3.39, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:43:20.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:43:20.943 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:43:20.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:52, diff=28.950719s, valid=True
2026-05-29T06:43:20.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:43:20.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:43:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:43:12, diff=8.954091s, valid=True
2026-05-29T06:43:20.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:43:20.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:43:20.961 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:42:51, diff=29.961874s, valid=True
2026-05-29T06:43:20.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:43:20.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:43:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:43:20.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:43:20.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:43:20.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:43:20.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:43:12, diff=8.965429s, valid=True
2026-05-29T06:43:20.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:43:20.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:43:20.965 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:43:20.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962442.966239s, valid=True
2026-05-29T06:43:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:43:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:43:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:43:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:43:20.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:43:21.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:43:21.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:43:21.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:43:21.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:43:21.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:43:21.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:43:21.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:43:21.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:43:21.289 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:43:21.485 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:43:21.813 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:43:21.911 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:43:21.911 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:43:21.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-29T06:43:21.911 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:43:22.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:43:22.112 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:43:52.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:43:52.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:43:52.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:43:52.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:43:52.298 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:43:52.502 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:43:52.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-29T06:43:52.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:43:52.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-29T06:43:52.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:43:52.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:43:52.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:43:52.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-29T06:43:55.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-29T06:43:55.965 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:43:55.972 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:43:55.973 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:43:55.973 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:43:55.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:43:55.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:43:55.995 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:43:55.996 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:43:55.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:43:55.996 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:43:55.997 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:43:56.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:43:56.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:43:56.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:43:56.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:43:56.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:43:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:43:56.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:43:56.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:43:56.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:43:56.321 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:43:56.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:43:56.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:43:56.382 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:43:53
2026-05-29T06:43:56.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71154, datetime.datetime(2026, 5, 29, 6, 43, 53), datetime.datetime(2026, 5, 29, 6, 43, 53), 'salt', 6.39, 79.39, None, 17.29, 88.91, 3.3, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:43:56.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:43:56.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:43:56.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:43:53, diff=3.389264s, valid=True
2026-05-29T06:43:56.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:43:56.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:43:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:12, diff=-15.60734s, valid=True
2026-05-29T06:43:56.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:43:56.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:43:51, diff=5.40051s, valid=True
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:43:56.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:43:56.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:43:56.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:12, diff=-15.595862s, valid=True
2026-05-29T06:43:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:43:56.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:43:56.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:43:56.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962478.404923s, valid=True
2026-05-29T06:43:56.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:43:56.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:43:56.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:43:56.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:43:56.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:43:56.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:43:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:43:56.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:43:56.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:43:56.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:43:56.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:43:56.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:43:56.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:43:56.726 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:43:56.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:43:57.322 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:43:57.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:43:57.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:43:57.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-29T06:43:57.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-29T06:43:57.613 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:43:57.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:44:27.643 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:44:27.643 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:44:27.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:44:27.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:44:27.815 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:44:28.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:44:28.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-29T06:44:28.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:44:28.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-29T06:44:28.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:44:28.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:44:28.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:44:28.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-29T06:44:31.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-29T06:44:31.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:44:31.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:44:31.279 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:44:31.279 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:44:31.290 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:44:31.305 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:44:31.306 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:44:31.306 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:44:31.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:44:31.307 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:44:31.307 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:44:31.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:44:31.441 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:44:31.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:44:31.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:44:31.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:44:31.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:44:31.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:44:31.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:44:31.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:44:31.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:44:31.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:44:31.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:44:31.695 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:44:23
2026-05-29T06:44:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71155, datetime.datetime(2026, 5, 29, 6, 44, 23), datetime.datetime(2026, 5, 29, 6, 44, 23), 'salt', 6.56, 79.56, None, 17.01, 88.39, 3.28, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:44:31.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:44:31.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:44:31.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:23, diff=8.702639s, valid=True
2026-05-29T06:44:31.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:44:31.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:44:31.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:12, diff=19.706115s, valid=True
2026-05-29T06:44:31.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:44:31.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:22, diff=9.714175s, valid=True
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:44:31.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:44:31.717 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:12, diff=19.71782s, valid=True
2026-05-29T06:44:31.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:44:31.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:44:31.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:44:31.718 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962513.718597s, valid=True
2026-05-29T06:44:31.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:44:31.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:44:31.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:44:31.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:44:31.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:44:31.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:44:31.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:44:31.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:44:31.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:44:31.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:44:31.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:44:31.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:44:32.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:44:32.042 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:44:32.236 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:44:32.563 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:44:32.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:44:32.660 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:44:32.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-29T06:44:32.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-29T06:44:32.876 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:44:32.876 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:45:02.905 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:45:02.905 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:45:02.905 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:45:03.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:45:03.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:45:03.418 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:45:03.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-29T06:45:03.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:45:03.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-29T06:45:03.444 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:45:03.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:45:03.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:45:03.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-29T06:45:06.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-29T06:45:06.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:45:06.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:45:06.324 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:45:06.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:45:06.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:45:06.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:45:06.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:45:06.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:45:06.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:45:06.360 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:45:06.360 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:45:06.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:45:06.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:45:06.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:45:06.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:45:06.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:45:06.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:45:06.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:45:06.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:45:06.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:45:06.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:45:06.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:45:06.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:45:06.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:44:54
2026-05-29T06:45:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71156, datetime.datetime(2026, 5, 29, 6, 44, 54), datetime.datetime(2026, 5, 29, 6, 44, 53), 'salt', 6.39, 79.23, None, 17.01, 89.94, 3.33, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:45:06.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:45:06.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:45:06.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:53, diff=13.756374s, valid=True
2026-05-29T06:45:06.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:45:06.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:45:06.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:12, diff=-5.240145s, valid=True
2026-05-29T06:45:06.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:45:06.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:45:06.767 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:44:52, diff=14.767795s, valid=True
2026-05-29T06:45:06.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:45:06.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:45:06.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:45:06.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:45:06.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:45:06.768 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:45:06.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:12, diff=-5.228579s, valid=True
2026-05-29T06:45:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:45:06.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:45:06.771 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:45:06.772 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962548.772213s, valid=True
2026-05-29T06:45:06.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:45:06.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:45:06.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:45:06.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:45:06.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:45:06.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:45:06.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:45:06.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:45:06.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:45:06.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:45:06.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:45:07.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:45:07.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:45:07.094 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:45:07.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:45:07.684 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:45:07.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:45:07.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:45:07.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-29T06:45:07.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-29T06:45:07.973 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:45:07.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:45:37.992 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:45:37.992 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:45:37.993 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:45:38.153 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:45:38.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:45:38.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:45: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-29T06:45:38.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:45:38.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-29T06:45:38.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:45:38.400 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:45:38.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:45:38.407 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:45:42.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-29T06:45:42.077 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:45:42.085 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:45:42.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:45:42.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:45:42.095 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:45:42.108 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:45:42.109 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:45:42.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:45:42.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:45:42.110 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:45:42.110 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:45:42.117 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:45:42.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:45:42.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:45:42.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:45:42.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:45:42.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:45:42.384 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:45:42.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:45:42.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:45:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:45:42.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:45:42.429 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:45:42.489 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:45:24
2026-05-29T06:45:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71157, datetime.datetime(2026, 5, 29, 6, 45, 24), datetime.datetime(2026, 5, 29, 6, 45, 23), 'salt', 6.56, 79.33, None, 16.94, 89.85, 3.32, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:45:42.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:45:42.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:45:42.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:23, diff=19.496493s, valid=True
2026-05-29T06:45:42.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:45:42.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:45:42.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:12, diff=30.499933s, valid=True
2026-05-29T06:45:42.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:45:42.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:45:42.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:22, diff=20.507947s, valid=True
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:45:42.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:45:42.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:12, diff=30.511564s, valid=True
2026-05-29T06:45:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:45:42.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:45:42.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:45:42.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962584.512377s, valid=True
2026-05-29T06:45:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:45:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:45:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:45:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:45:42.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:45:42.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:45:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:45:42.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:45:42.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:45:42.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:45:42.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:45:42.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:45:42.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:45:42.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:45:43.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:45:43.354 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:45:43.452 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:45:43.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:45:43.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-29T06:45:43.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-29T06:45:43.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:45:43.646 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:46:13.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:46:13.670 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:46:13.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:46:13.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:46:13.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:46:14.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:46:14.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-29T06:46:14.201 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:46:14.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-29T06:46:14.215 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:46:14.215 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:46:14.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:46: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-29T06:46:17.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-29T06:46:17.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:46:17.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:46:17.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:46:17.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:46:17.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:46:17.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:46:17.224 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:46:17.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:46:17.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:46:17.225 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:46:17.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:46:17.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:46:17.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:46:17.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:46:17.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:46:17.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:46:17.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:46:17.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:46:17.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:46:17.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:46:17.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:46:17.541 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:46:17.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:46:17.602 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:45:54
2026-05-29T06:46:17.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71158, datetime.datetime(2026, 5, 29, 6, 45, 54), datetime.datetime(2026, 5, 29, 6, 45, 54), 'salt', 6.49, 79.13, None, 16.16, 88.7, 3.35, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:46:17.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:46:17.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:46:17.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:54, diff=23.609653s, valid=True
2026-05-29T06:46:17.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:46:17.609 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:46:17.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:12, diff=5.613053s, valid=True
2026-05-29T06:46:17.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:46:17.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:45:53, diff=24.621007s, valid=True
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:46:17.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:46:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:12, diff=5.624608s, valid=True
2026-05-29T06:46:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:46:17.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:46:17.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:46:17.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962619.625398s, valid=True
2026-05-29T06:46:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:46:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:46:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:46:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:46:17.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:46:17.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:46:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:46:17.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:46:17.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:46:17.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:46:17.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:46:17.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:46:17.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:46:18.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:46:18.211 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:46:18.538 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:46:18.637 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:46:18.637 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:46:18.637 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:46:18.637 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:46:18.831 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:46:18.832 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:46:48.862 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:46:48.862 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:46:48.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:46:49.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:46:49.048 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:46:49.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:46:49.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-29T06:46:49.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:46:49.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-29T06:46:49.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:46:49.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:46:49.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:46:49.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-29T06:46:52.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-29T06:46:52.507 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:46:52.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:46:52.516 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:46:52.516 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:46:52.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:46:52.540 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:46:52.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:46:52.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:46:52.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:46:52.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:46:52.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:46:52.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:46:52.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:46:52.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:46:52.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:46:52.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:46:52.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:46:52.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:46:52.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:46:52.847 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:46:52.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:46:52.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:46:52.852 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:46:52.911 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:46:24
2026-05-29T06:46:52.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71159, datetime.datetime(2026, 5, 29, 6, 46, 24), datetime.datetime(2026, 5, 29, 6, 46, 24), 'salt', 6.49, 78.96, None, 16.73, 88.6, 3.38, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:46:52.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:46:52.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:46:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:24, diff=28.918507s, valid=True
2026-05-29T06:46:52.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:46:52.918 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:46:52.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:12, diff=40.922076s, valid=True
2026-05-29T06:46:52.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:46:52.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:23, diff=29.930121s, valid=True
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:46:52.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:46:52.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:46:12, diff=40.933723s, valid=True
2026-05-29T06:46:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:46:52.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:46:52.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:46:52.934 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962654.934505s, valid=True
2026-05-29T06:46:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:46:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:46:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:46:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:46:52.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:46:52.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:46:52.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:46:52.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:46:53.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:46:53.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:46:53.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:46:53.166 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:46:53.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:46:53.256 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:46:53.450 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:46:53.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:46:53.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:46:53.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:46:53.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-29T06:46:53.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-29T06:46:54.077 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:46:54.077 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:47:24.104 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:47:24.105 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:47:24.105 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:47:24.406 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:47:24.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:47:24.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:47:24.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-29T06:47:24.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:47:24.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-29T06:47:24.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:47:24.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:47:24.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:47:24.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:47:27.669 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:47:27.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:47:27.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:47:27.678 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:47:27.678 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:47:27.688 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:47:27.701 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:47:27.701 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:47:27.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:47:27.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:47:27.703 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:47:27.703 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:47:27.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:47:27.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:47:27.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:47:27.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:47:27.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:47:27.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:47:27.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:47:28.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:47:28.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:47:28.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:47:28.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:47:28.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:47:28.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:47:25
2026-05-29T06:47:28.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71161, datetime.datetime(2026, 5, 29, 6, 47, 25), datetime.datetime(2026, 5, 29, 6, 47, 24), 'salt', 6.49, 78.43, None, 16.55, 90.36, 3.47, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:47:28.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:47:28.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:47:28.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:24, diff=4.097483s, valid=True
2026-05-29T06:47:28.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:47:28.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:47:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:12, diff=16.101089s, valid=True
2026-05-29T06:47:28.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:47:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:23, diff=5.109273s, valid=True
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:47:28.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:47:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:12, diff=16.113119s, valid=True
2026-05-29T06:47:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:47:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:47:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:47:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962690.113965s, valid=True
2026-05-29T06:47:28.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:47:28.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:47:28.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:47:28.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:47:28.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:47:28.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:47:28.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:47:28.181 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:47:28.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:47:28.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:47:28.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:47:28.421 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:47:28.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:47:28.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:47:28.716 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:47:29.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:47:29.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:47:29.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:47:29.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-29T06:47:29.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-29T06:47:29.345 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:47:29.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:47:59.346 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:47:59.346 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:47:59.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:47:59.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:47:59.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:47:59.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:47: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-29T06:47:59.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:47:59.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-29T06:47:59.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:47:59.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:47:59.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:47:59.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-29T06:48:02.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-29T06:48:02.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:48:02.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:48:02.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:48:02.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:48:02.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:48:02.712 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:48:02.713 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:48:02.713 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:48:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:48:02.714 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:48:02.714 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:48:02.721 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:48:02.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:48:02.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:48:02.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:48:02.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:48:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:48:02.990 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:48:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:48:03.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:48:03.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:48:03.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:48:03.036 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:48:03.096 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:47:55
2026-05-29T06:48:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71162, datetime.datetime(2026, 5, 29, 6, 47, 55), datetime.datetime(2026, 5, 29, 6, 47, 55), 'salt', 6.52, 78.5, None, 16.48, 91.37, 3.46, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:48:03.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:48:03.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:48:03.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:55, diff=8.103753s, valid=True
2026-05-29T06:48:03.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:48:03.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:48:03.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:12, diff=-8.892793s, valid=True
2026-05-29T06:48:03.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:48:03.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:47:53, diff=10.115157s, valid=True
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:48:03.115 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:48:03.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:12, diff=-8.881155s, valid=True
2026-05-29T06:48:03.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:48:03.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:48:03.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:48:03.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962725.119666s, valid=True
2026-05-29T06:48:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:48:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:48:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:48:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:48:03.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:48:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:48:03.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:48:03.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:48:03.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:48:03.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:48:03.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:48:03.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:48:03.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:48:03.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:48:03.637 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:48:03.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:48:04.065 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:48:04.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:48:04.065 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:48:04.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-29T06:48:04.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:48:04.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:48:34.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:48:34.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:48:34.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:48:34.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:48:34.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:48:34.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:48:34.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:48:34.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:48: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-29T06:48:34.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:48:34.823 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:48:34.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:48: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-29T06:48:37.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-29T06:48:37.986 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:48:37.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:48:37.994 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:48:37.994 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:48:38.006 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:48:38.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:48:38.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:48:38.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:48:38.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:48:38.021 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:48:38.021 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:48:38.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:48:38.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:48:38.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:48:38.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:48:38.253 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:48:38.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:48:38.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:48:38.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:48:38.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:48:38.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:48:38.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:48:38.344 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:48:38.406 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:48:25
2026-05-29T06:48:38.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71163, datetime.datetime(2026, 5, 29, 6, 48, 25), datetime.datetime(2026, 5, 29, 6, 48, 25), 'salt', 6.56, 78.5, None, 16.06, 91.3, 3.47, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:48:38.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:48:38.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:48:38.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:25, diff=13.413958s, valid=True
2026-05-29T06:48:38.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:48:38.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:48:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:12, diff=26.417375s, valid=True
2026-05-29T06:48:38.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:48:38.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:23, diff=15.425246s, valid=True
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:48:38.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:48:38.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:12, diff=26.428859s, valid=True
2026-05-29T06:48:38.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:48:38.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:48:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:48:38.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962760.429645s, valid=True
2026-05-29T06:48:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:48:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:48:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:48:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:48:38.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:48:38.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:48:38.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:48:38.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:48:38.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:48:38.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:48:38.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:48:38.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:48:38.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:48:38.816 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:48:39.016 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:48:39.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:48:39.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:48:39.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:48:39.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-29T06:48:39.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-29T06:48:39.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:48:39.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:49:09.665 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:49:09.665 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:49:09.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:49:09.930 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:49:09.937 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:49:10.139 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:49:10.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-29T06:49:10.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:49:10.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-29T06:49:10.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:49:10.167 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:49:10.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:49:10.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-29T06:49:13.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-29T06:49:13.909 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:49:13.917 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:49:13.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:49:13.918 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:49:13.929 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:49:13.942 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:49:13.942 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:49:13.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:49:13.943 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:49:13.943 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:49:13.943 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:49:13.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:49:14.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:49:14.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:49:14.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:49:14.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:49:14.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:49:14.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:49:14.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:49:14.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:49:14.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:49:14.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:49:14.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:49:14.328 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:48:56
2026-05-29T06:49:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71164, datetime.datetime(2026, 5, 29, 6, 48, 56), datetime.datetime(2026, 5, 29, 6, 48, 55), 'salt', 6.62, 78.5, None, 16.02, 92.64, 3.46, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:49:14.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:49:14.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:49:14.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:55, diff=19.336239s, valid=True
2026-05-29T06:49:14.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:49:14.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:49:14.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:12, diff=2.339709s, valid=True
2026-05-29T06:49:14.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:49:14.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:49:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:48:54, diff=20.347685s, valid=True
2026-05-29T06:49:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:49:14.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:49:14.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:49:14.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:49:14.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:49:14.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:49:14.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:12, diff=2.351308s, valid=True
2026-05-29T06:49:14.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:49:14.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:49:14.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:49:14.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962796.352106s, valid=True
2026-05-29T06:49:14.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:49:14.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:49:14.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:49:14.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:49:14.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:49:14.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:49:14.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:49:14.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:49:14.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:49:14.490 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:49:14.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:49:14.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:49:14.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:49:14.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:49:14.867 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:49:15.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:49:15.294 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:49:15.294 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:49:15.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-29T06:49:15.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-29T06:49:15.492 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:49:15.492 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:49:45.502 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:49:45.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:49:45.503 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:49:45.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:49:45.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:49:46.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:49:46.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:49:46.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:49:46.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-29T06:49:46.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:49:46.034 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:49:46.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:49:46.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-29T06:49:48.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-29T06:49:48.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:49:48.953 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:49:48.953 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:49:48.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:49:48.963 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:49:48.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:49:48.976 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:49:48.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:49:48.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:49:48.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:49:48.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:49:48.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:49:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:49:49.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:49:49.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:49:49.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:49:49.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:49:49.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:49:49.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:49:49.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:49:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:49:49.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:49:49.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:49:49.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:49:26
2026-05-29T06:49:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71165, datetime.datetime(2026, 5, 29, 6, 49, 26), datetime.datetime(2026, 5, 29, 6, 49, 25), 'salt', 6.69, 78.43, None, 15.99, 92.83, 3.48, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:49:49.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:49:49.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:49:49.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:25, diff=24.400051s, valid=True
2026-05-29T06:49:49.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:49:49.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:49:49.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:12, diff=37.402928s, valid=True
2026-05-29T06:49:49.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:49:49.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:24, diff=25.409537s, valid=True
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:49:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:49:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:49:49.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:12, diff=37.412651s, valid=True
2026-05-29T06:49:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:49:49.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:49:49.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:49:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962831.413323s, valid=True
2026-05-29T06:49:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:49:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:49:49.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:49:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:49:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:49:49.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:49:49.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:49:49.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:49:49.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:49:49.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:49:49.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:49:49.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:49:49.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:49:49.728 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:49:49.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:49:50.316 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:49:50.417 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:49:50.417 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:49:50.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-29T06:49:50.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-29T06:49:50.513 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:49:50.513 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:50:20.543 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:50:20.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:50:20.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:50:20.876 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:50:20.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:50:21.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:50:21.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-29T06:50:21.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:50:21.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-29T06:50:21.131 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:50:21.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:50:21.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:50:21.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:50:24.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-29T06:50:24.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:50:24.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:50:24.160 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:50:24.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:50:24.171 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:50:24.184 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:50:24.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:50:24.185 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:50:24.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:50:24.185 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:50:24.186 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:50:24.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:50:24.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:50:24.318 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:50:24.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:50:24.415 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:50:24.462 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:50:24.463 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:50:24.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:50:24.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:50:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:50:24.507 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:50:24.507 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:50:24.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:49:56
2026-05-29T06:50:24.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71166, datetime.datetime(2026, 5, 29, 6, 49, 56), datetime.datetime(2026, 5, 29, 6, 49, 56), 'salt', 6.79, 78.03, None, 15.99, 92.83, 3.55, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:50:24.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:50:24.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:50:24.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:56, diff=28.575729s, valid=True
2026-05-29T06:50:24.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:50:24.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:50:24.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:50:12, diff=12.579258s, valid=True
2026-05-29T06:50:24.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:50:24.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:50:24.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:49:54, diff=30.588938s, valid=True
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:50:24.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:50:24.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:50:12, diff=12.592579s, valid=True
2026-05-29T06:50:24.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:50:24.592 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:50:24.592 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:50:24.593 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962866.593396s, valid=True
2026-05-29T06:50:24.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:50:24.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:50:24.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:50:24.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:50:24.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:50:24.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:50:24.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:50:24.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:50:24.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:50:24.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:50:24.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:50:24.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:50:24.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:50:24.915 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:50:25.118 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:50:25.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:50:25.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:50:25.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:50:25.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-29T06:50:25.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-29T06:50:25.813 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:50:25.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:50:55.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:50:55.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:50:55.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:50:55.975 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:50:55.988 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:50:56.187 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:50:56.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-29T06:50:56.204 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:50:56.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-29T06:50:56.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:50:56.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:50:56.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:50:56.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-29T06:50:59.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-29T06:50:59.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:50:59.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:50:59.200 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:50:59.200 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:50:59.210 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:50:59.223 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:50:59.223 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:50:59.224 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:50:59.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:50:59.224 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:50:59.225 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:50:59.231 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:50:59.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:50:59.359 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:50:59.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:50:59.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:50:59.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:50:59.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:50:59.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:50:59.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:50:59.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:50:59.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:50:59.543 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:50:59.603 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:50:57
2026-05-29T06:50:59.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71168, datetime.datetime(2026, 5, 29, 6, 50, 57), datetime.datetime(2026, 5, 29, 6, 50, 56), 'salt', 6.79, 77.77, None, 16.44, 93.72, 3.6, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:50:59.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:50:59.603 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:50:59.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:50:56, diff=3.610278s, valid=True
2026-05-29T06:50:59.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:50:59.610 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:50:59.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:12, diff=-12.386332s, valid=True
2026-05-29T06:50:59.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:50:59.613 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:50:59.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:50:54, diff=5.621589s, valid=True
2026-05-29T06:50:59.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:50:59.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:50:59.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:50:59.621 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:50:59.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:50:59.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:50:59.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:12, diff=-12.37481s, valid=True
2026-05-29T06:50:59.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:50:59.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:50:59.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:50:59.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962901.625985s, valid=True
2026-05-29T06:50:59.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:50:59.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:50:59.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:50:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:50:59.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:50:59.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:50:59.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:50:59.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:50:59.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:50:59.764 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:50:59.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:50:59.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:50:59.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:50:59.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:51:00.171 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:51:00.510 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:51:00.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:51:00.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:51: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-29T06:51: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-29T06:51:00.704 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:51:00.705 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:51:30.732 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:51:30.732 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:51:30.732 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:51:30.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:51:30.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:51:31.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:51:31.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-29T06:51:31.121 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:51:31.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-29T06:51:31.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:51:31.134 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:51:31.140 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:51:31.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-29T06:51:34.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-29T06:51:34.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:51:34.919 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:51:34.920 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:51:34.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:51:34.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:51:34.943 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:51:34.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:51:34.945 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:51:34.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:51:34.945 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:51:34.945 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:51:34.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:51:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:51:35.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:51:35.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:51:35.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:51:35.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:51:35.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:51:35.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:51:35.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:51:35.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:51:35.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:51:35.263 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:51:35.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:51:27
2026-05-29T06:51:35.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71169, datetime.datetime(2026, 5, 29, 6, 51, 27), datetime.datetime(2026, 5, 29, 6, 51, 27), 'salt', 6.76, 77.73, None, 16.44, 95.25, 3.61, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:51:35.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:51:35.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:51:35.328 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:27, diff=8.328906s, valid=True
2026-05-29T06:51:35.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:51:35.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:51:35.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:12, diff=23.332359s, valid=True
2026-05-29T06:51:35.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:51:35.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:25, diff=10.34032s, valid=True
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:51:35.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:51:35.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:12, diff=23.34406s, valid=True
2026-05-29T06:51:35.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:51:35.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:51:35.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:51:35.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962937.344864s, valid=True
2026-05-29T06:51:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:51:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:51:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:51:35.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:51:35.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:51:35.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:51:35.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:51:35.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:51:35.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:51:35.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:51:35.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:51:35.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:51:35.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:51:35.666 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:51:35.868 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:51:36.275 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:51:36.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:51:36.375 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:51:36.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-29T06:51:36.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-29T06:51:36.575 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:51:36.575 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:52:06.605 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:52:06.605 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:52:06.605 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:52:06.919 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:52:06.929 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:52:07.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:52:07.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-29T06:52:07.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:52:07.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-29T06:52:07.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:52:07.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:52:07.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:52:07.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-29T06:52:10.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-29T06:52:10.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:52:10.163 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:52:10.163 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:52:10.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:52:10.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:52:10.194 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:52:10.195 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:52:10.195 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:52:10.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:52:10.195 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:52:10.195 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:52:10.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:52:10.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:52:10.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:52:10.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:52:10.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:52:10.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:52:10.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:52:10.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:52:10.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:52:10.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:52:10.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:52:10.519 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:52:10.577 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:51:57
2026-05-29T06:52:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71170, datetime.datetime(2026, 5, 29, 6, 51, 57), datetime.datetime(2026, 5, 29, 6, 51, 57), 'salt', 6.79, 77.73, None, 16.94, 94.97, 3.61, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:52:10.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:52:10.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:52:10.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:57, diff=13.584606s, valid=True
2026-05-29T06:52:10.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:52:10.584 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:52:10.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:12, diff=-1.411954s, valid=True
2026-05-29T06:52:10.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:52:10.588 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:51:55, diff=15.596036s, valid=True
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:52:10.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:52:10.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:12, diff=-1.400324s, valid=True
2026-05-29T06:52:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:52:10.599 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:52:10.599 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:52:10.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=962972.600504s, valid=True
2026-05-29T06:52:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:52:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:52:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:52:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:52:10.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:52:10.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:52:10.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:52:10.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:52:10.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:52:10.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:52:10.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:52:10.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:52:10.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:52:10.921 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:52:11.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:52:11.463 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:52:11.566 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:52:11.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:52:11.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-29T06:52:11.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-29T06:52:11.781 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:52:11.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:52:41.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:52:41.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:52:41.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:52:42.145 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:52:42.164 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:52:42.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:52:42.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-29T06:52:42.400 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:52:42.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-29T06:52:42.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:52:42.414 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:52:42.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:52:42.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-29T06:52:45.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-29T06:52:45.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:52:45.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:52:45.294 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:52:45.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:52:45.304 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:52:45.317 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:52:45.318 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:52:45.318 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:52:45.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:52:45.319 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:52:45.319 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:52:45.325 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:52:45.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:52:45.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:52:45.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:52:45.544 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:52:45.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:52:45.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:52:45.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:52:45.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:52:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:52:45.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:52:45.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:52:45.705 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:52:27
2026-05-29T06:52:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71171, datetime.datetime(2026, 5, 29, 6, 52, 27), datetime.datetime(2026, 5, 29, 6, 52, 27), 'salt', 6.82, 77.77, None, 16.73, 92.52, 3.6, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:52:45.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:52:45.706 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:52:45.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:27, diff=18.712778s, valid=True
2026-05-29T06:52:45.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:52:45.712 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:52:45.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:12, diff=33.716205s, valid=True
2026-05-29T06:52:45.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:52:45.716 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:25, diff=20.724048s, valid=True
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:52:45.724 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:52:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:12, diff=33.727686s, valid=True
2026-05-29T06:52:45.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:52:45.727 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:52:45.727 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:52:45.728 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963007.728473s, valid=True
2026-05-29T06:52:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:52:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:52:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:52:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:52:45.730 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:52:45.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:52:45.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:52:45.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:52:45.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:52:45.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:52:45.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:52:45.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:52:46.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:52:46.049 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:52:46.323 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:52:46.659 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:52:46.760 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:52:46.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:52:46.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-29T06:52:46.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-29T06:52:47.012 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:52:47.012 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:53:17.022 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:53:17.023 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:53:17.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:53:17.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:53:17.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:53:17.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:53:17.552 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:53:17.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:53:17.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:53:17.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:53:17.582 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:53:17.589 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:53:17.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-29T06:53:20.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:53:20.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:53:20.485 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:53:20.486 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:53:20.487 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:53:20.497 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:53:20.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:53:20.511 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:53:20.511 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:53:20.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:53:20.512 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:53:20.512 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:53:20.518 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:53:20.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:53:20.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:53:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:53:20.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:53:20.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:53:20.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:53:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:53:20.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:53:20.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:53:20.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:53:20.833 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:53:20.893 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:52:58
2026-05-29T06:53:20.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71172, datetime.datetime(2026, 5, 29, 6, 52, 58), datetime.datetime(2026, 5, 29, 6, 52, 57), 'salt', 6.76, 77.8, None, 16.83, 96.07, 3.6, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:53:20.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:53:20.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:53:20.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:57, diff=23.900315s, valid=True
2026-05-29T06:53:20.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:53:20.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:53:20.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:12, diff=8.903595s, valid=True
2026-05-29T06:53:20.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:53:20.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:52:55, diff=25.911068s, valid=True
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:53:20.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:53:20.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:12, diff=8.914265s, valid=True
2026-05-29T06:53:20.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:53:20.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:53:20.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:53:20.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963042.914985s, valid=True
2026-05-29T06:53:20.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:53:20.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:53:20.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:53:20.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:53:20.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:53:20.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:53:20.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:53:20.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:53:20.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:53:21.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:53:21.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:53:21.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:53:21.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:53:21.233 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:53:21.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:53:21.775 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:53:21.876 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:53:21.876 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:53:21.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-29T06:53:21.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-29T06:53:21.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:53:21.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:53:51.970 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:53:51.970 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:53:51.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:53:52.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:53:52.626 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:53:52.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:53:52.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-29T06:53:52.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:53:52.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-29T06:53:52.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:53:52.868 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:53:52.875 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:53:52.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-29T06:53:56.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:53:56.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:53:56.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:53:56.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:53:56.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:53:56.285 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:53:56.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:53:56.298 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:53:56.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:53:56.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:53:56.299 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:53:56.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:53:56.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:53:56.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:53:56.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:53:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:53:56.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:53:56.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:53:56.572 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:53:56.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:53:56.614 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:53:56.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:53:56.618 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:53:56.618 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:53:56.679 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:53:28
2026-05-29T06:53:56.679 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71173, datetime.datetime(2026, 5, 29, 6, 53, 28), datetime.datetime(2026, 5, 29, 6, 53, 28), 'salt', 6.62, 77.8, None, 16.34, 92.31, 3.59, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:53:56.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:53:56.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:53:56.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:28, diff=28.686997s, valid=True
2026-05-29T06:53:56.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:53:56.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:53:56.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:12, diff=44.690406s, valid=True
2026-05-29T06:53:56.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:53:56.690 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:26, diff=30.698407s, valid=True
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:53:56.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:53:56.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:53:12, diff=44.702038s, valid=True
2026-05-29T06:53:56.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:53:56.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:53:56.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:53:56.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963078.70283s, valid=True
2026-05-29T06:53:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:53:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:53:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:53:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:53:56.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:53:56.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:53:56.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:53:56.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:53:56.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:53:56.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:53:56.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:53:57.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:53:57.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:53:57.093 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:53:57.295 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:53:57.632 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:53:57.731 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:53:57.731 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:53:57.731 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:53:57.731 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:53:58.014 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:53:58.014 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:54:28.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:54:28.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:54:28.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:54:28.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:54:28.374 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:54:28.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:54:28.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-29T06:54:28.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:54:28.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-29T06:54:28.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:54:28.607 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:54:28.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:54:28.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-29T06:54:31.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-29T06:54:31.408 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:54:31.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:54:31.416 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:54:31.417 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:54:31.427 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:54:31.440 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:54:31.440 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:54:31.441 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:54:31.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:54:31.441 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:54:31.442 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:54:31.448 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:54:31.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:54:31.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:54:31.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:54:31.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:54:31.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:54:31.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:54:31.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:54:31.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:54:31.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:54:31.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:54:31.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:54:31.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:54:28
2026-05-29T06:54:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71175, datetime.datetime(2026, 5, 29, 6, 54, 28), datetime.datetime(2026, 5, 29, 6, 54, 28), 'salt', 6.79, 78.03, None, 16.37, 92.95, 3.55, 832.25, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:54:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:54:31.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:54:31.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:28, diff=3.821481s, valid=True
2026-05-29T06:54:31.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:54:31.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:54:31.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:12, diff=19.824587s, valid=True
2026-05-29T06:54:31.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:54:31.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:27, diff=4.831326s, valid=True
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:54:31.831 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:54:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:12, diff=19.834422s, valid=True
2026-05-29T06:54:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:54:31.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:54:31.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:54:31.835 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963113.835102s, valid=True
2026-05-29T06:54:31.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:54:31.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:54:31.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:54:31.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:54:31.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:54:31.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:54:31.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:54:31.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:54:31.918 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:54:32.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:54:32.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:54:32.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:54:32.178 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:54:32.218 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:54:32.420 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:54:32.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:54:32.855 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:54:32.855 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:54:32.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-29T06:54:32.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-29T06:54:33.153 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:54:33.153 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:55:03.159 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:55:03.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:55:03.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:55:03.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:55:03.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:55:03.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:55:03.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-29T06:55:03.719 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:55:03.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-29T06:55:03.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:55:03.731 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:55:03.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:55:03.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:55:06.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-29T06:55:06.539 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:55:06.546 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:55:06.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:55:06.547 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:55:06.558 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:55:06.570 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:55:06.571 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:55:06.571 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:55:06.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:55:06.572 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:55:06.572 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:55:06.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:55:06.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:55:06.703 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:55:06.797 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:55:06.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:55:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:55:06.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:55:06.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:55:06.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:55:06.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:55:06.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:55:06.888 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:55:06.948 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:54:59
2026-05-29T06:55:06.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71176, datetime.datetime(2026, 5, 29, 6, 54, 59), datetime.datetime(2026, 5, 29, 6, 54, 58), 'salt', 6.76, 78.0, None, 16.41, 92.6, 3.56, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:55:06.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:55:06.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:55:06.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:58, diff=8.956139s, valid=True
2026-05-29T06:55:06.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:55:06.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:55:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:12, diff=-5.040477s, valid=True
2026-05-29T06:55:06.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:55:06.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:54:58, diff=8.967447s, valid=True
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:55:06.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:55:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:12, diff=-5.028872s, valid=True
2026-05-29T06:55:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:55:06.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:55:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:55:06.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963148.971929s, valid=True
2026-05-29T06:55:06.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:55:06.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:55:06.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:55:06.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:55:06.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:55:07.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:55:07.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:55:07.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:55:07.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:55:07.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:55:07.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:55:07.270 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:55:07.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:55:07.359 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:55:07.565 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:55:07.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:55:08.002 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:55:08.002 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:55:08.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-29T06:55:08.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-29T06:55:08.198 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:55:08.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:55:38.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:55:38.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:55:38.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:55:38.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:55:38.382 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:55:38.582 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:55:38.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-29T06:55:38.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:55:38.598 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:55:38.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:55:38.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:55:38.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:55:38.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-29T06:55:41.630 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T06:55:41.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:55:41.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:55:41.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:55:41.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:55:41.651 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:55:41.663 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:55:41.664 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:55:41.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:55:41.665 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:55:41.665 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:55:41.665 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:55:41.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:55:41.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:55:41.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:55:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:55:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:55:41.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:55:41.936 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:55:41.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:55:41.979 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:55:41.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:55:41.984 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:55:41.985 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:55:42.050 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:55:29
2026-05-29T06:55:42.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71177, datetime.datetime(2026, 5, 29, 6, 55, 29), datetime.datetime(2026, 5, 29, 6, 55, 29), 'salt', 6.76, 78.0, None, 15.91, 97.36, 3.56, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:55:42.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:55:42.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:55:42.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:29, diff=13.056926s, valid=True
2026-05-29T06:55:42.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:55:42.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:55:42.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:12, diff=30.060162s, valid=True
2026-05-29T06:55:42.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:55:42.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:55:42.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:26, diff=16.067708s, valid=True
2026-05-29T06:55:42.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:55:42.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:55:42.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:55:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:55:42.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:55:42.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:55:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:12, diff=30.07111s, valid=True
2026-05-29T06:55:42.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:55:42.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:55:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:55:42.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963184.071875s, valid=True
2026-05-29T06:55:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:55:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:55:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:55:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:55:42.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:55:42.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:55:42.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:55:42.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:55:42.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:55:42.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:55:42.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:55:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:55:42.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:55:42.398 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:55:42.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:55:42.941 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:55:43.041 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:55:43.041 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:55:43.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-29T06:55:43.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-29T06:55:43.238 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:55:43.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:56:13.256 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:56:13.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:56:13.256 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:56:13.722 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:56:13.733 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:56:13.989 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:56:13.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T06:56:14.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:56:14.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-29T06:56:14.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:56:14.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:56:14.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:56:14.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-29T06:56:16.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-29T06:56:16.983 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:56:16.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:56:16.992 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:56:16.992 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:56:17.002 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:56:17.014 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:56:17.014 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:56:17.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:56:17.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:56:17.016 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:56:17.016 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:56:17.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:56:17.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:56:17.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:56:17.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:56:17.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:56:17.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:56:17.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:56:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:56:17.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:56:17.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:56:17.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:56:17.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:56:17.405 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:56:00
2026-05-29T06:56:17.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71178, datetime.datetime(2026, 5, 29, 6, 56), datetime.datetime(2026, 5, 29, 6, 56), 'salt', 6.82, 78.0, None, 15.81, 93.84, 3.56, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:56:17.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:56:17.406 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:56:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:00, diff=17.413214s, valid=True
2026-05-29T06:56:17.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:56:17.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:56:17.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:12, diff=5.416744s, valid=True
2026-05-29T06:56:17.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:56:17.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:56:17.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:55:57, diff=20.424747s, valid=True
2026-05-29T06:56:17.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:56:17.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:56:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:56:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:56:17.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:56:17.425 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:56:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:12, diff=5.428557s, valid=True
2026-05-29T06:56:17.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:56:17.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:56:17.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:56:17.429 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963219.429382s, valid=True
2026-05-29T06:56:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:56:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:56:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:56:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:56:17.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:56:17.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:56:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:56:17.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:56:17.515 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:56:17.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:56:17.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:56:17.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:56:17.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:56:17.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:56:17.954 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:56:18.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:56:18.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:56:18.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:56:18.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-29T06:56:18.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-29T06:56:18.590 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:56:18.590 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:56:48.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:56:48.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:56:48.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:56:48.938 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:56:48.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:56:49.159 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:56:49.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-29T06:56:49.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:56:49.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-29T06:56:49.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:56:49.184 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:56:49.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:56:49.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-29T06:56:52.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-29T06:56:52.379 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:56:52.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:56:52.388 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:56:52.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:56:52.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:56:52.412 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:56:52.412 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:56:52.413 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:56:52.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:56:52.413 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:56:52.414 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:56:52.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:56:52.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:56:52.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:56:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:56:52.647 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:56:52.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:56:52.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:56:52.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:56:52.733 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:56:52.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:56:52.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:56:52.738 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:56:52.797 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:56:30
2026-05-29T06:56:52.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71179, datetime.datetime(2026, 5, 29, 6, 56, 30), datetime.datetime(2026, 5, 29, 6, 56, 30), 'salt', 6.79, 77.6, None, 15.67, 96.63, 3.63, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:56:52.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:56:52.798 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:56:52.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:30, diff=22.804812s, valid=True
2026-05-29T06:56:52.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:56:52.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:56:52.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:12, diff=40.808226s, valid=True
2026-05-29T06:56:52.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:56:52.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:27, diff=25.815978s, valid=True
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:56:52.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:56:52.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:12, diff=40.819572s, valid=True
2026-05-29T06:56:52.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:56:52.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:56:52.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:56:52.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963254.820365s, valid=True
2026-05-29T06:56:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:56:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:56:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:56:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:56:52.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:56:52.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:56:52.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:56:52.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:56:52.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:56:52.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:56:53.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:56:53.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:56:53.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:56:53.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:56:53.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:56:53.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:56:53.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:56:53.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:56:53.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-29T06:56:53.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-29T06:56:53.995 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:56:53.995 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:57:24.019 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:57:24.020 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:57:24.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:57:24.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:57:24.192 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:57:24.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:57:24.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-29T06:57:24.405 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:57:24.405 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:57:24.419 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:57:24.419 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:57:24.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:57:24.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:57:28.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-29T06:57:28.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:57:28.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:57:28.931 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:57:28.931 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:57:28.941 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:57:28.954 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:57:28.954 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:57:28.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:57:28.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:57:28.956 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:57:28.956 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:57:28.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:57:29.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:57:29.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:57:29.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:57:29.182 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:57:29.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:57:29.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:57:29.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:57:29.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:57:29.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:57:29.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:57:29.276 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:57:29.336 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:57:00
2026-05-29T06:57:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71180, datetime.datetime(2026, 5, 29, 6, 57), datetime.datetime(2026, 5, 29, 6, 57), 'salt', 6.82, 77.57, None, 15.35, 96.09, 3.64, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:57:29.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:57:29.336 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:57:29.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:57:00, diff=29.343533s, valid=True
2026-05-29T06:57:29.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:57:29.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:57:29.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:57:12, diff=17.347032s, valid=True
2026-05-29T06:57:29.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:57:29.347 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:56:57, diff=32.355114s, valid=True
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:57:29.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:57:29.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:57:12, diff=17.358852s, valid=True
2026-05-29T06:57:29.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:57:29.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:57:29.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:57:29.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963291.359674s, valid=True
2026-05-29T06:57:29.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:57:29.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:57:29.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:57:29.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:57:29.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:57:29.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:57:29.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:57:29.426 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:57:29.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:57:29.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:57:29.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:57:29.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:57:29.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:57:29.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:57:29.890 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:57:30.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:57:30.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:57:30.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:57:30.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-29T06:57:30.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-29T06:57:30.578 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:57:30.578 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:58:00.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:58:00.608 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:58: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-29T06:58:00.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:58:00.777 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:58:00.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:58:00.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-29T06:58:00.994 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:58:00.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-29T06:58:01.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:58:01.008 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:58:01.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:58:01.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-29T06:58:04.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-29T06:58:04.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:58:04.146 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:58:04.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:58:04.147 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:58:04.157 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:58:04.169 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:58:04.169 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:58:04.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:58:04.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:58:04.170 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:58:04.170 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:58:04.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:58:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T06:58:04.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:58:04.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T06:58:04.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:58:04.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:58:04.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:58:04.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T06:58:04.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:58:04.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:58:04.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:58:04.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:58:04.539 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:58:01
2026-05-29T06:58:04.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71182, datetime.datetime(2026, 5, 29, 6, 58, 1), datetime.datetime(2026, 5, 29, 6, 58), 'salt', 6.89, 77.27, None, 15.91, 93.11, 3.7, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:58:04.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:58:04.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T06:58:04.545 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:00, diff=4.545897s, valid=True
2026-05-29T06:58:04.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:58:04.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:58:04.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:12, diff=-7.451011s, valid=True
2026-05-29T06:58:04.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:58:04.549 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:57:58, diff=6.556242s, valid=True
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:58:04.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T06:58:04.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:12, diff=-7.440411s, valid=True
2026-05-29T06:58:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:58:04.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:58:04.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:58:04.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963326.560325s, valid=True
2026-05-29T06:58:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:58:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:58:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:58:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:58:04.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:58:04.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:58:04.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:58:04.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:58:04.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:58:04.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:58:04.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:58:04.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:58:04.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:58:04.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:58:05.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:58:05.487 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:58:05.586 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:58:05.586 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:58:05.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-29T06:58:05.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-29T06:58:05.782 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:58:05.782 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:58:35.806 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:58:35.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:58:35.807 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:58:35.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:58:35.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:58:36.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:58: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-29T06:58:36.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:58:36.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-29T06:58:36.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:58:36.219 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:58:36.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:58:36.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-29T06:58:39.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-29T06:58:39.842 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:58:39.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:58:39.848 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:58:39.848 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:58:39.856 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:58:39.868 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:58:39.868 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:58:39.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:58:39.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:58:39.869 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:58:39.869 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:58:39.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:58:39.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:58:39.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:58:40.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:58:40.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:58:40.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:58:40.089 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:58:40.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:58:40.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:58:40.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:58:40.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:58:40.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:58:40.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:58:31
2026-05-29T06:58:40.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71183, datetime.datetime(2026, 5, 29, 6, 58, 31), datetime.datetime(2026, 5, 29, 6, 58, 31), 'salt', 6.89, 77.1, None, 15.91, 92.17, 3.73, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:58:40.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:58:40.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:58:40.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:31, diff=9.200897s, valid=True
2026-05-29T06:58:40.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:58:40.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:58:40.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:12, diff=28.20394s, valid=True
2026-05-29T06:58:40.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:58:40.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:28, diff=12.211102s, valid=True
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:58:40.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:58:40.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:58:12, diff=28.214357s, valid=True
2026-05-29T06:58:40.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:58:40.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:58:40.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:58:40.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963362.215073s, valid=True
2026-05-29T06:58:40.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:58:40.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:58:40.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:58:40.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:58:40.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:58:40.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:58:40.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:58:40.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:58:40.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:58:40.350 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:58:40.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:58:40.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:58:40.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:58:40.532 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:58:40.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:58:41.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:58:41.170 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:58:41.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:58:41.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-29T06:58:41.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-29T06:58:41.323 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:58:41.323 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:59:11.348 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:59:11.348 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:59:11.348 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:59:11.652 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:59:11.664 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:59:11.866 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:59:11.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-29T06:59:11.879 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:59:11.879 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T06:59:11.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:59:11.892 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:59:11.896 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:59:11.896 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T06:59:15.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-29T06:59:15.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:59:15.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:59:15.075 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:59:15.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:59:15.086 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:59:15.101 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:59:15.102 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:59:15.102 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:59:15.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:59:15.103 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:59:15.103 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:59:15.110 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:59:15.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:59:15.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:59:15.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:59:15.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:59:15.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:59:15.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:59:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:59:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:59:15.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:59:15.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:59:15.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:59:15.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:59:01
2026-05-29T06:59:15.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71184, datetime.datetime(2026, 5, 29, 6, 59, 1), datetime.datetime(2026, 5, 29, 6, 59, 1), 'salt', 6.82, 76.94, None, 15.42, 92.48, 3.75, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:59:15.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:59:15.482 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:59:15.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:01, diff=14.488781s, valid=True
2026-05-29T06:59:15.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:59:15.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:59:15.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=3.492028s, valid=True
2026-05-29T06:59:15.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:59:15.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:00, diff=15.499527s, valid=True
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:59:15.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:59:15.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:59:15.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=3.503002s, valid=True
2026-05-29T06:59:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:59:15.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:59:15.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:59:15.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963397.503784s, valid=True
2026-05-29T06:59:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:59:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:59:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:59:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:59:15.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:59:15.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:59:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:59:15.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:59:15.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:59:15.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:59:15.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:59:15.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:59:15.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:59:15.835 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:59:16.110 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:59:16.448 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:59:16.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:59:16.548 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:59:16.548 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T06:59:16.548 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T06:59:16.800 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:59:16.800 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T06:59:46.813 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T06:59:46.813 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T06:59:46.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T06:59:46.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T06:59:46.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T06:59:47.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T06:59:47.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-29T06:59:47.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T06:59:47.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-29T06:59:47.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T06:59:47.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T06:59:47.226 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T06:59: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-29T06:59:50.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-29T06:59:50.180 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T06:59:50.184 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T06:59:50.184 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T06:59:50.185 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T06:59:50.193 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T06:59:50.205 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T06:59:50.206 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T06:59:50.207 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T06:59:50.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T06:59:50.207 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T06:59:50.207 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T06:59:50.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T06:59:50.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T06:59:50.339 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T06:59:50.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T06:59:50.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:59:50.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:59:50.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T06:59:50.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T06:59:50.516 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T06:59:50.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T06:59:50.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T06:59:50.521 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T06:59:50.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 06:59:32
2026-05-29T06:59:50.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71185, datetime.datetime(2026, 5, 29, 6, 59, 32), datetime.datetime(2026, 5, 29, 6, 59, 31), 'salt', 6.79, 76.97, None, 14.79, 93.35, 3.75, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T06:59:50.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T06:59:50.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T06:59:50.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:31, diff=19.586151s, valid=True
2026-05-29T06:59:50.586 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T06:59:50.586 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:59:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=38.589477s, valid=True
2026-05-29T06:59:50.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T06:59:50.589 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:31, diff=19.59719s, valid=True
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T06:59:50.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T06:59:50.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=38.600682s, valid=True
2026-05-29T06:59:50.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T06:59:50.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T06:59:50.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T06:59:50.601 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963432.601439s, valid=True
2026-05-29T06:59:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T06:59:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T06:59:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T06:59:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T06:59:50.603 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T06:59:50.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T06:59:50.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T06:59:50.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T06:59:50.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T06:59:50.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T06:59:50.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T06:59:50.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T06:59:50.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T06:59:50.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T06:59:51.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:59:51.460 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T06:59:51.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T06:59:51.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T06:59:51.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-29T06:59:51.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-29T06:59:51.766 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T06:59:51.767 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:00:21.770 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:00:21.771 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:00:21.771 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:00:22.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:00:22.091 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:00:22.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:00:22.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-29T07:00:22.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:00:22.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-29T07:00:22.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:00:22.316 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:00:22.324 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:00:22.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:00:25.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-29T07:00:25.347 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:00:25.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:00:25.355 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:00:25.355 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:00:25.365 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:00:25.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:00:25.378 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:00:25.379 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:00:25.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:00:25.379 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:00:25.380 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:00:25.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:00:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:00:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:00:25.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:00:25.606 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:00:25.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:00:25.650 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:00:25.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:00:25.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:00:25.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:00:25.696 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:00:25.696 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:00:25.758 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:00:02
2026-05-29T07:00:25.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71186, datetime.datetime(2026, 5, 29, 7, 0, 2), datetime.datetime(2026, 5, 29, 7, 0, 1), 'salt', 6.92, 76.97, None, 14.82, 93.14, 3.75, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:00:25.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:00:25.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:00:25.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:00:01, diff=24.766104s, valid=True
2026-05-29T07:00:25.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:00:25.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:00:25.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=73.769493s, valid=True
2026-05-29T07:00:25.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:00:25.769 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:58, diff=27.777454s, valid=True
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:00:25.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:00:25.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=73.781044s, valid=True
2026-05-29T07:00:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:00:25.781 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:00:25.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:00:25.781 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963467.781841s, valid=True
2026-05-29T07:00:25.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:00:25.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:00:25.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:00:25.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:00:25.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:00:25.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:00:25.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:00:25.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:00:25.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:00:25.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:00:25.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:00:26.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:00:26.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:00:26.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:00:26.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:00:26.735 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:00:26.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:00:26.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:00:26.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-29T07:00:26.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-29T07:00:27.112 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:00:27.113 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:00:57.118 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:00:57.119 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:00:57.119 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:00:57.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:00:57.294 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:00:57.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:00:57.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-29T07:00:57.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:00:57.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-29T07:00:57.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:00:57.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:00:57.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:00:57.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-29T07:01:00.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-29T07:01:00.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:01:00.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:01:00.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:01:00.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:01:00.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:01:00.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:01:00.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:01:00.424 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:01:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:01:00.424 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:01:00.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:01:00.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:01:00.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:01:00.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:01:00.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:01:00.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:01:00.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:01:00.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:01:00.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:01:00.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:01:00.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:01:00.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:01:00.765 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:01:00.835 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:00:32
2026-05-29T07:01:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71187, datetime.datetime(2026, 5, 29, 7, 0, 32), datetime.datetime(2026, 5, 29, 7, 0, 32), 'salt', 6.99, 76.74, None, 16.13, 92.06, 3.8, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:01:00.836 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:01:00.836 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:01:00.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:00:32, diff=28.843378s, valid=True
2026-05-29T07:01:00.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:01:00.843 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:01:00.846 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=108.846902s, valid=True
2026-05-29T07:01:00.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:01:00.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:00:29, diff=31.855155s, valid=True
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:01:00.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:01:00.858 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=108.858876s, valid=True
2026-05-29T07:01:00.858 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:01:00.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:01:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:01:00.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963502.859698s, valid=True
2026-05-29T07:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:01:00.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:01:00.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:01:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:01:00.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:01:00.946 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:01:00.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:01:01.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:01:01.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:01:01.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:01:01.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:01:01.383 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:01:01.720 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:01:01.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:01:01.819 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:01:01.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-29T07:01:01.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-29T07:01:02.013 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:01:02.013 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:01:32.042 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:01:32.042 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:01:32.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:01:32.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:01:32.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:01:32.590 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:01:32.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-29T07:01:32.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:01:32.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-29T07:01:32.623 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:01:32.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:01:32.629 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:01:32.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:01:36.001 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:01:36.002 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:01:36.010 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:01:36.010 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:01:36.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:01:36.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:01:36.033 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:01:36.034 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:01:36.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:01:36.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:01:36.035 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:01:36.035 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:01:36.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:01:36.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T07:01:36.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:01:36.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T07:01:36.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:01:36.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:01:36.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:01:36.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:01:36.351 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:01:36.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:01:36.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:01:36.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:01:36.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:01:33
2026-05-29T07:01:36.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71189, datetime.datetime(2026, 5, 29, 7, 1, 33), datetime.datetime(2026, 5, 29, 7, 1, 32), 'salt', 6.86, 76.54, None, 15.42, 97.15, 3.83, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:01:36.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:01:36.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T07:01:36.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:01:32, diff=4.424373s, valid=True
2026-05-29T07:01:36.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:01:36.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:01:36.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=144.427696s, valid=True
2026-05-29T07:01:36.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:01:36.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T07:01:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:01:29, diff=7.435589s, valid=True
2026-05-29T07:01:36.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:01:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:01:36.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:01:36.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:01:36.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:01:36.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:01:36.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=144.439158s, valid=True
2026-05-29T07:01:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:01:36.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:01:36.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:01:36.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963538.43997s, valid=True
2026-05-29T07:01:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:01:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:01:36.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:01:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:01:36.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:01:36.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:01:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:01:36.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:01:36.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:01:36.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:01:36.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:01:36.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:01:36.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:01:36.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:01:37.038 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:01:37.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:01:37.473 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:01:37.473 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:01:37.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-29T07:01:37.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-29T07:01:37.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:01:37.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:02:07.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:02:07.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:02:07.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:02:07.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:02:07.972 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:02:08.163 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:02:08.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-29T07:02:08.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:02:08.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-29T07:02:08.191 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:02:08.191 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:02:08.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:02:08.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:02:11.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:02:11.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:02:11.152 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:02:11.153 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:02:11.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:02:11.163 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:02:11.176 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:02:11.176 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:02:11.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:02:11.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:02:11.177 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:02:11.178 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:02:11.184 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:02:11.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:02:11.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:02:11.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:02:11.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:02:11.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:02:11.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:02:11.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:02:11.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:02:11.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:02:11.498 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:02:11.498 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:02:11.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:02:03
2026-05-29T07:02:11.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71190, datetime.datetime(2026, 5, 29, 7, 2, 3), datetime.datetime(2026, 5, 29, 7, 2, 2), 'salt', 6.96, 76.67, None, 14.05, 91.0, 3.81, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:02:11.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:02:11.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:02:11.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:02:02, diff=9.566981s, valid=True
2026-05-29T07:02:11.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:02:11.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:02:11.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=179.570354s, valid=True
2026-05-29T07:02:11.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:02:11.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:01:59, diff=12.578326s, valid=True
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:02:11.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:02:11.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=179.581952s, valid=True
2026-05-29T07:02:11.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:02:11.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:02:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:02:11.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963573.582761s, valid=True
2026-05-29T07:02:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:02:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:02:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:02:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:02:11.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:02:11.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:02:11.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:02:11.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:02:11.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:02:11.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:02:11.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:02:11.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:02:11.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:02:11.907 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:02:12.111 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:02:12.445 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:02:12.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:02:12.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:02:12.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-29T07:02:12.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-29T07:02:12.808 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:02:12.809 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:02:42.826 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:02:42.826 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:02:42.826 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:02:43.183 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:02:43.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:02:43.465 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:02:43.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-29T07:02:43.482 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:02:43.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-29T07:02:43.497 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:02:43.497 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:02:43.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:02:43.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-29T07:02:46.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-29T07:02:46.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:02:46.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:02:46.504 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:02:46.504 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:02:46.514 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:02:46.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:02:46.527 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:02:46.528 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:02:46.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:02:46.528 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:02:46.529 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:02:46.534 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:02:46.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:02:46.659 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:02:46.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:02:46.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:02:46.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:02:46.798 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:02:46.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:02:46.839 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:02:46.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:02:46.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:02:46.844 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:02:46.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:02:34
2026-05-29T07:02:46.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71191, datetime.datetime(2026, 5, 29, 7, 2, 34), datetime.datetime(2026, 5, 29, 7, 2, 33), 'salt', 6.92, 76.8, None, 15.32, 94.03, 3.78, 832.31, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:02:46.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:02:46.902 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:02:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:02:33, diff=13.909152s, valid=True
2026-05-29T07:02:46.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:02:46.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:02:46.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=214.912487s, valid=True
2026-05-29T07:02:46.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:02:46.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:02:30, diff=16.920226s, valid=True
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:02:46.920 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:02:46.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=214.923799s, valid=True
2026-05-29T07:02:46.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:02:46.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:02:46.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:02:46.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963608.924582s, valid=True
2026-05-29T07:02:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:02:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:02:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:02:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:02:46.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:02:46.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:02:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:02:46.990 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:02:47.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:02:47.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:02:47.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:02:47.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:02:47.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:02:47.244 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:02:47.447 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:02:47.783 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:02:47.883 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:02:47.883 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:02:47.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-29T07:02:47.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-29T07:02:48.083 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:02:48.083 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:03:18.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:03:18.088 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:03:18.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:03:18.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:03:18.258 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:03:18.461 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:03:18.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-29T07:03:18.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:03:18.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-29T07:03:18.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:03:18.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:03:18.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:03:18.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-29T07:03:21.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-29T07:03:21.383 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:03:21.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:03:21.392 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:03:21.392 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:03:21.401 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:03:21.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:03:21.415 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:03:21.415 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:03:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:03:21.416 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:03:21.416 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:03:21.422 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:03:21.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:03:21.550 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:03:21.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:03:21.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:03:21.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:03:21.691 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:03:21.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:03:21.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:03:21.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:03:21.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:03:21.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:03:21.796 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:03:04
2026-05-29T07:03:21.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71192, datetime.datetime(2026, 5, 29, 7, 3, 4), datetime.datetime(2026, 5, 29, 7, 3, 3), 'salt', 6.89, 76.7, None, 15.63, 94.05, 3.8, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:03:21.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:03:21.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:03:21.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:03:03, diff=18.803983s, valid=True
2026-05-29T07:03:21.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:03:21.804 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:03:21.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=249.807393s, valid=True
2026-05-29T07:03:21.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:03:21.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:03:01, diff=20.815269s, valid=True
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:03:21.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:03:21.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 06:59:12, diff=249.818922s, valid=True
2026-05-29T07:03:21.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:03:21.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:03:21.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:03:21.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963643.819814s, valid=True
2026-05-29T07:03:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:03:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:03:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:03:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:03:21.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:03:21.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:03:21.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:03:21.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:03:21.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:03:21.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:03:22.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:03:22.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:03:22.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:03:22.142 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:03:22.345 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:03:22.679 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:03:22.836 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:03:22.836 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:03:22.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-29T07:03:22.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-29T07:03:23.028 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:03:23.028 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:03:53.045 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:03:53.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:03:53.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:03:53.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:03:53.221 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:03:53.422 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:03:53.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-29T07:03:53.439 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:03:53.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-29T07:03:53.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:03:53.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:03:53.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:03:53.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-29T07:03:56.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-29T07:03:56.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:03:56.889 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:03:56.890 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:03:56.890 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:03:56.901 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:03:56.914 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:03:56.914 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:03:56.915 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:03:56.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:03:56.916 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:03:56.916 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:03:56.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:03:57.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:03:57.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:03:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:03:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:03:57.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:03:57.188 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:03:57.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:03:57.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:03:57.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:03:57.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:03:57.234 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:03:57.294 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:03:34
2026-05-29T07:03:57.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71193, datetime.datetime(2026, 5, 29, 7, 3, 34), datetime.datetime(2026, 5, 29, 7, 3, 34), 'salt', 6.86, 76.9, None, 13.87, 95.51, 3.77, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:03:57.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:03:57.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:03:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:03:34, diff=23.30139s, valid=True
2026-05-29T07:03:57.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:03:57.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:03:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:12, diff=-14.695224s, valid=True
2026-05-29T07:03:57.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:03:57.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:03:57.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:03:33, diff=24.312602s, valid=True
2026-05-29T07:03:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:03:57.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:03:57.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:03:57.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:03:57.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:03:57.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:03:57.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:12, diff=-14.683817s, valid=True
2026-05-29T07:03:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:03:57.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:03:57.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:03:57.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963679.317s, valid=True
2026-05-29T07:03:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:03:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:03:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:03:57.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:03:57.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:03:57.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:03:57.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:03:57.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:03:57.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:03:57.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:03:57.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:03:57.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:03:57.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:03:57.643 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:03:57.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:03:58.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:03:58.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:03:58.295 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:03:58.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-29T07:03:58.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-29T07:03:58.557 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:03:58.558 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:04:28.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:04:28.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:04:28.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:04:29.134 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:04:29.149 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:04:29.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:04:29.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-29T07:04:29.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:04:29.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-29T07:04:29.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:04:29.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:04:29.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:04:29.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-29T07:04:32.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:04:32.230 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:04:32.237 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:04:32.238 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:04:32.238 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:04:32.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:04:32.260 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:04:32.261 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:04:32.261 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:04:32.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:04:32.262 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:04:32.262 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:04:32.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:04:32.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:04:32.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:04:32.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:04:32.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:04:32.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:04:32.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:04:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:04:32.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:04:32.577 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:04:32.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:04:32.578 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:04:32.635 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:04:05
2026-05-29T07:04:32.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71194, datetime.datetime(2026, 5, 29, 7, 4, 5), datetime.datetime(2026, 5, 29, 7, 4, 5), 'salt', 6.92, 76.87, None, 15.99, 93.21, 3.77, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:04:32.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:04:32.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:04:32.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:05, diff=27.641892s, valid=True
2026-05-29T07:04:32.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:04:32.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:04:32.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:12, diff=20.64473s, valid=True
2026-05-29T07:04:32.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:04:32.644 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:04, diff=28.651356s, valid=True
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:04:32.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:04:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:04:12, diff=20.654328s, valid=True
2026-05-29T07:04:32.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:04:32.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:04:32.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:04:32.655 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963714.65499s, valid=True
2026-05-29T07:04:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:04:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:04:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:04:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:04:32.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:04:32.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:04:32.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:04:32.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:04:32.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:04:32.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:04:32.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:04:32.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:04:32.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:04:32.972 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:04:33.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:04:33.583 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:04:33.682 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:04:33.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:04:33.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-29T07:04:33.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-29T07:04:33.776 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:04:33.777 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:05:03.790 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:05:03.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:05:03.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:05:03.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:05:03.957 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:05:04.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:05:04.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-29T07:05:04.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:05:04.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-29T07:05:04.171 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:05:04.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:05:04.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:05:04.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-29T07:05:07.144 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:05:07.145 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:05:07.153 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:05:07.155 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:05:07.155 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:05:07.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:05:07.179 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:05:07.180 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:05:07.180 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:05:07.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:05:07.181 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:05:07.181 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:05:07.187 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:05:07.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T07:05:07.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:05:07.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T07:05:07.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:05:07.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:05:07.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:05:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:05:07.490 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:05:07.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:05:07.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:05:07.496 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:05:07.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:05:06
2026-05-29T07:05:07.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71196, datetime.datetime(2026, 5, 29, 7, 5, 6), datetime.datetime(2026, 5, 29, 7, 5, 5), 'salt', 6.72, 77.53, None, 16.16, 96.89, 3.64, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:05:07.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:05:07.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T07:05:07.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:05, diff=2.563493s, valid=True
2026-05-29T07:05:07.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:05:07.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:05:07.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:12, diff=-4.43311s, valid=True
2026-05-29T07:05:07.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:05:07.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T07:05:07.574 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:01, diff=6.574841s, valid=True
2026-05-29T07:05:07.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:05:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:05:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:05:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:05:07.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:05:07.575 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:05:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:12, diff=-4.421581s, valid=True
2026-05-29T07:05:07.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:05:07.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:05:07.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:05:07.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963749.579222s, valid=True
2026-05-29T07:05:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:05:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:05:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:05:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:05:07.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:05:07.643 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:05:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:05:07.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:05:07.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:05:07.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:05:07.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:05:07.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:05:07.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:05:07.900 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:05:08.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:05:08.443 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:05:08.544 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:05:08.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:05:08.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-29T07:05:08.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-29T07:05:08.735 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:05:08.736 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:05:38.766 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:05:38.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:05:38.766 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:05:39.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:05:39.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:05:39.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:05:39.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-29T07:05:39.464 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:05:39.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-29T07:05:39.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:05:39.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:05:39.480 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:05:39.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-29T07:05:42.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-29T07:05:42.516 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:05:42.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:05:42.524 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:05:42.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:05:42.533 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:05:42.546 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:05:42.547 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:05:42.547 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:05:42.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:05:42.549 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:05:42.549 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:05:42.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:05:42.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:05:42.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:05:42.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:05:42.756 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:05:42.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:05:42.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:05:42.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:05:42.840 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:05:42.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:05:42.845 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:05:42.845 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:05:42.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:05:36
2026-05-29T07:05:42.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71197, datetime.datetime(2026, 5, 29, 7, 5, 36), datetime.datetime(2026, 5, 29, 7, 5, 36), 'salt', 6.82, 77.93, None, 16.37, 93.75, 3.57, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:05:42.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:05:42.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:05:42.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:36, diff=6.912831s, valid=True
2026-05-29T07:05:42.912 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:05:42.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:05:42.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:12, diff=-29.08392s, valid=True
2026-05-29T07:05:42.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:05:42.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:05:42.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:05:31, diff=11.92359s, valid=True
2026-05-29T07:05:42.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:05:42.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:05:42.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:05:42.923 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:05:42.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:05:42.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:05:42.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:12, diff=-29.072928s, valid=True
2026-05-29T07:05:42.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:05:42.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:05:42.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:05:42.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963784.927843s, valid=True
2026-05-29T07:05:42.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:05:42.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:05:42.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:05:42.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:05:42.929 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:05:42.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:05:42.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:05:42.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:05:43.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:05:43.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:05:43.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:05:43.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:05:43.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:05:43.247 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:05:43.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:05:43.853 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:05:43.954 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:05:43.954 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:05:43.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-29T07:05:43.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-29T07:05:44.149 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:05:44.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:06:14.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:06:14.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:06:14.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:06:14.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:06:14.467 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:06:14.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:06:14.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-29T07:06:14.675 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:06:14.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-29T07:06:14.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:06:14.689 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:06:14.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:06:14.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-29T07:06:18.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-29T07:06:18.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:06:18.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:06:18.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:06:18.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:06:18.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:06:18.652 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:06:18.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:06:18.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:06:18.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:06:18.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:06:18.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:06:18.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:06:18.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:06:18.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:06:18.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:06:18.882 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:06:18.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:06:18.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:06:18.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:06:18.969 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:06:18.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:06:18.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:06:18.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:06:19.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:06:06
2026-05-29T07:06:19.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71198, datetime.datetime(2026, 5, 29, 7, 6, 6), datetime.datetime(2026, 5, 29, 7, 6, 6), 'salt', 6.79, 78.16, None, 14.61, 94.87, 3.53, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:06:19.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:06:19.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:06:19.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:06, diff=13.041261s, valid=True
2026-05-29T07:06:19.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:06:19.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:06:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:12, diff=7.044643s, valid=True
2026-05-29T07:06:19.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:06:19.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:06:19.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:01, diff=18.052605s, valid=True
2026-05-29T07:06:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:06:19.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:06:19.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:06:19.052 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:06:19.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:06:19.053 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:06:19.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:12, diff=7.056198s, valid=True
2026-05-29T07:06:19.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:06:19.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:06:19.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:06:19.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963821.056996s, valid=True
2026-05-29T07:06:19.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:06:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:06:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:06:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:06:19.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:06:19.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:06:19.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:06:19.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:06:19.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:06:19.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:06:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:06:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:06:19.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:06:19.380 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:06:19.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:06:19.936 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:06:20.046 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:06:20.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:06:20.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-29T07:06:20.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-29T07:06:20.241 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:06:20.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:06:50.271 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:06:50.271 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:06:50.271 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:06:50.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:06:50.455 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:06:50.662 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:06:50.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-29T07:06:50.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:06:50.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-29T07:06:50.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:06:50.688 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:06:50.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:06: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-29T07:06:53.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-29T07:06:53.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:06:53.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:06:53.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:06:53.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:06:53.623 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:06:53.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:06:53.636 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:06:53.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:06:53.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:06:53.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:06:53.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:06:53.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:06:53.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:06:53.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:06:53.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:06:53.862 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:06:53.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:06:53.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:06:53.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:06:53.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:06:53.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:06:53.953 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:06:53.953 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:06:54.013 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:06:37
2026-05-29T07:06:54.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71199, datetime.datetime(2026, 5, 29, 7, 6, 37), datetime.datetime(2026, 5, 29, 7, 6, 36), 'salt', 6.89, 78.53, None, 16.3, 92.97, 3.47, 832.38, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:06:54.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:06:54.013 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:06:54.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:36, diff=18.020456s, valid=True
2026-05-29T07:06:54.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:06:54.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:06:54.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:12, diff=-17.976087s, valid=True
2026-05-29T07:06:54.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:06:54.024 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:06:54.031 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:06:31, diff=23.031842s, valid=True
2026-05-29T07:06:54.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:06:54.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:06:54.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:06:54.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:06:54.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:06:54.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:06:54.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:12, diff=-17.964564s, valid=True
2026-05-29T07:06:54.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:06:54.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:06:54.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:06:54.036 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963856.036238s, valid=True
2026-05-29T07:06:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:06:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:06:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:06:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:06:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:06:54.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:06:54.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:06:54.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:06:54.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:06:54.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:06:54.234 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:06:54.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:06:54.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:06:54.424 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:06:54.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:06:54.967 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:06:55.067 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:06:55.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:06:55.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-29T07:06:55.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-29T07:06:55.274 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:06:55.274 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:07:25.304 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:07:25.305 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:07: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-29T07:07:25.628 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:07:25.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:07:25.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:07:25.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:07:25.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:07:25.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-29T07:07:25.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:07:25.873 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:07:25.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:07:25.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:07:28.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-29T07:07:28.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:07:28.749 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:07:28.750 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:07:28.750 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:07:28.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:07:28.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:07:28.773 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:07:28.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:07:28.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:07:28.774 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:07:28.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:07:28.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:07:28.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:07:28.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:07:29.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:07:29.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:07:29.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:07:29.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:07:29.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:07:29.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:07:29.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:07:29.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:07:29.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:07:29.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:07:07
2026-05-29T07:07:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71200, datetime.datetime(2026, 5, 29, 7, 7, 7), datetime.datetime(2026, 5, 29, 7, 7, 6), 'salt', 6.79, 78.7, None, 14.4, 91.19, 3.43, 832.56, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:07:29.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:07:29.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:07:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:06, diff=23.15864s, valid=True
2026-05-29T07:07:29.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:07:29.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:07:29.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:12, diff=17.162047s, valid=True
2026-05-29T07:07:29.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:07:29.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:02, diff=27.169987s, valid=True
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:07:29.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:07:29.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:07:12, diff=17.173565s, valid=True
2026-05-29T07:07:29.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:07:29.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:07:29.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:07:29.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963891.174347s, valid=True
2026-05-29T07:07:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:07:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:07:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:07:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:07:29.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:07:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:07:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:07:29.239 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:07:29.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:07:29.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:07:29.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:07:29.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:07:29.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:07:29.497 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:07:29.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:07:30.051 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:07:30.155 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:07:30.155 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:07:30.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-29T07:07:30.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-29T07:07:35.005 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:07:35.005 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:08:05.025 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:08:05.025 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:08:05.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:08:05.336 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:08:05.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:08:05.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:08:05.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-29T07:08:05.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:08:05.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-29T07:08:05.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:08:05.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:08:05.603 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:08:05.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-29T07:08:08.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-29T07:08:08.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:08:08.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:08:08.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:08:08.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:08:08.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:08:08.580 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:08:08.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:08:08.581 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:08:08.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:08:08.582 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:08:08.582 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:08:08.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:08:08.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from salt
2026-05-29T07:08:08.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:08:08.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1430 rows from monet
2026-05-29T07:08:08.817 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:08:08.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:08:08.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:08:08.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:08:08.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:08:08.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:08:08.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:08:08.907 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:08:08.967 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:08:07
2026-05-29T07:08:08.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71202, datetime.datetime(2026, 5, 29, 7, 8, 7), datetime.datetime(2026, 5, 29, 7, 8, 7), 'salt', 6.69, 78.7, None, 13.76, 86.63, 3.43, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:08:08.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:08:08.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 10 fields
2026-05-29T07:08:08.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:07, diff=1.974438s, valid=True
2026-05-29T07:08:08.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:08:08.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:08:08.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:12, diff=-3.022191s, valid=True
2026-05-29T07:08:08.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:08:08.978 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1430 rows. Structure expected: 11 fields
2026-05-29T07:08:08.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:04, diff=4.98578s, valid=True
2026-05-29T07:08:08.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:08:08.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:08:08.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:08:08.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:08:08.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:08:08.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:08:08.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:12, diff=-3.010568s, valid=True
2026-05-29T07:08:08.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:08:08.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:08:08.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:08:08.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963930.990247s, valid=True
2026-05-29T07:08:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:08:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:08:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:08:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:08:08.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:08:09.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:08:09.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:08:09.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:08:09.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:08:09.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:08:09.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:08:09.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:08:09.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:08:09.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:08:09.588 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:08:09.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:08:10.082 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:08:10.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:08:10.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-29T07:08:10.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-29T07:08:10.280 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:08:10.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:08:40.310 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:08:40.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:08:40.311 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:08:40.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:08:40.629 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:08:40.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:08:40.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-29T07:08:40.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:08:40.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-29T07:08:40.855 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:08:40.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:08:40.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:08:40.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-29T07:08:43.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:08:43.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:08:43.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:08:43.923 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:08:43.923 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:08:43.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:08:43.947 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:08:43.947 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:08:43.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:08:43.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:08:43.948 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:08:43.948 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:08:43.954 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:08:44.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:08:44.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:08:44.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:08:44.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:08:44.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:08:44.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:08:44.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:08:44.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:08:44.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:08:44.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:08:44.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:08:44.323 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:08:38
2026-05-29T07:08:44.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71203, datetime.datetime(2026, 5, 29, 7, 8, 38), datetime.datetime(2026, 5, 29, 7, 8, 37), 'salt', 6.72, 78.96, None, 12.56, 86.14, 3.38, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:08:44.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:08:44.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:08:44.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:37, diff=7.33044s, valid=True
2026-05-29T07:08:44.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:08:44.330 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:08:44.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:12, diff=-27.666177s, valid=True
2026-05-29T07:08:44.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:08:44.334 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:08:44.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:08:36, diff=8.341658s, valid=True
2026-05-29T07:08:44.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:08:44.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:08:44.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:08:44.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:08:44.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:08:44.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:08:44.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:12, diff=-27.654747s, valid=True
2026-05-29T07:08:44.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:08:44.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:08:44.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:08:44.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=963966.34605s, valid=True
2026-05-29T07:08:44.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:08:44.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:08:44.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:08:44.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:08:44.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:08:44.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:08:44.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:08:44.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:08:44.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:08:44.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:08:44.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:08:44.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:08:44.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:08:44.671 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:08:44.872 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:08:45.208 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:08:45.306 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:08:45.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:08:45.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-29T07:08:45.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-29T07:08:45.642 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:08:45.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:09:15.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:09:15.672 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:09:15.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:09:15.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:09:15.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:09:16.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:09:16.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:09:16.232 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:09:16.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-29T07:09:16.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:09:16.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:09:16.253 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:09:16.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-29T07:09:18.922 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:09:18.923 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:09:18.930 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:09:18.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:09:18.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:09:18.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:09:18.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:09:18.958 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:09:18.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:09:18.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:09:18.959 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:09:18.959 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:09:18.965 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:09:19.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:09:19.093 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:09:19.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:09:19.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:09:19.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:09:19.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:09:19.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:09:19.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:09:19.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:09:19.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:09:19.284 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:09:19.346 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:09:08
2026-05-29T07:09:19.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71204, datetime.datetime(2026, 5, 29, 7, 9, 8), datetime.datetime(2026, 5, 29, 7, 9, 7), 'salt', 6.62, 79.33, None, 16.02, 87.81, 3.31, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:09:19.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:09:19.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:09:19.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:07, diff=12.353571s, valid=True
2026-05-29T07:09:19.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:09:19.353 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:09:19.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:12, diff=7.356847s, valid=True
2026-05-29T07:09:19.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:09:19.357 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:09:19.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:08, diff=11.364547s, valid=True
2026-05-29T07:09:19.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:09:19.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:09:19.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:09:19.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:09:19.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:09:19.365 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:09:19.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:12, diff=7.368132s, valid=True
2026-05-29T07:09:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:09:19.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:09:19.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:09:19.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964001.368911s, valid=True
2026-05-29T07:09:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:09:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:09:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:09:19.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:09:19.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:09:19.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:09:19.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:09:19.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:09:19.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:09:19.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:09:19.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:09:19.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:09:19.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:09:19.694 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:09:19.902 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:09:20.255 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:09:20.354 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:09:20.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:09:20.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-29T07:09:20.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-29T07:09:20.556 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:09:20.556 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:09:50.586 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:09:50.587 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:09:50.587 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:09:50.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:09:50.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:09:50.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:09:50.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-29T07:09:50.979 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:09:50.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:09:50.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:09:50.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:09:50.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:09:50.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-29T07:09:53.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-29T07:09:53.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:09:53.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:09:53.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:09:53.711 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:09:53.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:09:53.734 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:09:53.734 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:09:53.735 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:09:53.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:09:53.735 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:09:53.736 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:09:53.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:09:53.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:09:53.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:09:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:09:53.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:09:54.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:09:54.015 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:09:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:09:54.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:09:54.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:09:54.061 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:09:54.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:09:54.123 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:09:38
2026-05-29T07:09:54.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71205, datetime.datetime(2026, 5, 29, 7, 9, 38), datetime.datetime(2026, 5, 29, 7, 9, 38), 'salt', 6.56, 79.62, None, 16.55, 91.52, 3.26, 832.5, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:09:54.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:09:54.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:09:54.130 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:38, diff=16.130967s, valid=True
2026-05-29T07:09:54.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:09:54.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:09:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:12, diff=-17.865644s, valid=True
2026-05-29T07:09:54.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:09:54.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:09:33, diff=21.142272s, valid=True
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:09:54.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:09:54.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:12, diff=-17.854148s, valid=True
2026-05-29T07:09:54.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:09:54.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:09:54.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:09:54.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964036.14664s, valid=True
2026-05-29T07:09:54.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:09:54.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:09:54.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:09:54.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:09:54.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:09:54.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:09:54.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:09:54.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:09:54.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:09:54.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:09:54.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:09:54.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:09:54.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:09:54.467 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:09:54.667 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:09:55.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:09:55.158 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:09:55.158 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:09:55.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-29T07:09:55.159 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:09:55.356 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:09:55.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:10:25.360 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:10:25.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:10:25.361 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:10:25.543 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:10:25.558 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:10:25.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:10:25.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-29T07:10:25.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:10:25.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-29T07:10:25.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:10:25.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:10:25.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:10:25.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-29T07:10:28.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-29T07:10:28.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:10:28.556 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:10:28.557 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:10:28.557 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:10:28.567 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:10:28.579 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:10:28.580 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:10:28.580 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:10:28.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:10:28.581 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:10:28.581 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:10:28.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:10:28.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:10:28.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:10:28.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:10:28.812 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:10:28.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:10:28.859 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:10:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:10:28.900 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:10:28.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:10:28.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:10:28.905 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:10:28.966 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:10:08
2026-05-29T07:10:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71206, datetime.datetime(2026, 5, 29, 7, 10, 8), datetime.datetime(2026, 5, 29, 7, 10, 8), 'salt', 6.42, 79.96, None, 17.26, 90.76, 3.2, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:10:28.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:10:28.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:10:28.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:08, diff=20.97381s, valid=True
2026-05-29T07:10:28.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:10:28.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:10:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:12, diff=16.977264s, valid=True
2026-05-29T07:10:28.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:10:28.977 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:03, diff=25.985456s, valid=True
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:10:28.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:10:28.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:10:28.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:12, diff=16.989196s, valid=True
2026-05-29T07:10:28.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:10:28.989 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:10:28.989 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:10:28.990 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964070.99001s, valid=True
2026-05-29T07:10:28.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:10:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:10:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:10:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:10:28.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:10:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:10:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:10:29.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:10:29.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:10:29.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:10:29.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:10:29.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:10:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:10:29.317 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:10:29.519 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:10:29.864 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:10:29.980 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:10:29.980 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:10:29.980 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:10:29.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-29T07:10:30.188 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:10:30.188 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:11:00.217 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:11:00.217 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:11:00.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:11:00.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:11:00.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:11:00.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:11:00.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-29T07:11:00.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:11:00.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-29T07:11:00.631 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:11:00.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:11:00.642 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:11:00.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-29T07:11:03.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-29T07:11:03.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:11:03.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:11:03.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:11:03.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:11:03.378 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:11:03.391 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:11:03.391 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:11:03.392 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:11:03.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:11:03.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:11:03.393 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:11:03.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:11:03.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:11:03.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:11:03.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:11:03.621 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:11:03.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:11:03.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:11:03.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:11:03.710 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:11:03.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:11:03.715 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:11:03.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:11:03.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:10:39
2026-05-29T07:11:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71207, datetime.datetime(2026, 5, 29, 7, 10, 39), datetime.datetime(2026, 5, 29, 7, 10, 38), 'salt', 6.42, 79.92, None, 17.43, 89.85, 3.2, 832.44, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T07:11:03.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:11:03.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:11:03.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:38, diff=25.784333s, valid=True
2026-05-29T07:11:03.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:11:03.784 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:11:03.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:12, diff=-8.212269s, valid=True
2026-05-29T07:11:03.787 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:11:03.787 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:11:03.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:10:33, diff=30.795704s, valid=True
2026-05-29T07:11:03.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:11:03.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:11:03.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:11:03.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:11:03.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:11:03.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:11:03.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:12, diff=-8.200647s, valid=True
2026-05-29T07:11:03.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:11:03.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:11:03.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:11:03.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964105.800146s, valid=True
2026-05-29T07:11:03.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:11:03.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:11:03.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:11:03.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:11:03.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:11:03.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:11:03.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:11:03.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:11:03.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:11:03.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:11:04.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:11:04.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:11:04.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:11:04.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:11:04.328 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:11:04.734 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:11:04.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:11:04.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:11:04.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-29T07:11:04.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-29T07:11:05.027 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:11:05.080 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:11:35.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:11:35.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:11:35.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:11:35.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:11:35.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:11:35.739 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:11: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-29T07:11:35.751 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:11: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-29T07:11:35.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:11:35.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:11:35.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:11: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-29T07:11:38.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-29T07:11:38.426 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:11:38.434 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:11:38.435 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:11:38.436 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:11:38.446 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:11:38.459 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:11:38.460 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:11:38.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:11:38.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:11:38.461 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:11:38.461 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:11:38.468 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:11:38.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:11:38.598 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:11:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:11:38.694 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:11:38.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:11:38.738 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:11:38.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:11:38.776 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:11:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:11:38.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:11:38.781 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:11:38.842 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:11:09
2026-05-29T07:11:38.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71208, datetime.datetime(2026, 5, 29, 7, 11, 9), datetime.datetime(2026, 5, 29, 7, 11, 8), 'salt', 6.72, 80.59, None, 12.0, 93.42, 3.09, 832.56, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:11:38.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:11:38.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:11:38.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:08, diff=30.84978s, valid=True
2026-05-29T07:11:38.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:11:38.849 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:11:38.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:12, diff=26.853114s, valid=True
2026-05-29T07:11:38.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:11:38.853 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:03, diff=35.860998s, valid=True
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:11:38.861 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:11:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:11:12, diff=26.86449s, valid=True
2026-05-29T07:11:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:11:38.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:11:38.864 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:11:38.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964140.865259s, valid=True
2026-05-29T07:11:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:11:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:11:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:11:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:11:38.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:11:38.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:11:38.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:11:38.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:11:38.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:11:39.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:11:39.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:11:39.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:11:39.150 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:11:39.189 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:11:39.393 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:11:39.730 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:11:39.829 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:11:39.830 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:11:39.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-29T07:11:39.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-29T07:11:40.001 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:11:40.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:12:10.030 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:12:10.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:12:10.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:12:10.316 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:12:10.326 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:12:10.521 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:12:10.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-29T07:12:10.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:12:10.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-29T07:12:10.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:12:10.548 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:12:10.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:12:10.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-29T07:12:13.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-29T07:12:13.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:12:13.220 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:12:13.221 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:12:13.221 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:12:13.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:12:13.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:12:13.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:12:13.246 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:12:13.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:12:13.247 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:12:13.247 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:12:13.254 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:12:13.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:12:13.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:12:13.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:12:13.477 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:12:13.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:12:13.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:12:13.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:12:13.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:12:13.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:12:13.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:12:13.568 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:12:13.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:12:09
2026-05-29T07:12:13.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71210, datetime.datetime(2026, 5, 29, 7, 12, 9), datetime.datetime(2026, 5, 29, 7, 12, 9), 'salt', 6.76, 80.19, None, 17.01, 90.93, 3.17, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:12:13.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:12:13.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:12:13.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:09, diff=4.637268s, valid=True
2026-05-29T07:12:13.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:12:13.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:12:13.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:12, diff=1.640717s, valid=True
2026-05-29T07:12:13.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:12:13.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:12:13.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:06, diff=7.648765s, valid=True
2026-05-29T07:12:13.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:12:13.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:12:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:12:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:12:13.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:12:13.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:12:13.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:12, diff=1.652431s, valid=True
2026-05-29T07:12:13.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:12:13.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:12:13.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:12:13.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964175.653244s, valid=True
2026-05-29T07:12:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:12:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:12:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:12:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:12:13.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:12:13.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:12:13.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:12:13.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:12:13.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:12:13.791 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:12:13.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:12:13.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:12:13.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:12:13.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:12:14.246 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:12:14.581 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:12:14.681 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:12:14.682 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:12:14.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-29T07:12:14.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-29T07:12:14.860 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:12:14.860 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:12:44.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:12:44.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:12:44.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:12:45.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:12:45.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:12:45.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:12:45.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-29T07:12:45.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:12:45.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-29T07:12:45.437 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:12:45.438 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:12:45.441 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:12:45.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-29T07:12:48.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-29T07:12:48.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:12:48.038 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:12:48.039 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:12:48.039 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:12:48.049 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:12:48.062 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:12:48.063 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:12:48.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:12:48.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:12:48.064 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:12:48.065 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:12:48.071 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:12:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:12:48.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:12:48.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:12:48.290 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:12:48.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:12:48.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:12:48.371 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:12:48.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:12:48.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:12:48.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:12:48.376 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:12:48.436 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:12:41
2026-05-29T07:12:48.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71211, datetime.datetime(2026, 5, 29, 7, 12, 41), datetime.datetime(2026, 5, 29, 7, 12, 39), 'salt', 6.62, 80.19, None, 15.49, 91.54, 3.16, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:12:48.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:12:48.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:12:48.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:39, diff=9.443067s, valid=True
2026-05-29T07:12:48.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:12:48.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:12:48.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:12, diff=-23.553773s, valid=True
2026-05-29T07:12:48.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:12:48.446 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:12:48.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:12:37, diff=11.453696s, valid=True
2026-05-29T07:12:48.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:12:48.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:12:48.453 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:12:48.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:12:48.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:12:48.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:12:48.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:12, diff=-23.542919s, valid=True
2026-05-29T07:12:48.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:12:48.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:12:48.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:12:48.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964210.457839s, valid=True
2026-05-29T07:12:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:12:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:12:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:12:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:12:48.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:12:48.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:12:48.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:12:48.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:12:48.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:12:48.593 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:12:48.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:12:48.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:12:48.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:12:48.779 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:12:48.984 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:12:49.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:12:49.420 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:12:49.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:12:49.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-29T07:12:49.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-29T07:12:49.597 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:12:49.597 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:13:19.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:13:19.611 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:13:19.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:13:19.738 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:13:19.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:13:19.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:13:19.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:13:19.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:13:19.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-29T07:13:19.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:13:19.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:13:19.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:13:19.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-29T07:13:22.671 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:13:22.672 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:13:22.679 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:13:22.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:13:22.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:13:22.691 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:13:22.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:13:22.704 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:13:22.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:13:22.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:13:22.705 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:13:22.705 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:13:22.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:13:22.835 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:13:22.836 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:13:22.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:13:22.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:13:22.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:13:22.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:13:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:13:23.017 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:13:23.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:13:23.022 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:13:23.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:13:23.082 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:13:11
2026-05-29T07:13:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71212, datetime.datetime(2026, 5, 29, 7, 13, 11), datetime.datetime(2026, 5, 29, 7, 13, 11), 'salt', 6.56, 80.99, None, 13.76, 89.47, 3.02, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:13:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:13:23.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:13:23.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:11, diff=12.089875s, valid=True
2026-05-29T07:13:23.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:13:23.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:13:23.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:12, diff=11.093294s, valid=True
2026-05-29T07:13:23.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:13:23.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:09, diff=14.101312s, valid=True
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:13:23.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:13:23.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:12, diff=11.105018s, valid=True
2026-05-29T07:13:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:13:23.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:13:23.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:13:23.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964245.105822s, valid=True
2026-05-29T07:13:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:13:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:13:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:13:23.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:13:23.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:13:23.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:13:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:13:23.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:13:23.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:13:23.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:13:23.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:13:23.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:13:23.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:13:23.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:13:23.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:13:24.036 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:13:24.135 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:13:24.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:13:24.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-29T07:13:24.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-29T07:13:24.338 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:13:24.338 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:13:54.368 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:13:54.368 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:13:54.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:13:54.532 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:13:54.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:13:54.748 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:13:54.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-29T07:13:54.760 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:13:54.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-29T07:13:54.772 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:13:54.772 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:13:54.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:13:54.780 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:13:57.432 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:13:57.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:13:57.440 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:13:57.441 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:13:57.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:13:57.451 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:13:57.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:13:57.464 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:13:57.465 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:13:57.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:13:57.465 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:13:57.465 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:13:57.473 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:13:57.604 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:13:57.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:13:57.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:13:57.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:13:57.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:13:57.747 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:13:57.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:13:57.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:13:57.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:13:57.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:13:57.793 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:13:57.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:13:43
2026-05-29T07:13:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71213, datetime.datetime(2026, 5, 29, 7, 13, 43), datetime.datetime(2026, 5, 29, 7, 13, 41), 'salt', 6.46, 81.22, None, 14.82, 88.65, 2.98, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:13:57.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:13:57.870 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:13:57.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:41, diff=16.877387s, valid=True
2026-05-29T07:13:57.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:13:57.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:13:57.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:12, diff=-14.116524s, valid=True
2026-05-29T07:13:57.883 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:13:57.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:13:57.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:13:40, diff=17.892906s, valid=True
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:13:57.893 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:13:57.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:12, diff=-14.103445s, valid=True
2026-05-29T07:13:57.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:13:57.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:13:57.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:13:57.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964279.897363s, valid=True
2026-05-29T07:13:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:13:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:13:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:13:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:13:57.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:13:57.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:13:57.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:13:57.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:13:57.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:13:58.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:13:58.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:13:58.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:13:58.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:13:58.223 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:13:58.428 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:13:58.767 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:13:58.866 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:13:58.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:13:58.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-29T07:13:58.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-29T07:13:59.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:13:59.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:14:29.154 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:14:29.154 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:14: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-29T07:14:29.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:14:29.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:14:29.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:14:29.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-29T07:14:29.530 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:14:29.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-29T07:14:29.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:14:29.541 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:14:29.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:14: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-29T07:14:32.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-29T07:14:32.094 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:14:32.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:14:32.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:14:32.102 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:14:32.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:14:32.125 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:14:32.126 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:14:32.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:14:32.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:14:32.127 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:14:32.127 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:14:32.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:14:32.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:14:32.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:14:32.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:14:32.363 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:14:32.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:14:32.408 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:14:32.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:14:32.451 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:14:32.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:14:32.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:14:32.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:14:32.517 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:14:13
2026-05-29T07:14:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71214, datetime.datetime(2026, 5, 29, 7, 14, 13), datetime.datetime(2026, 5, 29, 7, 14, 13), 'salt', 6.46, 81.45, None, 16.44, 91.23, 2.94, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:14:32.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:14:32.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:14:32.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:13, diff=19.524346s, valid=True
2026-05-29T07:14:32.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:14:32.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:14:32.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:12, diff=20.527761s, valid=True
2026-05-29T07:14:32.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:14:32.527 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:14:32.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:11, diff=21.535539s, valid=True
2026-05-29T07:14:32.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:14:32.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:14:32.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:14:32.535 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:14:32.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:14:32.536 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:14:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:12, diff=20.539145s, valid=True
2026-05-29T07:14:32.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:14:32.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:14:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:14:32.539 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964314.539935s, valid=True
2026-05-29T07:14:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:14:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:14:32.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:14:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:14:32.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:14:32.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:14:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:14:32.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:14:32.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:14:32.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:14:32.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:14:32.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:14:32.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:14:32.932 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:14:33.137 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:14:33.476 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:14:33.576 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:14:33.576 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:14:33.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-29T07:14:33.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-29T07:14:33.761 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:14:33.761 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:15:03.775 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:15:03.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:15:03.776 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:15:04.210 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:15:04.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:15:04.448 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:15:04.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-29T07:15:04.459 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:15:04.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-29T07:15:04.471 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:15:04.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:15:04.476 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:15:04.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-29T07:15:07.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-29T07:15:07.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:15:07.036 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:15:07.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:15:07.037 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:15:07.047 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:15:07.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:15:07.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:15:07.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:15:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:15:07.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:15:07.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:15:07.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:15:07.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:15:07.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:15:07.293 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:15:07.294 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:15:07.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:15:07.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:15:07.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:15:07.381 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:15:07.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:15:07.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:15:07.386 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:15:07.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:14:44
2026-05-29T07:15:07.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71215, datetime.datetime(2026, 5, 29, 7, 14, 44), datetime.datetime(2026, 5, 29, 7, 14, 43), 'salt', 6.26, 81.52, None, 17.26, 99.29, 2.92, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:15:07.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:15:07.450 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:15:07.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:43, diff=24.457498s, valid=True
2026-05-29T07:15:07.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:15:07.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:15:07.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:12, diff=-4.539058s, valid=True
2026-05-29T07:15:07.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:15:07.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:15:07.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:14:43, diff=24.468953s, valid=True
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:15:07.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:15:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:12, diff=-4.52747s, valid=True
2026-05-29T07:15:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:15:07.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:15:07.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:15:07.473 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964349.473339s, valid=True
2026-05-29T07:15:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:15:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:15:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:15:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:15:07.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:15:07.538 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:15:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:15:07.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:15:07.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:15:07.612 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:15:07.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:15:07.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:15:07.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:15:07.795 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:15:07.998 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:15:08.336 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:15:08.436 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:15:08.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:15:08.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-29T07:15:08.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-29T07:15:08.612 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:15:08.612 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:15:38.621 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:15:38.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:15:38.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:15:38.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:15:38.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:15:39.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:15:39.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-29T07:15:39.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:15:39.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-29T07:15:39.084 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:15:39.084 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:15:39.091 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:15:39.092 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:15:41.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-29T07:15:41.800 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:15:41.808 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:15:41.809 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:15:41.810 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:15:41.821 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:15:41.833 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:15:41.834 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:15:41.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:15:41.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:15:41.835 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:15:41.835 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:15:41.843 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:15:41.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:15:41.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:15:42.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:15:42.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:15:42.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:15:42.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:15:42.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:15:42.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:15:42.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:15:42.133 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:15:42.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:15:42.195 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:15:14
2026-05-29T07:15:42.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71216, datetime.datetime(2026, 5, 29, 7, 15, 14), datetime.datetime(2026, 5, 29, 7, 15, 14), 'salt', 6.33, 82.21, None, 16.94, 87.15, 2.81, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:15:42.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:15:42.196 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:15:42.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:14, diff=28.20277s, valid=True
2026-05-29T07:15:42.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:15:42.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:15:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:12, diff=30.206022s, valid=True
2026-05-29T07:15:42.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:15:42.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:05, diff=37.213539s, valid=True
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:15:42.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:15:42.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:15:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:15:12, diff=30.217032s, valid=True
2026-05-29T07:15:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:15:42.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:15:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:15:42.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964384.217792s, valid=True
2026-05-29T07:15:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:15:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:15:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:15:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:15:42.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:15:42.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:15:42.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:15:42.283 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:15:42.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:15:42.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:15:42.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:15:42.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:15:42.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:15:42.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:15:42.745 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:15:43.086 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:15:43.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:15:43.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:15:43.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-29T07:15:43.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-29T07:15:43.441 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:15:43.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:16:13.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:16:13.444 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:16:13.444 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:16:13.756 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:16:13.770 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:16:13.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:16:13.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:16:13.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:16:13.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:16:13.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:16:13.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:16:13.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:16:13.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-29T07:16:16.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-29T07:16:16.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:16:16.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:16:16.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:16:16.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:16:16.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:16:16.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:16:16.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:16:16.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:16:16.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:16:16.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:16:16.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:16:16.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:16:16.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:16:16.852 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:16:16.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:16:16.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:16:16.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:16:16.987 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:16:17.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:16:17.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:16:17.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:16:17.030 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:16:17.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:16:17.089 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:16:14
2026-05-29T07:16:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71218, datetime.datetime(2026, 5, 29, 7, 16, 14), datetime.datetime(2026, 5, 29, 7, 16, 14), 'salt', 6.52, 82.65, None, 13.9, 91.21, 2.73, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:16:17.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:16:17.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:16:17.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:14, diff=3.096324s, valid=True
2026-05-29T07:16:17.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:16:17.096 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:16:17.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:12, diff=5.099294s, valid=True
2026-05-29T07:16:17.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:16:17.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:07, diff=10.106462s, valid=True
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:16:17.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:16:17.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:12, diff=5.109843s, valid=True
2026-05-29T07:16:17.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:16:17.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:16:17.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:16:17.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964419.110575s, valid=True
2026-05-29T07:16:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:16:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:16:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:16:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:16:17.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:16:17.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:16:17.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:16:17.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:16:17.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:16:17.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:16:17.307 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:16:17.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:16:17.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:16:17.429 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:16:17.631 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:16:17.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:16:18.123 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:16:18.123 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:16:18.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-29T07:16:18.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-29T07:16:18.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:16:18.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:16:48.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:16:48.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:16:48.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:16:48.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:16:48.644 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:16:48.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:16:48.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:16:48.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:16:48.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-29T07:16:48.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:16:48.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:16:48.874 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:16:48.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-29T07:16:52.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-29T07:16:52.103 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:16:52.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:16:52.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:16:52.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:16:52.122 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:16:52.134 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:16:52.135 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:16:52.135 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:16:52.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:16:52.136 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:16:52.136 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:16:52.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:16:52.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:16:52.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:16:52.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:16:52.305 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:16:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:16:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:16:52.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:16:52.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:16:52.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:16:52.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:16:52.391 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:16:52.448 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:16:45
2026-05-29T07:16:52.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71219, datetime.datetime(2026, 5, 29, 7, 16, 45), datetime.datetime(2026, 5, 29, 7, 16, 44), 'salt', 6.52, 82.78, None, 13.37, 85.46, 2.71, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:16:52.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:16:52.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:16:52.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:44, diff=8.454872s, valid=True
2026-05-29T07:16:52.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:16:52.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:16:52.457 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:12, diff=-19.542128s, valid=True
2026-05-29T07:16:52.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:16:52.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:16:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:16:38, diff=14.464708s, valid=True
2026-05-29T07:16:52.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:16:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:16:52.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:16:52.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:16:52.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:16:52.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:16:52.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:12, diff=-19.532009s, valid=True
2026-05-29T07:16:52.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:16:52.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:16:52.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:16:52.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964454.468726s, valid=True
2026-05-29T07:16:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:16:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:16:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:16:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:16:52.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:16:52.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:16:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:16:52.529 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:16:52.549 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:16:52.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:16:52.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:16:52.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:16:52.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:16:52.818 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:16:53.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:16:53.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:16:53.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:16:53.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:16: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-29T07:16: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-29T07:16:53.611 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:16:53.611 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:17:23.613 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:17:23.614 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:17:23.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:17:24.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:17:24.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:17:24.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:17:24.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-29T07:17:24.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:17:24.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:17:24.349 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:17:24.349 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:17:24.353 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:17:24.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-29T07:17:27.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-29T07:17:27.495 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:17:27.502 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:17:27.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:17:27.503 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:17:27.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:17:27.525 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:17:27.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:17:27.526 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:17:27.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:17:27.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:17:27.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:17:27.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:17:27.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:17:27.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:17:27.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:17:27.763 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:17:27.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:17:27.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:17:27.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:17:27.848 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:17:27.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:17:27.853 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:17:27.853 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:17:27.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:17:15
2026-05-29T07:17:27.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71220, datetime.datetime(2026, 5, 29, 7, 17, 15), datetime.datetime(2026, 5, 29, 7, 17, 15), 'salt', 6.56, 82.81, None, 13.83, 89.5, 2.71, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:17:27.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:17:27.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:17:27.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:15, diff=12.92112s, valid=True
2026-05-29T07:17:27.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:17:27.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:17:27.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:12, diff=15.924538s, valid=True
2026-05-29T07:17:27.924 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:17:27.924 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:10, diff=17.932503s, valid=True
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:17:27.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:17:27.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:17:27.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:12, diff=15.936172s, valid=True
2026-05-29T07:17:27.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:17:27.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:17:27.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:17:27.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964489.936995s, valid=True
2026-05-29T07:17:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:17:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:17:27.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:17:27.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:17:27.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:17:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:17:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:17:28.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:17:28.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:17:28.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:17:28.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:17:28.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:17:28.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:17:28.258 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:17:28.459 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:17:28.866 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:17:28.965 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:17:28.966 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:17:28.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-29T07:17:28.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-29T07:17:29.171 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:17:29.172 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:17:59.177 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:17:59.177 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:17:59.178 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:17:59.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:17:59.510 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:17:59.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:17: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-29T07:17:59.725 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:17:59.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-29T07:17:59.736 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:17:59.736 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:17:59.741 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:17:59.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-29T07:18:02.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-29T07:18:02.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:18:02.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:18:02.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:18:02.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:18:02.153 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:18:02.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:18:02.166 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:18:02.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:18:02.167 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:18:02.167 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:18:02.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:18:02.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:18:02.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:18:02.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:18:02.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:18:02.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:18:02.436 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:18:02.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:18:02.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:18:02.476 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:18:02.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:18:02.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:18:02.481 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:18:02.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:17:45
2026-05-29T07:18:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71221, datetime.datetime(2026, 5, 29, 7, 17, 45), datetime.datetime(2026, 5, 29, 7, 17, 45), 'salt', 6.49, 82.81, None, 14.72, 86.21, 2.7, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:18:02.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:18:02.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:18:02.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:45, diff=17.548582s, valid=True
2026-05-29T07:18:02.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:18:02.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:18:02.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:12, diff=-9.448044s, valid=True
2026-05-29T07:18:02.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:18:02.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:18:02.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:17:42, diff=20.559865s, valid=True
2026-05-29T07:18:02.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:18:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:18:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:18:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:18:02.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:18:02.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:18:02.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:12, diff=-9.436506s, valid=True
2026-05-29T07:18:02.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:18:02.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:18:02.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:18:02.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964524.564285s, valid=True
2026-05-29T07:18:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:18:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:18:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:18:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:18:02.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:18:02.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:18:02.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:18:02.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:18:02.650 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:18:02.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:18:02.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:18:02.798 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:18:02.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:18:02.894 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:18:03.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:18:03.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:18:03.588 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:18:03.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:18:03.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-29T07:18:03.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-29T07:18:04.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:18:04.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:18:34.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:18:34.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:18:34.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:18:35.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:18:35.154 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:18:35.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:18:35.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-29T07:18:35.373 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:18:35.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-29T07:18:35.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:18:35.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:18:35.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:18:35.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-29T07:18:38.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-29T07:18:38.058 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:18:38.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:18:38.067 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:18:38.067 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:18:38.076 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:18:38.089 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:18:38.090 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:18:38.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:18:38.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:18:38.091 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:18:38.091 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:18:38.098 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:18:38.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:18:38.224 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:18:38.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:18:38.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:18:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:18:38.365 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:18:38.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:18:38.407 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:18:38.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:18:38.413 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:18:38.413 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:18:38.478 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:18:15
2026-05-29T07:18:38.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71222, datetime.datetime(2026, 5, 29, 7, 18, 15), datetime.datetime(2026, 5, 29, 7, 18, 15), 'salt', 6.33, 82.78, None, 17.15, 85.46, 2.71, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:18:38.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:18:38.478 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:18:38.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:15, diff=23.485998s, valid=True
2026-05-29T07:18:38.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:18:38.486 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:18:38.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:12, diff=26.489405s, valid=True
2026-05-29T07:18:38.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:18:38.489 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:13, diff=25.497255s, valid=True
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:18:38.497 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:18:38.500 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:12, diff=26.500903s, valid=True
2026-05-29T07:18:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:18:38.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:18:38.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:18:38.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964560.501702s, valid=True
2026-05-29T07:18:38.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:18:38.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:18:38.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:18:38.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:18:38.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:18:38.567 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:18:38.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:18:38.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:18:38.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:18:38.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:18:38.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:18:38.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:18:38.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:18:38.823 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:18:39.100 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:18:39.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:18:39.539 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:18:39.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:18:39.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-29T07:18:39.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-29T07:18:39.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:18:39.633 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:19:09.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:19:09.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:19:09.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:19:09.797 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:19:09.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:19:10.029 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:19:10.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:19:10.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:19:10.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:19:10.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:19:10.051 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:19:10.056 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:19:10.057 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:19:12.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-29T07:19:12.782 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:19:12.790 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:19:12.791 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:19:12.791 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:19:12.803 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:19:12.815 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:19:12.816 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:19:12.816 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:19:12.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:19:12.817 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:19:12.817 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:19:12.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:19:12.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:19:12.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:19:13.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:19:13.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:19:13.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:19:13.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:19:13.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:19:13.135 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:19:13.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:19:13.140 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:19:13.140 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:19:13.200 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:18:46
2026-05-29T07:19:13.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71223, datetime.datetime(2026, 5, 29, 7, 18, 46), datetime.datetime(2026, 5, 29, 7, 18, 45), 'salt', 6.33, 82.94, None, 16.62, 86.7, 2.68, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:19:13.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:19:13.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:19:13.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:45, diff=28.208069s, valid=True
2026-05-29T07:19:13.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:19:13.208 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:19:13.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:19:12, diff=1.211486s, valid=True
2026-05-29T07:19:13.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:19:13.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:19:13.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:18:45, diff=28.219564s, valid=True
2026-05-29T07:19:13.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:19:13.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:19:13.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:19:13.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:19:13.220 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:19:13.220 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:19:13.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:19:12, diff=1.223193s, valid=True
2026-05-29T07:19:13.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:19:13.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:19:13.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:19:13.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964595.224052s, valid=True
2026-05-29T07:19:13.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:19:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:19:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:19:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:19:13.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:19:13.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:19:13.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:19:13.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:19:13.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:19:13.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:19:13.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:19:13.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:19:13.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:19:13.549 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:19:13.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:19:14.097 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:19:14.199 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:19:14.199 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:19:14.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-29T07:19:14.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-29T07:19:14.412 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:19:14.412 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:19:44.443 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:19:44.443 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:19:44.443 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:19:44.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:19:44.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:19:44.810 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:19:44.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-29T07:19:44.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:19: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-29T07:19:44.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:19:44.829 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:19:44.834 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:19: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-29T07:19:47.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-29T07:19:47.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:19:47.272 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:19:47.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:19:47.273 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:19:47.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:19:47.296 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:19:47.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:19:47.297 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:19:47.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:19:47.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:19:47.298 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:19:47.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:19:47.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:19:47.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:19:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:19:47.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:19:47.570 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:19:47.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:19:47.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:19:47.615 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:19:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:19:47.620 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:19:47.620 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:19:47.680 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:19:46
2026-05-29T07:19:47.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71225, datetime.datetime(2026, 5, 29, 7, 19, 46), datetime.datetime(2026, 5, 29, 7, 19, 46), 'salt', 6.46, 83.04, None, 14.93, 96.38, 2.67, 832.56, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:19:47.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:19:47.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:19:47.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:19:46, diff=1.68771s, valid=True
2026-05-29T07:19:47.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:19:47.687 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:19:47.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:12, diff=-24.30884s, valid=True
2026-05-29T07:19:47.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:19:47.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:19:37, diff=10.699186s, valid=True
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:19:47.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:19:47.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:12, diff=-24.297136s, valid=True
2026-05-29T07:19:47.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:19:47.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:19:47.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:19:47.703 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964629.703691s, valid=True
2026-05-29T07:19:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:19:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:19:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:19:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:19:47.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:19:47.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:19:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:19:47.770 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:19:47.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:19:47.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:19:47.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:19:48.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:19:48.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:19:48.097 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:19:48.302 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:19:48.642 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:19:48.743 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:19:48.743 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:19:48.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-29T07:19:48.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-29T07:19:49.017 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:19:49.017 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:20:19.038 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:20:19.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:20:19.039 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:20:19.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:20:19.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:20:19.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:20:19.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-29T07:20:19.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:20:19.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-29T07:20:19.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:20:19.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:20:19.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:20:19.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-29T07:20:22.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:20:22.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:20:22.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:20:22.020 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:20:22.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:20:22.040 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:20:22.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:20:22.057 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:20:22.057 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:20:22.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:20:22.058 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:20:22.058 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:20:22.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:20:22.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:20:22.195 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:20:22.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:20:22.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:20:22.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:20:22.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:20:22.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:20:22.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:20:22.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:20:22.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:20:22.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:20:22.452 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:20:17
2026-05-29T07:20:22.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71226, datetime.datetime(2026, 5, 29, 7, 20, 17), datetime.datetime(2026, 5, 29, 7, 20, 16), 'salt', 6.39, 82.84, None, 14.26, 91.37, 2.69, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:20:22.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:20:22.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:20:22.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:16, diff=6.459989s, valid=True
2026-05-29T07:20:22.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:20:22.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:20:22.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:12, diff=10.463356s, valid=True
2026-05-29T07:20:22.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:20:22.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:08, diff=14.471231s, valid=True
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:20:22.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:20:22.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:12, diff=10.47495s, valid=True
2026-05-29T07:20:22.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:20:22.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:20:22.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:20:22.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964664.475757s, valid=True
2026-05-29T07:20:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:20:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:20:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:20:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:20:22.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:20:22.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:20:22.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:20:22.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:20:22.562 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:20:22.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:20:22.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:20:22.708 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:20:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:20:22.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:20:22.999 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:20:23.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:20:23.437 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:20:23.437 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:20:23.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-29T07:20:23.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-29T07:20:23.643 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:20:23.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:20:53.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:20:53.702 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:20:53.702 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:20:54.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:20:54.054 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:20:54.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:20:54.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-29T07:20:54.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:20:54.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-29T07:20:54.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:20:54.289 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:20:54.293 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:20:54.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-29T07:20:56.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-29T07:20:56.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:20:56.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:20:56.979 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:20:56.979 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:20:56.990 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:20:57.003 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:20:57.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:20:57.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:20:57.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:20:57.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:20:57.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:20:57.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:20:57.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:20:57.142 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:20:57.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:20:57.249 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:20:57.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:20:57.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:20:57.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:20:57.336 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:20:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:20:57.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:20:57.341 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:20:57.404 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:20:47
2026-05-29T07:20:57.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71227, datetime.datetime(2026, 5, 29, 7, 20, 47), datetime.datetime(2026, 5, 29, 7, 20, 46), 'salt', 6.29, 82.65, None, 15.1, 93.51, 2.73, 832.38, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:20:57.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:20:57.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:20:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:46, diff=11.411758s, valid=True
2026-05-29T07:20:57.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:20:57.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:20:57.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:12, diff=-14.584688s, valid=True
2026-05-29T07:20:57.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:20:57.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:20:40, diff=17.423493s, valid=True
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:20:57.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:20:57.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:20:57.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:12, diff=-14.572838s, valid=True
2026-05-29T07:20:57.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:20:57.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:20:57.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:20:57.428 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964699.428008s, valid=True
2026-05-29T07:20:57.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:20:57.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:20:57.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:20:57.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:20:57.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:20:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:20:57.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:20:57.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:20:57.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:20:57.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:20:57.693 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:20:57.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:20:57.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:20:57.815 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:20:58.017 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:20:58.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:20:58.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:20:58.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:20:58.456 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:20:58.456 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:20:58.720 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:20:58.721 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:21:28.751 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:21:28.751 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:21:28.751 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:21:29.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:21:29.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:21:29.527 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:21:29.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-29T07:21:29.538 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:21:29.538 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:21:29.547 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:21:29.547 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:21:29.552 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:21:29.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-29T07:21: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-29T07:21:31.902 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:21:31.909 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:21:31.910 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:21:31.910 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:21:31.920 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:21:31.933 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:21:31.933 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:21:31.934 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:21:31.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:21:31.935 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:21:31.935 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:21:31.941 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:21:32.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:21:32.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:21:32.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:21:32.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:21:32.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:21:32.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:21:32.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:21:32.259 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:21:32.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:21:32.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:21:32.264 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:21:32.322 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:21:17
2026-05-29T07:21:32.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71228, datetime.datetime(2026, 5, 29, 7, 21, 17), datetime.datetime(2026, 5, 29, 7, 21, 17), 'salt', 6.26, 82.78, None, 14.26, 93.16, 2.71, 832.5, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:21:32.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:21:32.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:21:32.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:17, diff=15.329659s, valid=True
2026-05-29T07:21:32.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:21:32.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:21:32.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:12, diff=20.333213s, valid=True
2026-05-29T07:21:32.333 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:21:32.333 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:11, diff=21.341344s, valid=True
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:21:32.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:21:32.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:12, diff=20.345221s, valid=True
2026-05-29T07:21:32.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:21:32.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:21:32.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:21:32.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964734.346051s, valid=True
2026-05-29T07:21:32.347 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:21:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:21:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:21:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:21:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:21:32.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:21:32.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:21:32.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:21:32.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:21:32.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:21:32.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:21:32.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:21:32.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:21:32.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:21:32.876 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:21:33.227 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:21:33.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:21:33.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:21:33.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-29T07:21:33.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-29T07:21:33.401 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:21:33.401 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:22:03.420 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:22:03.420 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:22:03.421 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:22:03.562 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:22:03.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:22:03.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:22:03.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-29T07:22:03.852 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:22:03.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-29T07:22:03.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:22:03.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:22:03.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:22:03.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-29T07:22:06.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-29T07:22:06.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:22:06.285 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:22:06.287 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:22:06.287 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:22:06.298 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:22:06.310 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:22:06.311 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:22:06.311 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:22:06.312 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:22:06.312 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:22:06.312 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:22:06.317 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:22:06.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:22:06.445 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:22:06.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:22:06.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:22:06.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:22:06.586 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:22:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:22:06.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:22:06.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:22:06.632 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:22:06.632 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:22:06.691 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:21:47
2026-05-29T07:22:06.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71229, datetime.datetime(2026, 5, 29, 7, 21, 47), datetime.datetime(2026, 5, 29, 7, 21, 47), 'salt', 6.16, 83.14, None, 15.53, 94.43, 2.64, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:22:06.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:22:06.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:22:06.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:47, diff=19.699217s, valid=True
2026-05-29T07:22:06.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:22:06.699 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:22:06.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:12, diff=-5.297358s, valid=True
2026-05-29T07:22:06.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:22:06.702 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:22:06.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:21:43, diff=23.710644s, valid=True
2026-05-29T07:22:06.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:22:06.710 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:22:06.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:22:06.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:22:06.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:22:06.711 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:22:06.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:12, diff=-5.285767s, valid=True
2026-05-29T07:22:06.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:22:06.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:22:06.714 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:22:06.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964768.715023s, valid=True
2026-05-29T07:22:06.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:22:06.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:22:06.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:22:06.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:22:06.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:22:06.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:22:06.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:22:06.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:22:06.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:22:06.853 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:22:06.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:22:06.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:22:06.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:22:07.037 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:22:07.242 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:22:07.580 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:22:07.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:22:07.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:22:07.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-29T07:22:07.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-29T07:22:07.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:22:07.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:22:37.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:22:37.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:22:37.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:22:38.452 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:22:38.465 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:22:38.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:22:38.665 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:22:38.677 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:22:38.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-29T07:22:38.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:22:38.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:22:38.694 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:22:38.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-29T07:22:41.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-29T07:22:41.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:22:41.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:22:41.359 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:22:41.359 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:22:41.369 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:22:41.382 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:22:41.383 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:22:41.383 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:22:41.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:22:41.384 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:22:41.384 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:22:41.391 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:22:41.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:22:41.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:22:41.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:22:41.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:22:41.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:22:41.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:22:41.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:22:41.728 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:22:41.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:22:41.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:22:41.734 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:22:41.795 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:22:18
2026-05-29T07:22:41.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71230, datetime.datetime(2026, 5, 29, 7, 22, 18), datetime.datetime(2026, 5, 29, 7, 22, 17), 'salt', 6.19, 83.31, None, 15.42, 94.57, 2.61, 832.44, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:22:41.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:22:41.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:22:41.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:17, diff=24.803001s, valid=True
2026-05-29T07:22:41.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:22:41.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:22:41.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:12, diff=29.806535s, valid=True
2026-05-29T07:22:41.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:22:41.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:22:41.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:14, diff=27.814539s, valid=True
2026-05-29T07:22:41.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:22:41.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:22:41.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:22:41.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:22:41.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:22:41.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:22:41.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:12, diff=29.818365s, valid=True
2026-05-29T07:22:41.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:22:41.818 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:22:41.818 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:22:41.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964803.8192s, valid=True
2026-05-29T07:22:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:22:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:22:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:22:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:22:41.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:22:41.885 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:22:41.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:22:41.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:22:41.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:22:41.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:22:42.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:22:42.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:22:42.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:22:42.143 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:22:42.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:22:42.677 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:22:42.833 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:22:42.833 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:22:42.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-29T07:22:42.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-29T07:22:43.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:22:43.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:23:13.067 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:23:13.067 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:23:13.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:23:13.362 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:23:13.375 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:23:13.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:23:13.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-29T07:23:13.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:23:13.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-29T07:23:13.601 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:23:13.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:23:13.609 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:23:13.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-29T07:23:15.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-29T07:23:15.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:23:15.995 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:23:15.996 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:23:15.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:23:16.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:23:16.021 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:23:16.021 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:23:16.022 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:23:16.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:23:16.023 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:23:16.023 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:23:16.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:23:16.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:23:16.163 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:23:16.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:23:16.263 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:23:16.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:23:16.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:23:16.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:23:16.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:23:16.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:23:16.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:23:16.350 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:23:16.409 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:22:48
2026-05-29T07:23:16.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71231, datetime.datetime(2026, 5, 29, 7, 22, 48), datetime.datetime(2026, 5, 29, 7, 22, 48), 'salt', 6.06, 83.64, None, 18.53, 92.2, 2.55, 832.56, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:23:16.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:23:16.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:23:16.415 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:48, diff=28.415874s, valid=True
2026-05-29T07:23:16.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:23:16.416 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:23:16.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:23:12, diff=4.419279s, valid=True
2026-05-29T07:23:16.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:23:16.419 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:22:46, diff=30.427397s, valid=True
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:23:16.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:23:16.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:23:12, diff=4.43108s, valid=True
2026-05-29T07:23:16.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:23:16.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:23:16.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:23:16.431 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964838.431877s, valid=True
2026-05-29T07:23:16.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:23:16.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:23:16.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:23:16.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:23:16.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:23:16.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:23:16.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:23:16.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:23:16.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:23:16.569 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:23:16.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:23:16.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:23:16.711 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:23:16.751 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:23:16.953 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:23:17.292 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:23:17.390 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:23:17.390 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:23:17.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-29T07:23:17.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-29T07:23:17.651 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:23:17.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:23:47.681 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:23:47.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:23:47.682 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:23:48.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:23:48.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:23:48.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:23:48.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-29T07:23:48.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:23:48.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-29T07:23:48.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:23:48.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:23:48.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:23:48.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-29T07:23:50.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-29T07:23:50.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:23:50.598 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:23:50.599 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:23:50.600 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:23:50.607 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:23:50.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:23:50.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:23:50.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:23:50.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:23:50.622 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:23:50.622 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:23:50.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:23:50.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:23:50.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:23:50.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:23:50.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:23:50.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:23:50.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:23:50.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:23:50.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:23:50.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:23:50.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:23:50.934 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:23:50.992 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:23:50
2026-05-29T07:23:50.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71233, datetime.datetime(2026, 5, 29, 7, 23, 50), datetime.datetime(2026, 5, 29, 7, 23, 49), 'salt', 6.42, 84.11, None, 15.95, 91.63, 2.48, 832.5, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:23:50.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:23:50.993 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:23:50.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:23:49, diff=1.999711s, valid=True
2026-05-29T07:23:50.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:23:50.999 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:23:51.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:12, diff=-20.996888s, valid=True
2026-05-29T07:23:51.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:23:51.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:23:51.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:23:49, diff=2.010798s, valid=True
2026-05-29T07:23:51.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:23:51.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:23:51.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:23:51.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:23:51.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:23:51.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:23:51.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:12, diff=-20.985634s, valid=True
2026-05-29T07:23:51.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:23:51.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:23:51.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:23:51.015 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964873.015173s, valid=True
2026-05-29T07:23:51.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:23:51.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:23:51.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:23:51.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:23:51.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:23:51.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:23:51.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:23:51.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:23:51.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:23:51.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:23:51.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:23:51.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:23:51.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:23:51.338 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:23:51.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:23:51.963 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:23:52.063 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:23:52.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:23:52.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-29T07:23:52.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-29T07:23:52.246 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:23:52.246 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:24:22.277 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:24:22.277 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:24:22.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:24:22.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:24:22.431 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:24:22.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:24:22.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-29T07:24:22.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:24:22.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-29T07:24:22.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:24:22.650 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:24:22.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:24:22.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-29T07:24:25.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-29T07:24:25.110 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:24:25.118 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:24:25.119 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:24:25.119 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:24:25.129 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:24:25.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:24:25.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:24:25.142 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:24:25.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:24:25.142 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:24:25.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:24:25.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:24:25.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:24:25.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:24:25.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:24:25.322 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:24:25.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:24:25.367 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:24:25.404 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:24:25.405 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:24:25.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:24:25.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:24:25.411 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:24:25.470 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:24:20
2026-05-29T07:24:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71234, datetime.datetime(2026, 5, 29, 7, 24, 20), datetime.datetime(2026, 5, 29, 7, 24, 19), 'salt', 6.39, 83.74, None, 15.1, 95.41, 2.54, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:24:25.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:24:25.471 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:24:25.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:19, diff=6.477562s, valid=True
2026-05-29T07:24:25.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:24:25.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:24:25.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:12, diff=13.480858s, valid=True
2026-05-29T07:24:25.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:24:25.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:10, diff=15.48836s, valid=True
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:24:25.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:24:25.491 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:12, diff=13.491758s, valid=True
2026-05-29T07:24:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:24:25.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:24:25.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:24:25.492 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964907.492496s, valid=True
2026-05-29T07:24:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:24:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:24:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:24:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:24:25.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:24:25.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:24:25.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:24:25.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:24:25.576 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:24:25.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:24:25.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:24:25.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:24:25.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:24:25.811 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:24:26.023 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:24:26.363 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:24:26.463 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:24:26.463 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:24:26.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-29T07:24:26.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-29T07:24:26.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:24:26.675 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:24:56.699 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:24:56.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:24:56.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:24:57.310 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:24:57.328 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:24:57.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:24:57.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-29T07:24:57.556 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:24: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-29T07:24:57.567 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:24:57.567 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:24:57.574 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:24:57.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-29T07:25:00.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-29T07:25:00.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:25:00.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:25:00.050 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:25:00.051 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:25:00.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:25:00.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:25:00.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:25:00.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:25:00.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:25:00.072 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:25:00.072 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:25:00.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:25:00.175 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:25:00.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:25:00.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:25:00.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:25:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:25:00.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:25:00.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:25:00.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:25:00.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:25:00.358 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:25:00.358 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:25:00.417 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:24:50
2026-05-29T07:25:00.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71235, datetime.datetime(2026, 5, 29, 7, 24, 50), datetime.datetime(2026, 5, 29, 7, 24, 50), 'salt', 6.32, 83.48, None, 16.09, 96.33, 2.58, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:25:00.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:25:00.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:25:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:50, diff=10.424335s, valid=True
2026-05-29T07:25:00.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:25:00.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:25:00.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:12, diff=-11.572437s, valid=True
2026-05-29T07:25:00.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:25:00.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:24:50, diff=10.435097s, valid=True
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:25:00.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:25:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:12, diff=-11.561441s, valid=True
2026-05-29T07:25:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:25:00.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:25:00.438 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:25:00.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964942.439321s, valid=True
2026-05-29T07:25:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:25:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:25:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:25:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:25:00.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:25:00.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:25:00.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:25:00.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:25:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:25:00.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:25:00.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:25:00.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:25:00.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:25:00.832 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:25:01.046 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:25:01.417 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:25:01.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:25:01.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:25:01.518 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:25:01.518 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:25:01.773 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:25:01.773 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:25:31.804 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:25:31.804 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:25:31.809 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:25:32.117 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:25:32.131 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:25:32.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:25:32.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-29T07:25:32.354 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:25:32.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-29T07:25:32.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:25:32.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:25:32.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:25:32.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-29T07:25:34.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-29T07:25:34.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:25:34.747 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:25:34.748 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:25:34.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:25:34.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:25:34.772 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:25:34.772 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:25:34.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:25:34.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:25:34.773 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:25:34.774 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:25:34.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:25:34.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:25:34.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:25:35.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:25:35.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:25:35.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:25:35.046 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:25:35.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:25:35.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:25:35.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:25:35.092 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:25:35.092 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:25:35.151 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:25:20
2026-05-29T07:25:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71236, datetime.datetime(2026, 5, 29, 7, 25, 20), datetime.datetime(2026, 5, 29, 7, 25, 20), 'salt', 6.32, 83.44, None, 17.36, 92.76, 2.59, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:25:35.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:25:35.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:25:35.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:20, diff=15.15899s, valid=True
2026-05-29T07:25:35.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:25:35.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:25:35.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:12, diff=23.162529s, valid=True
2026-05-29T07:25:35.162 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:25:35.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:13, diff=22.170417s, valid=True
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:25:35.170 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:25:35.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:12, diff=23.174071s, valid=True
2026-05-29T07:25:35.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:25:35.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:25:35.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:25:35.174 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=964977.174869s, valid=True
2026-05-29T07:25:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:25:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:25:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:25:35.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:25:35.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:25:35.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:25:35.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:25:35.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:25:35.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:25:35.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:25:35.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:25:35.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:25:35.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:25:35.499 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:25:35.713 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:25:36.071 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:25:36.178 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:25:36.178 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:25:36.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-29T07:25:36.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-29T07:25:36.263 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:25:36.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:26:06.267 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:26:06.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:26:06.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:26:06.564 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:26:06.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:26:06.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:26:06.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-29T07:26:06.781 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:26:06.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-29T07:26:06.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:26:06.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:26:06.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:26:06.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-29T07:26:09.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-29T07:26:09.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:26:09.225 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:26:09.226 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:26:09.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:26:09.236 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:26:09.249 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:26:09.249 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:26:09.250 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:26:09.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:26:09.251 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:26:09.251 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:26:09.258 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:26:09.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:26:09.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:26:09.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:26:09.478 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:26:09.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:26:09.521 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:26:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:26:09.564 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:26:09.568 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:26:09.569 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:26:09.569 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:26:09.629 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:25:51
2026-05-29T07:26:09.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71237, datetime.datetime(2026, 5, 29, 7, 25, 51), datetime.datetime(2026, 5, 29, 7, 25, 50), 'salt', 6.23, 83.48, None, 17.68, 96.02, 2.59, 832.56, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:26:09.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:26:09.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:26:09.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:50, diff=19.636231s, valid=True
2026-05-29T07:26:09.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:26:09.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:26:09.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:12, diff=-2.360407s, valid=True
2026-05-29T07:26:09.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:26:09.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:25:44, diff=25.647484s, valid=True
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:26:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:26:09.648 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:26:09.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:12, diff=-2.348865s, valid=True
2026-05-29T07:26:09.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:26:09.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:26:09.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:26:09.651 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965011.65193s, valid=True
2026-05-29T07:26:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:26:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:26:09.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:26:09.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:26:09.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:26:09.716 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:26:09.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:26:09.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:26:09.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:26:09.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:26:09.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:26:09.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:26:10.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:26:10.062 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:26:10.278 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:26:10.620 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:26:10.722 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:26:10.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:26:10.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-29T07:26:10.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-29T07:26:10.977 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:26:10.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:26:41.004 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:26:41.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:26:41.004 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:26:41.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:26:41.171 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:26:41.370 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:26:41.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-29T07:26:41.382 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:26:41.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-29T07:26:41.392 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:26:41.392 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:26:41.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:26:41.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-29T07:26:44.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-29T07:26:44.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:26:44.247 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:26:44.248 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:26:44.248 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:26:44.259 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:26:44.272 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:26:44.273 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:26:44.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:26:44.273 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:26:44.274 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:26:44.274 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:26:44.279 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:26:44.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:26:44.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:26:44.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:26:44.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:26:44.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:26:44.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:26:44.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:26:44.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:26:44.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:26:44.595 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:26:44.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:26:44.656 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:26:21
2026-05-29T07:26:44.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71238, datetime.datetime(2026, 5, 29, 7, 26, 21), datetime.datetime(2026, 5, 29, 7, 26, 20), 'salt', 6.16, 83.51, None, 16.62, 90.2, 2.58, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:26:44.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:26:44.657 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:26:44.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:20, diff=24.664512s, valid=True
2026-05-29T07:26:44.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:26:44.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:26:44.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:12, diff=32.668047s, valid=True
2026-05-29T07:26:44.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:26:44.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:15, diff=29.676182s, valid=True
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:26:44.676 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:26:44.679 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:12, diff=32.679964s, valid=True
2026-05-29T07:26:44.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:26:44.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:26:44.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:26:44.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965046.680781s, valid=True
2026-05-29T07:26:44.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:26:44.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:26:44.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:26:44.682 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:26:44.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:26:44.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:26:44.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:26:44.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:26:44.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:26:44.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:26:44.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:26:44.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:26:44.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:26:45.003 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:26:45.215 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:26:45.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:26:45.657 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:26:45.657 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:26:45.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-29T07:26:45.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-29T07:26:45.835 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:26:45.835 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:27:15.852 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:27:15.852 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:27:15.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:27:16.154 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:27:16.169 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:27:16.369 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:27:16.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-29T07:27:16.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:27:16.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-29T07:27:16.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:27:16.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:27:16.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:27:16.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-29T07:27:18.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-29T07:27:18.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:27:18.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:27:18.835 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:27:18.835 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:27:18.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:27:18.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:27:18.858 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:27:18.859 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:27:18.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:27:18.859 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:27:18.859 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:27:18.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:27:18.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:27:18.989 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:27:19.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:27:19.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:27:19.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:27:19.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:27:19.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:27:19.171 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:27:19.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:27:19.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:27:19.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:27:19.237 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:26:51
2026-05-29T07:27:19.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71239, datetime.datetime(2026, 5, 29, 7, 26, 51), datetime.datetime(2026, 5, 29, 7, 26, 51), 'salt', 6.16, 83.71, None, 14.75, 94.76, 2.55, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:27:19.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:27:19.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:27:19.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:51, diff=28.244358s, valid=True
2026-05-29T07:27:19.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:27:19.244 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:27:19.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:27:12, diff=7.247759s, valid=True
2026-05-29T07:27:19.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:27:19.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:27:19.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:26:47, diff=32.255687s, valid=True
2026-05-29T07:27:19.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:27:19.255 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:27:19.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:27:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:27:19.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:27:19.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:27:19.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:27:12, diff=7.259251s, valid=True
2026-05-29T07:27:19.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:27:19.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:27:19.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:27:19.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965081.260048s, valid=True
2026-05-29T07:27:19.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:27:19.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:27:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:27:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:27:19.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:27:19.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:27:19.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:27:19.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:27:19.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:27:19.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:27:19.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:27:19.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:27:19.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:27:19.648 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:27:19.863 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:27:20.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:27:20.321 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:27:20.321 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:27:20.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-29T07:27:20.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-29T07:27:20.474 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:27:20.474 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:27:50.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:27:50.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:27:50.478 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:27:50.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:27:50.666 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:27:50.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:27:50.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-29T07:27:50.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:27:50.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-29T07:27:50.890 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:27:50.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:27:50.897 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:27:50.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-29T07:27:53.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-29T07:27:53.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:27:53.231 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:27:53.232 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:27:53.232 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:27:53.242 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:27:53.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:27:53.255 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:27:53.256 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:27:53.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:27:53.256 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:27:53.257 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:27:53.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:27:53.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:27:53.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:27:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:27:53.482 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:27:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:27:53.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:27:53.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:27:53.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:27:53.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:27:53.571 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:27:53.571 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:27:53.631 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:27:52
2026-05-29T07:27:53.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71241, datetime.datetime(2026, 5, 29, 7, 27, 52), datetime.datetime(2026, 5, 29, 7, 27, 51), 'salt', 5.96, 84.04, None, 13.3, 98.68, 2.48, 832.56, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:27:53.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:27:53.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:27:53.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:27:51, diff=2.637707s, valid=True
2026-05-29T07:27:53.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:27:53.637 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:27:53.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:12, diff=-18.358883s, valid=True
2026-05-29T07:27:53.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:27:53.641 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:27:52, diff=1.649103s, valid=True
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:27:53.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:27:53.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:12, diff=-18.347315s, valid=True
2026-05-29T07:27:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:27:53.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:27:53.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:27:53.653 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965115.653477s, valid=True
2026-05-29T07:27:53.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:27:53.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:27:53.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:27:53.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:27:53.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:27:53.719 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:27:53.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:27:53.720 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:27:53.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:27:53.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:27:53.854 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:27:53.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:27:53.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:27:53.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:27:54.187 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:27:54.527 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:27:54.626 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:27:54.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:27:54.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-29T07:27:54.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-29T07:27:54.901 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:27:54.901 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:28:24.902 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:28:24.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:28:24.903 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:28:25.058 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:28:25.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:28:25.328 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:28:25.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-29T07:28:25.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:28:25.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:28:25.350 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:28:25.350 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:28:25.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:28:25.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-29T07:28:27.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-29T07:28:27.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:28:27.775 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:28:27.776 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:28:27.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:28:27.786 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:28:27.799 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:28:27.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:28:27.800 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:28:27.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:28:27.800 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:28:27.801 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:28:27.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:28:27.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:28:27.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:28:28.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:28:28.026 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:28:28.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:28:28.070 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:28:28.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:28:28.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:28:28.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:28:28.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:28:28.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:28:28.174 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:28:22
2026-05-29T07:28:28.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71242, datetime.datetime(2026, 5, 29, 7, 28, 22), datetime.datetime(2026, 5, 29, 7, 28, 21), 'salt', 5.99, 84.3, None, 15.03, 96.42, 2.44, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:28:28.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:28:28.175 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:28:28.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:21, diff=7.182194s, valid=True
2026-05-29T07:28:28.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:28:28.182 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:28:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:12, diff=16.185603s, valid=True
2026-05-29T07:28:28.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:28:28.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:22, diff=6.193518s, valid=True
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:28:28.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:28:28.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:28:28.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:12, diff=16.197102s, valid=True
2026-05-29T07:28:28.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:28:28.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:28:28.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:28:28.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965150.197894s, valid=True
2026-05-29T07:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:28:28.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:28:28.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:28:28.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:28:28.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:28:28.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:28:28.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:28:28.334 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:28:28.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:28:28.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:28:28.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:28:28.516 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:28:28.728 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:28:29.069 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:28:29.168 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:28:29.169 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:28:29.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-29T07:28:29.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-29T07:28:29.239 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:28:29.239 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:28:59.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:28:59.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:28:59.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:28:59.579 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:28:59.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:28:59.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:28:59.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:28:59.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:28:59.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-29T07:28:59.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:28:59.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:28:59.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:28:59.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-29T07:29:02.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-29T07:29:02.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:29:02.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:29:02.214 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:29:02.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:29:02.224 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:29:02.237 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:29:02.237 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:29:02.238 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:29:02.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:29:02.238 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:29:02.238 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:29:02.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:29:02.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:29:02.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:29:02.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:29:02.465 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:29:02.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:29:02.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:29:02.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:29:02.552 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:29:02.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:29:02.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:29:02.557 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:29:02.623 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:28:52
2026-05-29T07:29:02.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71243, datetime.datetime(2026, 5, 29, 7, 28, 52), datetime.datetime(2026, 5, 29, 7, 28, 52), 'salt', 5.96, 84.47, None, 15.95, 94.47, 2.41, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:29:02.624 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:29:02.624 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:29:02.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:52, diff=10.630951s, valid=True
2026-05-29T07:29:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:29:02.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:29:02.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:12, diff=-9.365597s, valid=True
2026-05-29T07:29:02.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:29:02.634 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:28:52, diff=10.642161s, valid=True
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:29:02.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:29:02.645 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:12, diff=-9.354199s, valid=True
2026-05-29T07:29:02.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:29:02.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:29:02.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:29:02.646 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965184.64659s, valid=True
2026-05-29T07:29:02.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:29:02.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:29:02.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:29:02.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:29:02.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:29:02.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:29:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:29:02.713 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:29:02.733 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:29:02.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:29:02.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:29:02.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:29:02.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:29:02.973 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:29:03.186 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:29:03.587 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:29:03.686 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:29:03.686 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:29:03.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-29T07:29:03.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-29T07:29:03.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:29:03.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:29:33.958 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:29:33.958 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:29:33.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:29:34.426 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:29:34.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:29:34.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:29:34.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-29T07:29:34.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:29:34.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-29T07:29:34.658 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:29:34.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:29:34.665 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:29:34.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-29T07:29:37.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-29T07:29:37.133 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:29:37.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:29:37.142 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:29:37.142 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:29:37.154 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:29:37.166 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:29:37.167 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:29:37.167 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:29:37.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:29:37.168 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:29:37.168 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:29:37.174 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:29:37.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:29:37.297 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:29:37.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:29:37.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:29:37.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:29:37.437 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:29:37.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:29:37.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:29:37.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:29:37.484 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:29:37.484 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:29:37.545 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:29:22
2026-05-29T07:29:37.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71244, datetime.datetime(2026, 5, 29, 7, 29, 22), datetime.datetime(2026, 5, 29, 7, 29, 22), 'salt', 5.93, 84.54, None, 16.9, 94.85, 2.4, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:29:37.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:29:37.546 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:29:37.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:22, diff=15.552964s, valid=True
2026-05-29T07:29:37.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:29:37.553 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:29:37.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:12, diff=25.556379s, valid=True
2026-05-29T07:29:37.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:29:37.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:22, diff=15.564303s, valid=True
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:29:37.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:29:37.567 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:12, diff=25.56793s, valid=True
2026-05-29T07:29:37.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:29:37.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:29:37.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:29:37.568 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965219.568733s, valid=True
2026-05-29T07:29:37.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:29:37.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:29:37.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:29:37.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:29:37.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:29:37.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:29:37.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:29:37.634 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:29:37.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:29:37.706 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:29:37.767 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:29:37.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:29:37.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:29:37.889 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:29:38.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:29:38.444 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:29:38.543 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:29:38.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:29:38.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-29T07:29:38.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-29T07:29:38.726 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:29:38.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:30:08.727 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:30:08.727 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:30:08.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:30:09.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:30:09.213 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:30:09.433 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:30:09.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-29T07:30:09.440 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:30:09.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-29T07:30:09.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:30:09.449 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:30:09.454 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:30:09.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-29T07:30:11.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-29T07:30:11.926 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:30:11.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:30:11.934 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:30:11.934 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:30:11.946 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:30:11.959 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:30:11.959 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:30:11.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:30:11.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:30:11.960 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:30:11.961 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:30:11.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:30:12.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:30:12.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:30:12.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:30:12.190 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:30:12.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:30:12.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:30:12.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:30:12.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:30:12.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:30:12.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:30:12.283 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:30:12.345 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:29:53
2026-05-29T07:30:12.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71245, datetime.datetime(2026, 5, 29, 7, 29, 53), datetime.datetime(2026, 5, 29, 7, 29, 52), 'salt', 6.03, 84.6, None, 17.96, 91.63, 2.39, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:30:12.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:30:12.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:30:12.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:52, diff=20.352471s, valid=True
2026-05-29T07:30:12.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:30:12.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:30:12.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:12, diff=0.355905s, valid=True
2026-05-29T07:30:12.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:30:12.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:30:12.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:29:53, diff=19.363824s, valid=True
2026-05-29T07:30:12.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:30:12.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:30:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:30:12.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:30:12.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:30:12.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:30:12.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:12, diff=0.367477s, valid=True
2026-05-29T07:30:12.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:30:12.367 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:30:12.367 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:30:12.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965254.368279s, valid=True
2026-05-29T07:30:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:30:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:30:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:30:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:30:12.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:30:12.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:30:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:30:12.434 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:30:12.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:30:12.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:30:12.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:30:12.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:30:12.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:30:12.693 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:30:12.977 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:30:13.320 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:30:13.419 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:30:13.419 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:30:13.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-29T07:30:13.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-29T07:30:13.607 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:30:13.607 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:30:43.637 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:30:43.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:30:43.638 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:30:43.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:30:43.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:30:43.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:30:43.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-29T07:30:43.987 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:30:43.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-29T07:30:43.996 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:30:43.997 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:30:44.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:30:44.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-29T07:30:46.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-29T07:30:46.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:30:46.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:30:46.499 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:30:46.499 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:30:46.507 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:30:46.518 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:30:46.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:30:46.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:30:46.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:30:46.519 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:30:46.519 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:30:46.526 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:30:46.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:30:46.605 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:30:46.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:30:46.697 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:30:46.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:30:46.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:30:46.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:30:46.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:30:46.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:30:46.786 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:30:46.786 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:30:46.855 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:30:23
2026-05-29T07:30:46.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71246, datetime.datetime(2026, 5, 29, 7, 30, 23), datetime.datetime(2026, 5, 29, 7, 30, 23), 'salt', 5.96, 84.44, None, 16.94, 90.81, 2.42, 832.56, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:30:46.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:30:46.856 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:30:46.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:23, diff=23.862484s, valid=True
2026-05-29T07:30:46.862 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:30:46.862 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:30:46.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:12, diff=34.865633s, valid=True
2026-05-29T07:30:46.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:30:46.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:23, diff=23.873078s, valid=True
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:30:46.873 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:30:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:12, diff=34.876479s, valid=True
2026-05-29T07:30:46.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:30:46.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:30:46.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:30:46.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965288.877241s, valid=True
2026-05-29T07:30:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:30:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:30:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:30:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:30:46.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:30:46.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:30:46.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:30:46.941 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:30:46.961 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:30:47.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:30:47.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:30:47.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:30:47.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:30:47.198 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:30:47.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:30:47.754 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:30:47.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:30:47.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:30:47.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-29T07:30:47.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-29T07:30:48.033 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:30:48.033 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:31:18.063 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:31:18.063 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:31:18.063 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:31:18.398 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:31:18.417 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:31:18.635 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:31: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-29T07:31:18.646 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:31:18.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-29T07:31:18.656 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:31:18.657 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:31:18.664 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:31:18.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-29T07:31:20.978 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:31:20.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:31:20.986 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:31:20.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:31:20.987 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:31:20.998 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:31:21.011 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:31:21.011 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:31:21.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:31:21.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:31:21.012 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:31:21.012 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:31:21.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:31:21.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:31:21.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:31:21.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:31:21.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:31:21.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:31:21.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:31:21.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:31:21.328 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:31:21.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:31:21.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:31:21.333 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:31:21.394 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:30:53
2026-05-29T07:31:21.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71247, datetime.datetime(2026, 5, 29, 7, 30, 53), datetime.datetime(2026, 5, 29, 7, 30, 53), 'salt', 6.09, 84.3, None, 15.6, 86.87, 2.44, 832.56, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:31:21.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:31:21.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:31:21.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:53, diff=28.401047s, valid=True
2026-05-29T07:31:21.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:31:21.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:31:21.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:31:12, diff=9.403938s, valid=True
2026-05-29T07:31:21.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:31:21.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:30:53, diff=28.410578s, valid=True
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:31:21.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:31:21.411 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:31:21.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:31:12, diff=9.413661s, valid=True
2026-05-29T07:31:21.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:31:21.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:31:21.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:31:21.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965323.414317s, valid=True
2026-05-29T07:31:21.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:31:21.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:31:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:31:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:31:21.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:31:21.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:31:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:31:21.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:31:21.499 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:31:21.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:31:21.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:31:21.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:31:21.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:31:21.809 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:31:22.020 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:31:22.362 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:31:22.461 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:31:22.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:31:22.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-29T07:31:22.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-29T07:31:22.634 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:31:22.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:31:52.642 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:31:52.642 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:31:52.642 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:31:52.755 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:31:52.764 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:31:52.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:31:52.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:31:52.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:31:52.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-29T07:31:52.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:31:52.976 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:31:52.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:31:52.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-29T07:31:55.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-29T07:31:55.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:31:55.879 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:31:55.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:31:55.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:31:55.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:31:55.905 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:31:55.906 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:31:55.906 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:31:55.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:31:55.907 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:31:55.907 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:31:55.912 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:31:56.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:31:56.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:31:56.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:31:56.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:31:56.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:31:56.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:31:56.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:31:56.225 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:31:56.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:31:56.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:31:56.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:31:56.291 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:31:54
2026-05-29T07:31:56.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71249, datetime.datetime(2026, 5, 29, 7, 31, 54), datetime.datetime(2026, 5, 29, 7, 31, 53), 'salt', 6.23, 84.17, None, 15.7, 88.88, 2.47, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:31:56.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:31:56.292 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:31:56.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:31:53, diff=3.298825s, valid=True
2026-05-29T07:31:56.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:31:56.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:31:56.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:12, diff=-15.697937s, valid=True
2026-05-29T07:31:56.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:31:56.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:31:56.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:31:53, diff=3.309633s, valid=True
2026-05-29T07:31:56.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:31:56.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:31:56.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:31:56.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:31:56.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:31:56.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:31:56.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:12, diff=-15.686895s, valid=True
2026-05-29T07:31:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:31:56.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:31:56.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:31:56.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965358.313867s, valid=True
2026-05-29T07:31:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:31:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:31:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:31:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:31:56.315 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:31:56.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:31:56.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:31:56.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:31:56.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:31:56.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:31:56.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:31:56.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:31:56.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:31:56.634 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:31:56.846 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:31:57.189 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:31:57.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:31:57.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:31:57.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-29T07:31:57.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-29T07:31:57.467 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:31:57.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:32:27.468 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:32:27.468 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:32:27.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:32:27.814 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:32:27.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:32:28.051 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:32:28.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-29T07:32:28.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:32:28.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-29T07:32:28.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:32:28.071 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:32:28.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:32:28.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-29T07:32:30.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-29T07:32:30.425 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:32:30.429 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:32:30.429 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:32:30.429 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:32:30.437 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:32:30.455 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:32:30.455 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:32:30.455 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:32:30.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:32:30.455 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:32:30.456 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:32:30.460 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:32:30.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:32:30.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:32:30.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:32:30.643 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:32:30.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:32:30.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:32:30.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:32:30.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:32:30.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:32:30.731 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:32:30.731 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:32:30.790 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:32:24
2026-05-29T07:32:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71250, datetime.datetime(2026, 5, 29, 7, 32, 24), datetime.datetime(2026, 5, 29, 7, 32, 24), 'salt', 6.36, 84.14, None, 14.54, 89.87, 2.48, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:32:30.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:32:30.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:32:30.796 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:24, diff=6.796898s, valid=True
2026-05-29T07:32:30.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:32:30.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:32:30.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:12, diff=18.80007s, valid=True
2026-05-29T07:32:30.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:32:30.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:24, diff=6.807456s, valid=True
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:32:30.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:32:30.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:12, diff=18.810888s, valid=True
2026-05-29T07:32:30.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:32:30.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:32:30.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:32:30.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965392.811627s, valid=True
2026-05-29T07:32:30.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:32:30.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:32:30.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:32:30.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:32:30.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:32:30.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:32:30.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:32:30.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:32:30.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:32:30.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:32:31.090 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:32:31.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:32:31.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:32:31.212 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:32:31.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:32:31.784 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:32:31.884 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:32:31.884 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:32:31.884 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:32:31.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-29T07:32:32.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:32:32.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:33:02.149 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:33:02.149 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:33:02.150 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:33:02.477 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:33:02.489 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:33:02.688 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:33:02.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-29T07:33:02.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:33:02.696 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:33:02.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:33:02.707 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:33:02.710 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:33:02.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-29T07:33:05.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:33:05.368 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:33:05.376 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:33:05.377 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:33:05.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:33:05.388 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:33:05.400 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:33:05.401 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:33:05.401 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:33:05.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:33:05.402 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:33:05.402 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:33:05.409 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:33:05.536 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:33:05.537 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:33:05.628 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:33:05.629 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:33:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:33:05.671 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:33:05.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:33:05.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:33:05.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:33:05.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:33:05.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:33:05.773 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:32:54
2026-05-29T07:33:05.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71251, datetime.datetime(2026, 5, 29, 7, 32, 54), datetime.datetime(2026, 5, 29, 7, 32, 54), 'salt', 6.36, 83.84, None, 15.0, 92.03, 2.53, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:33:05.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:33:05.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:33:05.779 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:54, diff=11.779906s, valid=True
2026-05-29T07:33:05.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:33:05.780 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:33:05.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:12, diff=-6.216867s, valid=True
2026-05-29T07:33:05.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:33:05.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:32:54, diff=11.790529s, valid=True
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:33:05.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:33:05.791 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:33:05.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:12, diff=-6.206067s, valid=True
2026-05-29T07:33:05.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:33:05.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:33:05.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:33:05.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965427.79469s, valid=True
2026-05-29T07:33:05.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:33:05.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:33:05.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:33:05.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:33:05.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:33:05.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:33:05.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:33:05.860 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:33:05.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:33:05.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:33:05.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:33:06.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:33:06.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:33:06.115 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:33:06.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:33:06.697 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:33:06.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:33:06.797 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:33:06.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-29T07:33:06.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-29T07:33:06.969 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:33:06.969 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:33:36.997 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:33:36.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:33:36.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:33:37.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:33:37.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:33:37.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:33:37.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-29T07:33:37.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:33:37.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-29T07:33:37.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:33:37.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:33:37.618 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:33:37.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-29T07:33:40.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:33:40.205 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:33:40.211 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:33:40.212 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:33:40.212 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:33:40.222 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:33:40.235 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:33:40.235 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:33:40.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:33:40.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:33:40.236 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:33:40.236 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:33:40.243 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:33:40.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:33:40.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:33:40.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:33:40.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:33:40.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:33:40.511 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:33:40.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:33:40.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:33:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:33:40.553 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:33:40.553 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:33:40.611 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:33:25
2026-05-29T07:33:40.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71252, datetime.datetime(2026, 5, 29, 7, 33, 25), datetime.datetime(2026, 5, 29, 7, 33, 24), 'salt', 6.26, 83.74, None, 14.43, 88.3, 2.54, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:33:40.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:33:40.611 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:33:40.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:24, diff=16.617099s, valid=True
2026-05-29T07:33:40.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:33:40.617 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:33:40.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:12, diff=28.619944s, valid=True
2026-05-29T07:33:40.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:33:40.620 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:33:40.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:24, diff=16.626648s, valid=True
2026-05-29T07:33:40.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:33:40.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:33:40.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:33:40.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:33:40.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:33:40.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:33:40.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:12, diff=28.629802s, valid=True
2026-05-29T07:33:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:33:40.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:33:40.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:33:40.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965462.630462s, valid=True
2026-05-29T07:33:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:33:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:33:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:33:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:33:40.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:33:40.690 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:33:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:33:40.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:33:40.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:33:40.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:33:40.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:33:40.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:33:40.975 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:33:41.015 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:33:41.228 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:33:41.569 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:33:41.669 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:33:41.669 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:33:41.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-29T07:33:41.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-29T07:33:41.847 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:33:41.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:34:11.877 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:34:11.877 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:34:11.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:34:12.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:34:12.044 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:34:12.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:34:12.245 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:34:12.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:34:12.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-29T07:34:12.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:34:12.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:34:12.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:34:12.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-29T07:34:15.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:34:15.206 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:34:15.214 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:34:15.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:34:15.215 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:34:15.226 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:34:15.239 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:34:15.239 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:34:15.240 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:34:15.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:34:15.241 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:34:15.241 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:34:15.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:34:15.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:34:15.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:34:15.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:34:15.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:34:15.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:34:15.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:34:15.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:34:15.557 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:34:15.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:34:15.562 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:34:15.562 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:34:15.622 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:33:55
2026-05-29T07:34:15.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71253, datetime.datetime(2026, 5, 29, 7, 33, 55), datetime.datetime(2026, 5, 29, 7, 33, 54), 'salt', 6.39, 83.64, None, 16.06, 87.52, 2.56, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:34:15.623 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:34:15.623 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:34:15.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:54, diff=21.629689s, valid=True
2026-05-29T07:34:15.629 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:34:15.629 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:34:15.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:12, diff=3.63277s, valid=True
2026-05-29T07:34:15.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:34:15.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:33:54, diff=21.639538s, valid=True
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:34:15.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:34:15.640 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:34:15.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:12, diff=3.642642s, valid=True
2026-05-29T07:34:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:34:15.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:34:15.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:34:15.643 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965497.643316s, valid=True
2026-05-29T07:34:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:34:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:34:15.644 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:34:15.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:34:15.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:34:15.703 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:34:15.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:34:15.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:34:15.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:34:15.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:34:15.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:34:15.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:34:15.926 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:34:15.967 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:34:16.180 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:34:16.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:34:16.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:34:16.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:34:16.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-29T07:34:16.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-29T07:34:16.788 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:34:16.788 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:34:46.818 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:34:46.818 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:34:46.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:34:46.966 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:34:46.980 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:34:47.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:34:47.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-29T07:34:47.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:34:47.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-29T07:34:47.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:34:47.260 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:34:47.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:34:47.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-29T07:34: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-29T07:34:49.667 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:34:49.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:34:49.677 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:34:49.677 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:34:49.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:34:49.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:34:49.700 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:34:49.701 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:34:49.701 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:34:49.701 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:34:49.701 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:34:49.708 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:34:49.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:34:49.833 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:34:49.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:34:49.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:34:49.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:34:49.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:34:50.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:34:50.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:34:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:34:50.007 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:34:50.007 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:34:50.065 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:34:25
2026-05-29T07:34:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71254, datetime.datetime(2026, 5, 29, 7, 34, 25), datetime.datetime(2026, 5, 29, 7, 34, 25), 'salt', 6.32, 83.51, None, 15.53, 84.75, 2.58, 832.86, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:34:50.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:34:50.065 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:34:50.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:25, diff=25.072698s, valid=True
2026-05-29T07:34:50.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:34:50.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:34:50.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:12, diff=38.075731s, valid=True
2026-05-29T07:34:50.075 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:34:50.075 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:24, diff=26.083154s, valid=True
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:34:50.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:34:50.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:12, diff=38.086308s, valid=True
2026-05-29T07:34:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:34:50.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:34:50.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:34:50.087 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965532.086989s, valid=True
2026-05-29T07:34:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:34:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:34:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:34:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:34:50.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:34:50.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:34:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:34:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:34:50.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:34:50.232 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:34:50.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:34:50.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:34:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:34:50.415 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:34:50.628 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:34:50.974 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:34:51.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:34:51.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:34: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-29T07:34:51.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-29T07:34:52.240 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:34:52.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:35:22.270 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:35:22.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:35:22.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:35:22.581 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:35:22.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:35:22.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:35:22.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-29T07:35:22.809 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:35:22.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-29T07:35:22.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:35:22.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:35:22.826 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:35:22.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-29T07:35:25.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-29T07:35:25.257 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:35:25.264 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:35:25.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:35:25.265 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:35:25.275 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:35:25.288 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:35:25.288 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:35:25.289 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:35:25.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:35:25.290 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:35:25.290 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:35:25.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:35:25.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:35:25.383 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:35:25.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:35:25.469 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:35:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:35:25.512 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:35:25.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:35:25.551 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:35:25.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:35:25.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:35:25.556 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:35:25.615 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:34:55
2026-05-29T07:35:25.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71255, datetime.datetime(2026, 5, 29, 7, 34, 55), datetime.datetime(2026, 5, 29, 7, 34, 55), 'salt', 6.29, 83.38, None, 15.49, 95.37, 2.6, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:35:25.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:35:25.616 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:35:25.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:55, diff=30.622633s, valid=True
2026-05-29T07:35:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:35:25.622 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:35:25.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:35:12, diff=13.625785s, valid=True
2026-05-29T07:35:25.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:35:25.625 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:35:25.632 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:34:55, diff=30.632933s, valid=True
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:35:25.633 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:35:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:35:12, diff=13.636205s, valid=True
2026-05-29T07:35:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:35:25.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:35:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:35:25.636 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965567.636929s, valid=True
2026-05-29T07:35:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:35:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:35:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:35:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:35:25.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:35:25.699 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:35:25.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:35:25.700 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:35:25.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:35:25.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:35:25.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:35:25.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:35:25.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:35:25.956 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:35:26.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:35:26.503 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:35:26.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:35:26.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:35:26.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-29T07:35:26.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-29T07:35:26.844 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:35:26.845 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:35:56.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:35:56.875 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:35:56.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:35:57.041 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:35:57.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:35:57.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:35:57.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-29T07:35:57.266 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:35:57.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-29T07:35:57.276 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:35:57.276 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:35:57.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:35:57.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:36:00.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-29T07:36:00.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:36:00.407 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:36:00.408 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:36:00.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:36:00.419 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:36:00.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:36:00.433 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:36:00.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:36:00.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:36:00.434 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:36:00.434 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:36:00.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:36:00.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:36:00.565 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:36:00.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:36:00.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:36:00.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:36:00.706 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:36:00.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:36:00.748 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:36:00.752 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:36:00.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:36:00.753 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:36:00.815 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:35:56
2026-05-29T07:36:00.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71257, datetime.datetime(2026, 5, 29, 7, 35, 56), datetime.datetime(2026, 5, 29, 7, 35, 55), 'salt', 6.36, 83.11, None, 13.76, 91.37, 2.65, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:36:00.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:36:00.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:36:00.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:35:55, diff=5.822545s, valid=True
2026-05-29T07:36:00.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:36:00.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:36:00.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:12, diff=-11.174065s, valid=True
2026-05-29T07:36:00.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:36:00.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:36:00.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:35:55, diff=5.833717s, valid=True
2026-05-29T07:36:00.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:36:00.833 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:36:00.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:36:00.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:36:00.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:36:00.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:36:00.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:12, diff=-11.162708s, valid=True
2026-05-29T07:36:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:36:00.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:36:00.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:36:00.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965602.838082s, valid=True
2026-05-29T07:36:00.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:36:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:36:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:36:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:36:00.840 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:36:00.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:36:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:36:00.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:36:00.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:36:00.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:36:01.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:36:01.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:36:01.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:36:01.162 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:36:01.379 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:36:01.755 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:36:01.857 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:36:01.857 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:36:01.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-29T07:36:01.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-29T07:36:02.043 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:36:02.043 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:36:32.074 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:36:32.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:36: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-29T07:36:32.553 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:36:32.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:36:32.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:36:32.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:36:32.802 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:36:32.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-29T07:36:32.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:36:32.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:36:32.817 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:36:32.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-29T07:36:35.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-29T07:36:35.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:36:35.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:36:35.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:36:35.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:36:35.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:36:35.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:36:35.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:36:35.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:36:35.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:36:35.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:36:35.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:36:35.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:36:35.400 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:36:35.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:36:35.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:36:35.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:36:35.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:36:35.543 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:36:35.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:36:35.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:36:35.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:36:35.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:36:35.589 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:36:35.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:36:26
2026-05-29T07:36:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71258, datetime.datetime(2026, 5, 29, 7, 36, 26), datetime.datetime(2026, 5, 29, 7, 36, 26), 'salt', 6.42, 82.84, None, 15.35, 91.47, 2.69, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:36:35.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:36:35.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:36:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:26, diff=9.65625s, valid=True
2026-05-29T07:36:35.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:36:35.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:36:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:12, diff=23.659689s, valid=True
2026-05-29T07:36:35.659 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:36:35.659 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:25, diff=10.667509s, valid=True
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:36:35.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:36:35.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:36:35.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:12, diff=23.67112s, valid=True
2026-05-29T07:36:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:36:35.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:36:35.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:36:35.671 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965637.671908s, valid=True
2026-05-29T07:36:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:36:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:36:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:36:35.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:36:35.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:36:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:36:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:36:35.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:36:35.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:36:35.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:36:35.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:36:35.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:36:35.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:36:35.991 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:36:36.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:36:36.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:36:36.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:36:36.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:36:36.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-29T07:36:36.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-29T07:36:36.868 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:36:36.868 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:37:06.896 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:37:06.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:37:06.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:37:07.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:37:07.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:37:07.277 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:37:07.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-29T07:37:07.287 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:37:07.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-29T07:37:07.296 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:37:07.296 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:37:07.300 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:37:07.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-29T07:37:10.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-29T07:37:10.333 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:37:10.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:37:10.338 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:37:10.338 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:37:10.348 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:37:10.360 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:37:10.361 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:37:10.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:37:10.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:37:10.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:37:10.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:37:10.368 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:37:10.491 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:37:10.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:37:10.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:37:10.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:37:10.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:37:10.638 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:37:10.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:37:10.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:37:10.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:37:10.683 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:37:10.683 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:37:10.743 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:36:56
2026-05-29T07:37:10.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71259, datetime.datetime(2026, 5, 29, 7, 36, 56), datetime.datetime(2026, 5, 29, 7, 36, 56), 'salt', 6.39, 82.84, None, 18.28, 94.71, 2.7, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:37:10.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:37:10.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:37:10.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:56, diff=14.751069s, valid=True
2026-05-29T07:37:10.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:37:10.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:37:10.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:12, diff=-1.245542s, valid=True
2026-05-29T07:37:10.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:37:10.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:36:55, diff=15.762313s, valid=True
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:37:10.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:37:10.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:12, diff=-1.234045s, valid=True
2026-05-29T07:37:10.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:37:10.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:37:10.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:37:10.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965672.766742s, valid=True
2026-05-29T07:37:10.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:37:10.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:37:10.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:37:10.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:37:10.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:37:10.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:37:10.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:37:10.833 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:37:10.852 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:37:10.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:37:10.965 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:37:10.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:37:11.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:37:11.087 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:37:11.291 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:37:11.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:37:11.725 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:37:11.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:37:11.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-29T07:37:11.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-29T07:37:11.938 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:37:11.938 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:37:41.944 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:37:41.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:37:41.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:37:42.479 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:37:42.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:37:42.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:37:42.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-29T07:37:42.702 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:37:42.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-29T07:37:42.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:37:42.712 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:37:42.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:37:42.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-29T07:37:45.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-29T07:37:45.673 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:37:45.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:37:45.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:37:45.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:37:45.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:37:45.706 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:37:45.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:37:45.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:37:45.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:37:45.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:37:45.708 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:37:45.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:37:45.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:37:45.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:37:45.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:37:45.934 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:37:45.980 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:37:45.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:37:46.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:37:46.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:37:46.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:37:46.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:37:46.029 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:37:46.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:37:26
2026-05-29T07:37:46.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71260, datetime.datetime(2026, 5, 29, 7, 37, 26), datetime.datetime(2026, 5, 29, 7, 37, 26), 'salt', 6.46, 82.81, None, 18.03, 100.53, 2.71, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:37:46.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:37:46.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:37:46.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:26, diff=20.109198s, valid=True
2026-05-29T07:37:46.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:37:46.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:37:46.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:12, diff=34.11274s, valid=True
2026-05-29T07:37:46.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:37:46.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:37:46.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:26, diff=20.120797s, valid=True
2026-05-29T07:37:46.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:37:46.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:37:46.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:37:46.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:37:46.121 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:37:46.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:37:46.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:12, diff=34.124637s, valid=True
2026-05-29T07:37:46.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:37:46.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:37:46.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:37:46.125 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965708.12544s, valid=True
2026-05-29T07:37:46.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:37:46.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:37:46.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:37:46.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:37:46.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:37:46.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:37:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:37:46.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:37:46.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:37:46.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:37:46.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:37:46.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:37:46.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:37:46.450 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:37:46.724 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:37:47.057 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:37:47.156 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:37:47.156 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:37:47.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-29T07:37:47.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-29T07:37:47.334 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:37:47.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:38:17.364 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:38:17.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:38:17.364 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:38:17.807 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:38:17.820 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:38:18.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:38:18.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-29T07:38:18.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:38:18.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-29T07:38:18.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:38:18.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:38:18.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:38:18.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-29T07:38:20.654 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:38:20.654 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:38:20.658 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:38:20.658 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:38:20.658 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:38:20.667 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:38:20.680 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:38:20.680 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:38:20.680 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:38:20.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:38:20.680 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:38:20.680 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:38:20.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:38:20.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:38:20.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:38:20.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:38:20.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:38:20.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:38:20.950 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:38:20.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:38:20.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:38:20.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:38:20.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:38:20.995 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:38:21.055 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:37:57
2026-05-29T07:38:21.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71261, datetime.datetime(2026, 5, 29, 7, 37, 57), datetime.datetime(2026, 5, 29, 7, 37, 56), 'salt', 6.62, 82.84, None, 16.51, 107.34, 2.7, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:38:21.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:38:21.055 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:38:21.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:56, diff=25.062574s, valid=True
2026-05-29T07:38:21.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:38:21.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:38:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:12, diff=9.066032s, valid=True
2026-05-29T07:38:21.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:38:21.066 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:37:56, diff=25.074011s, valid=True
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:38:21.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:38:21.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:12, diff=9.077629s, valid=True
2026-05-29T07:38:21.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:38:21.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:38:21.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:38:21.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965743.078406s, valid=True
2026-05-29T07:38:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:38:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:38:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:38:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:38:21.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:38:21.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:38:21.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:38:21.144 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:38:21.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:38:21.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:38:21.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:38:21.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:38:21.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:38:21.399 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:38:21.602 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:38:21.934 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:38:22.032 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:38:22.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:38:22.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-29T07:38:22.033 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:38:22.212 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:38:22.212 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:38:52.242 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:38:52.242 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:38:52.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:38:52.379 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:38:52.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:38:52.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:38:52.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-29T07:38:52.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:38:52.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-29T07:38:52.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:38:52.602 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:38:52.608 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:38:52.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-29T07:38:54.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-29T07:38:54.987 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:38:54.991 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:38:54.991 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:38:54.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:38:55.000 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:38:55.012 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:38:55.012 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:38:55.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:38:55.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:38:55.013 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:38:55.013 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:38:55.019 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:38:55.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:38:55.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:38:55.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:38:55.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:38:55.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:38:55.234 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:38:55.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:38:55.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:38:55.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:38:55.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:38:55.277 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:38:55.338 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:38:27
2026-05-29T07:38:55.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71262, datetime.datetime(2026, 5, 29, 7, 38, 27), datetime.datetime(2026, 5, 29, 7, 38, 27), 'salt', 6.82, 82.15, None, 15.49, 98.4, 2.82, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:38:55.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:38:55.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:38:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:27, diff=28.345237s, valid=True
2026-05-29T07:38:55.345 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:38:55.345 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:38:55.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:12, diff=43.348455s, valid=True
2026-05-29T07:38:55.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:38:55.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:38:55.355 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:26, diff=29.355861s, valid=True
2026-05-29T07:38:55.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:38:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:38:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:38:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:38:55.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:38:55.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:38:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:38:12, diff=43.359278s, valid=True
2026-05-29T07:38:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:38:55.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:38:55.359 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:38:55.360 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965777.360022s, valid=True
2026-05-29T07:38:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:38:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:38:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:38:55.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:38:55.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:38:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:38:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:38:55.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:38:55.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:38:55.497 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:38:55.557 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:38:55.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:38:55.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:38:55.747 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:38:55.950 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:38:56.282 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:38:56.381 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:38:56.382 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:38:56.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-29T07:38:56.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-29T07:38:56.553 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:38:56.554 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:39:26.569 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:39:26.569 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:39:26.569 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:39:26.884 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:39:26.897 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:39:27.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:39:27.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-29T07:39:27.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:39:27.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-29T07:39:27.118 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:39:27.118 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:39:27.123 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:39:27.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-29T07:39:29.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-29T07:39:29.609 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:39:29.616 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:39:29.617 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:39:29.617 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:39:29.627 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:39:29.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:39:29.640 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:39:29.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:39:29.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:39:29.642 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:39:29.642 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:39:29.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:39:29.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:39:29.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:39:29.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:39:29.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:39:29.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:39:29.929 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:39:29.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:39:29.971 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:39:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:39:29.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:39:29.976 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:39:30.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:39:27
2026-05-29T07:39:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71264, datetime.datetime(2026, 5, 29, 7, 39, 27), datetime.datetime(2026, 5, 29, 7, 39, 27), 'salt', 6.82, 81.38, None, 14.36, 100.2, 2.96, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:39:30.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:39:30.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:39:30.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:27, diff=3.045064s, valid=True
2026-05-29T07:39:30.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:39:30.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:39:30.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:12, diff=18.04843s, valid=True
2026-05-29T07:39:30.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:39:30.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:26, diff=4.056005s, valid=True
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:39:30.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:39:30.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:12, diff=18.059522s, valid=True
2026-05-29T07:39:30.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:39:30.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:39:30.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:39:30.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965812.060289s, valid=True
2026-05-29T07:39:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:39:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:39:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:39:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:39:30.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:39:30.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:39:30.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:39:30.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:39:30.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:39:30.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:39:30.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:39:30.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:39:30.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:39:30.406 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:39:30.611 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:39:30.948 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:39:31.058 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:39:31.058 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:39:31.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-29T07:39:31.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-29T07:39:31.332 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:39:31.333 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:40:01.363 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:40:01.363 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:40:01.363 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:40:01.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:40:01.844 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:40:02.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:40:02.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:40:02.038 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:40:02.038 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:40:02.046 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:40:02.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:40:02.050 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:40:02.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-29T07:40:04.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-29T07:40:04.404 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:40:04.416 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:40:04.417 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:40:04.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:40:04.428 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:40:04.441 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:40:04.442 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:40:04.442 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:40:04.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:40:04.443 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:40:04.443 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:40:04.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:40:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:40:04.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:40:04.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:40:04.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:40:04.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:40:04.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:40:04.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:40:04.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:40:04.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:40:04.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:40:04.759 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:40:04.818 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:39:58
2026-05-29T07:40:04.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71265, datetime.datetime(2026, 5, 29, 7, 39, 58), datetime.datetime(2026, 5, 29, 7, 39, 57), 'salt', 6.76, 81.32, None, 15.6, 101.54, 2.97, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:40:04.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:40:04.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:40:04.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:57, diff=7.826284s, valid=True
2026-05-29T07:40:04.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:40:04.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:40:04.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:12, diff=-7.170319s, valid=True
2026-05-29T07:40:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:40:04.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:40:04.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:39:57, diff=7.837567s, valid=True
2026-05-29T07:40:04.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:40:04.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:40:04.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:40:04.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:40:04.838 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:40:04.838 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:40:04.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:12, diff=-7.158701s, valid=True
2026-05-29T07:40:04.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:40:04.841 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:40:04.841 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:40:04.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965846.842109s, valid=True
2026-05-29T07:40:04.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:40:04.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:40:04.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:40:04.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:40:04.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:40:04.907 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:40:04.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:40:04.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:40:04.993 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:40:05.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:40:05.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:40:05.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:40:05.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:40:05.230 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:40:05.433 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:40:05.765 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:40:05.861 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:40:05.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:40:05.861 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:40:05.861 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:40:06.326 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:40:06.326 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:40:36.356 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:40:36.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:40:36.357 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:40:36.659 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:40:36.670 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:40:36.863 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:40:36.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-29T07:40:36.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:40:36.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-29T07:40:36.881 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:40:36.881 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:40:36.885 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:40:36.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-29T07:40:39.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-29T07:40:39.307 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:40:39.314 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:40:39.315 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:40:39.315 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:40:39.324 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:40:39.336 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:40:39.337 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:40:39.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:40:39.338 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:40:39.338 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:40:39.338 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:40:39.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:40:39.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:40:39.471 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:40:39.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:40:39.566 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:40:39.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:40:39.609 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:40:39.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:40:39.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:40:39.654 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:40:39.655 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:40:39.655 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:40:39.714 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:40:28
2026-05-29T07:40:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71266, datetime.datetime(2026, 5, 29, 7, 40, 28), datetime.datetime(2026, 5, 29, 7, 40, 28), 'salt', 6.62, 81.55, None, 15.28, 98.16, 2.92, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:40:39.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:40:39.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:40:39.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:28, diff=11.72235s, valid=True
2026-05-29T07:40:39.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:40:39.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:40:39.725 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:12, diff=27.725812s, valid=True
2026-05-29T07:40:39.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:40:39.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:40:39.733 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:27, diff=12.733897s, valid=True
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:40:39.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:40:39.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:12, diff=27.737541s, valid=True
2026-05-29T07:40:39.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:40:39.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:40:39.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:40:39.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965881.738347s, valid=True
2026-05-29T07:40:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:40:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:40:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:40:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:40:39.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:40:39.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:40:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:40:39.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:40:39.824 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:40:39.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:40:39.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:40:39.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:40:40.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:40:40.076 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:40:40.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:40:40.618 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:40:40.716 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:40:40.716 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:40:40.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-29T07:40:40.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-29T07:40:40.890 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:40:40.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:41:10.891 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:41:10.891 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:41:10.891 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:41:11.358 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:41:11.371 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:41:11.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:41:11.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-29T07:41:11.639 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:41:11.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:41:11.647 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:41:11.647 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:41:11.651 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:41:11.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-29T07:41:14.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:41:14.079 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:41:14.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:41:14.088 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:41:14.088 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:41:14.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:41:14.113 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:41:14.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:41:14.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:41:14.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:41:14.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:41:14.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:41:14.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:41:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:41:14.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:41:14.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:41:14.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:41:14.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:41:14.389 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:41:14.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:41:14.431 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:41:14.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:41:14.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:41:14.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:41:14.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:40:58
2026-05-29T07:41:14.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71267, datetime.datetime(2026, 5, 29, 7, 40, 58), datetime.datetime(2026, 5, 29, 7, 40, 58), 'salt', 6.56, 81.75, None, 16.09, 98.32, 2.89, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:41:14.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:41:14.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:41:14.507 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:58, diff=16.507961s, valid=True
2026-05-29T07:41:14.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:41:14.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:41:14.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:12, diff=2.511331s, valid=True
2026-05-29T07:41:14.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:41:14.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:40:57, diff=17.51907s, valid=True
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:41:14.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:41:14.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:12, diff=2.522647s, valid=True
2026-05-29T07:41:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:41:14.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:41:14.522 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:41:14.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965916.523417s, valid=True
2026-05-29T07:41:14.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:41:14.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:41:14.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:41:14.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:41:14.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:41:14.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:41:14.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:41:14.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:41:14.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:41:14.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:41:14.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:41:14.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:41:14.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:41:14.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:41:15.049 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:41:15.384 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:41:15.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:41:15.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:41:15.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-29T07:41:15.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-29T07:41:15.663 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:41:15.663 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:41:45.693 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:41:45.694 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:41:45.694 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:41:45.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:41:45.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:41:46.078 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:41:46.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-29T07:41:46.088 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:41:46.088 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T07:41:46.097 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:41:46.097 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:41:46.101 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:41:46.102 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:41:48.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-29T07:41:48.613 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:41:48.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:41:48.621 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:41:48.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:41:48.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:41:48.643 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:41:48.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:41:48.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:41:48.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:41:48.645 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:41:48.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:41:48.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:41:48.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:41:48.777 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:41:48.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:41:48.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:41:48.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:41:48.916 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:41:48.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:41:48.958 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:41:48.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:41:48.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:41:48.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:41:49.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:41:28
2026-05-29T07:41:49.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71268, datetime.datetime(2026, 5, 29, 7, 41, 28), datetime.datetime(2026, 5, 29, 7, 41, 28), 'salt', 6.42, 82.01, None, 15.77, 97.29, 2.84, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:41:49.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:41:49.025 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:41:49.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:28, diff=21.032322s, valid=True
2026-05-29T07:41:49.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:41:49.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:41:49.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:12, diff=37.035679s, valid=True
2026-05-29T07:41:49.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:41:49.035 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:41:49.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:27, diff=22.043528s, valid=True
2026-05-29T07:41:49.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:41:49.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:41:49.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:41:49.043 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:41:49.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:41:49.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:41:49.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:12, diff=37.04723s, valid=True
2026-05-29T07:41:49.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:41:49.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:41:49.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:41:49.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965951.048038s, valid=True
2026-05-29T07:41:49.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:41:49.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:41:49.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:41:49.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:41:49.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:41:49.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:41:49.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:41:49.115 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:41:49.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:41:49.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:41:49.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:41:49.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:41:49.330 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:41:49.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:41:49.573 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:41:49.925 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:41:50.031 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:41:50.032 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:41:50.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-29T07:41:50.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-29T07:41:50.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:41:50.198 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:42:20.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:42:20.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:42:20.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:42:20.505 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:42:20.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:42:20.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:42:20.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:42:20.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:42:20.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-29T07:42:20.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:42:20.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:42:20.793 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:42: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-29T07:42:23.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-29T07:42:23.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:42:23.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:42:23.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:42:23.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:42:23.255 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:42:23.267 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:42:23.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:42:23.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:42:23.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:42:23.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:42:23.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:42:23.276 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:42:23.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:42:23.402 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:42:23.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:42:23.497 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:42:23.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:42:23.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:42:23.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:42:23.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:42:23.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:42:23.588 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:42:23.588 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:42:23.649 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:41:59
2026-05-29T07:42:23.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71269, datetime.datetime(2026, 5, 29, 7, 41, 59), datetime.datetime(2026, 5, 29, 7, 41, 58), 'salt', 6.49, 82.35, None, 15.74, 95.67, 2.78, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:42:23.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:42:23.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:42:23.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:58, diff=25.6566s, valid=True
2026-05-29T07:42:23.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:42:23.656 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:42:23.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:12, diff=11.660069s, valid=True
2026-05-29T07:42:23.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:42:23.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:41:58, diff=25.668269s, valid=True
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:42:23.668 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:42:23.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:12, diff=11.671988s, valid=True
2026-05-29T07:42:23.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:42:23.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:42:23.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:42:23.672 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=965985.672802s, valid=True
2026-05-29T07:42:23.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:42:23.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:42:23.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:42:23.674 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:42:23.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:42:23.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:42:23.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:42:23.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:42:23.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:42:23.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:42:23.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:42:23.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:42:23.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:42:23.998 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:42:24.202 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:42:24.536 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:42:24.638 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:42:24.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:42:24.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-29T07:42:24.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-29T07:42:24.803 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:42:24.803 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:42:54.834 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:42:54.834 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:42:54.834 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:42:55.390 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:42:55.401 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:42:55.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:42:55.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-29T07:42:55.607 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:42:55.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-29T07:42:55.616 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:42:55.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:42:55.621 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:42:55.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-29T07:42:58.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-29T07:42:58.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:42:58.054 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:42:58.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:42:58.055 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:42:58.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:42:58.079 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:42:58.080 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:42:58.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:42:58.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:42:58.081 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:42:58.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:42:58.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:42:58.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:42:58.216 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:42:58.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:42:58.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:42:58.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:42:58.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:42:58.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:42:58.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:42:58.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:42:58.398 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:42:58.398 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:42:58.457 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:42:29
2026-05-29T07:42:58.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71270, datetime.datetime(2026, 5, 29, 7, 42, 29), datetime.datetime(2026, 5, 29, 7, 42, 29), 'salt', 6.59, 82.51, None, 14.68, 106.33, 2.76, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:42:58.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:42:58.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:42:58.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:29, diff=29.464822s, valid=True
2026-05-29T07:42:58.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:42:58.465 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:42:58.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:12, diff=46.468352s, valid=True
2026-05-29T07:42:58.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:42:58.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:28, diff=30.476509s, valid=True
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:42:58.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:42:58.477 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:42:58.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:42:12, diff=46.480248s, valid=True
2026-05-29T07:42:58.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:42:58.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:42:58.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:42:58.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966020.481053s, valid=True
2026-05-29T07:42:58.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:42:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:42:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:42:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:42:58.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:42:58.547 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:42:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:42:58.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:42:58.568 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:42:58.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:42:58.681 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:42:58.714 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:42:58.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:42:58.803 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:42:59.063 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:42:59.399 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:42:59.498 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:42:59.498 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:42:59.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-29T07:42:59.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-29T07:42:59.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:42:59.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:43:29.692 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:43:29.692 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:43:29.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:43:29.965 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:43:29.973 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:43:30.169 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:43:30.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-29T07:43:30.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:43:30.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-29T07:43:30.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:43:30.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:43:30.194 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:43:30.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-29T07:43:32.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-29T07:43:32.604 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:43:32.612 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:43:32.613 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:43:32.613 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:43:32.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:43:32.634 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:43:32.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:43:32.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:43:32.635 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:43:32.635 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:43:32.635 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:43:32.640 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:43:32.753 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:43:32.754 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:43:32.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:43:32.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:43:32.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:43:32.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:43:32.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:43:32.933 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:43:32.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:43:32.938 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:43:32.938 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:43:32.996 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:43:30
2026-05-29T07:43:32.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71272, datetime.datetime(2026, 5, 29, 7, 43, 30), datetime.datetime(2026, 5, 29, 7, 43, 30), 'salt', 6.52, 82.81, None, 15.32, 89.47, 2.7, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:43:32.996 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:43:32.996 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:43:33.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:43:30, diff=3.003142s, valid=True
2026-05-29T07:43:33.003 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:43:33.003 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:43:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:43:12, diff=21.006448s, valid=True
2026-05-29T07:43:33.006 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:43:33.006 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:43:28, diff=5.014172s, valid=True
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:43:33.014 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:43:33.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:43:12, diff=21.017708s, valid=True
2026-05-29T07:43:33.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:43:33.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:43:33.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:43:33.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966055.018478s, valid=True
2026-05-29T07:43:33.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:43:33.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:43:33.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:43:33.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:43:33.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:43:33.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:43:33.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:43:33.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:43:33.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:43:33.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:43:33.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:43:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:43:33.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:43:33.339 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:43:33.543 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:43:33.878 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:43:33.975 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:43:33.976 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:43:33.976 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:43:33.976 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:43:34.148 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:43:34.148 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:44:04.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:44:04.179 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:44:04.179 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:44:04.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:44:04.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:44:04.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:44:04.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-29T07:44:04.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:44:04.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-29T07:44:04.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:44:04.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:44:04.704 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:44:04.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-29T07:44:07.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-29T07:44:07.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:44:07.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:44:07.137 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:44:07.137 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:44:07.148 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:44:07.161 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:44:07.162 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:44:07.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:44:07.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:44:07.163 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:44:07.163 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:44:07.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:44:07.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:44:07.302 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:44:07.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:44:07.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:44:07.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:44:07.457 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:44:07.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:44:07.503 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:44:07.508 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:44:07.509 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:44:07.509 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:44:07.572 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:44:01
2026-05-29T07:44:07.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71273, datetime.datetime(2026, 5, 29, 7, 44, 1), datetime.datetime(2026, 5, 29, 7, 44), 'salt', 6.52, 82.91, None, 14.54, 98.02, 2.68, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:44:07.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:44:07.572 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:44:07.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:00, diff=7.579685s, valid=True
2026-05-29T07:44:07.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:44:07.579 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:44:07.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:12, diff=-4.41679s, valid=True
2026-05-29T07:44:07.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:44:07.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:43:58, diff=9.591279s, valid=True
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:44:07.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:44:07.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:12, diff=-4.404918s, valid=True
2026-05-29T07:44:07.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:44:07.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:44:07.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:44:07.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966089.595928s, valid=True
2026-05-29T07:44:07.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:44:07.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:44:07.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:44:07.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:44:07.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:44:07.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:44:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:44:07.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:44:07.683 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:44:07.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:44:07.796 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:44:07.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:44:07.877 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:44:07.988 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:44:08.193 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:44:08.526 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:44:08.623 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:44:08.623 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:44:08.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-29T07:44:08.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-29T07:44:08.816 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:44:08.816 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:44:38.846 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:44:38.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:44:38.847 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:44:39.141 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:44:39.159 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:44:39.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:44:39.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-29T07:44:39.386 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:44:39.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-29T07:44:39.395 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:44:39.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:44:39.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:44:39.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-29T07:44:41.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-29T07:44:41.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:44:41.861 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:44:41.861 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:44:41.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:44:41.873 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:44:41.886 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:44:41.886 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:44:41.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:44:41.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:44:41.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:44:41.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:44:41.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:44:42.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:44:42.023 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:44:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:44:42.122 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:44:42.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:44:42.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:44:42.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:44:42.217 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:44:42.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:44:42.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:44:42.222 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:44:42.282 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:44:31
2026-05-29T07:44:42.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71274, datetime.datetime(2026, 5, 29, 7, 44, 31), datetime.datetime(2026, 5, 29, 7, 44, 31), 'salt', 6.52, 83.14, None, 14.33, 93.53, 2.64, 832.86, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:44:42.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:44:42.283 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:44:42.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:31, diff=11.290219s, valid=True
2026-05-29T07:44:42.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:44:42.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:44:42.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:12, diff=30.293772s, valid=True
2026-05-29T07:44:42.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:44:42.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:29, diff=13.302018s, valid=True
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:44:42.302 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:44:42.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:12, diff=30.305831s, valid=True
2026-05-29T07:44:42.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:44:42.306 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:44:42.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:44:42.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966124.306652s, valid=True
2026-05-29T07:44:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:44:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:44:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:44:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:44:42.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:44:42.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:44:42.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:44:42.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:44:42.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:44:42.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:44:42.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:44:42.542 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:44:42.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:44:42.632 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:44:42.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:44:43.172 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:44:43.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:44:43.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:44:43.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-29T07:44:43.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-29T07:44:43.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:44:43.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:45:13.476 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:45:13.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:45:13.477 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:45:13.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:45:13.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:45:14.130 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:45:14.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-29T07:45:14.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:45:14.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-29T07:45:14.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:45:14.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:45:14.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:45:14.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-29T07:45:16.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-29T07:45:16.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:45:16.610 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:45:16.611 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:45:16.611 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:45:16.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:45:16.635 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:45:16.635 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:45:16.636 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:45:16.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:45:16.637 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:45:16.637 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:45:16.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:45:16.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:45:16.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:45:16.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:45:16.875 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:45:16.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:45:16.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:45:16.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:45:16.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:45:16.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:45:16.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:45:16.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:45:17.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:45:01
2026-05-29T07:45:17.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71275, datetime.datetime(2026, 5, 29, 7, 45, 1), datetime.datetime(2026, 5, 29, 7, 45, 1), 'salt', 6.39, 83.28, None, 14.75, 89.5, 2.62, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:45:17.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:45:17.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:45:17.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:01, diff=16.029569s, valid=True
2026-05-29T07:45:17.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:45:17.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:45:17.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=5.033021s, valid=True
2026-05-29T07:45:17.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:45:17.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:45:17.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:44:59, diff=18.04072s, valid=True
2026-05-29T07:45:17.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:45:17.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:45:17.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:45:17.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:45:17.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:45:17.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:45:17.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=5.044231s, valid=True
2026-05-29T07:45:17.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:45:17.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:45:17.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:45:17.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966159.045014s, valid=True
2026-05-29T07:45:17.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:45:17.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:45:17.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:45:17.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:45:17.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:45:17.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:45:17.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:45:17.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:45:17.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:45:17.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:45:17.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:45:17.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:45:17.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:45:17.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:45:17.636 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:45:17.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:45:18.064 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:45:18.064 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:45:18.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-29T07:45:18.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-29T07:45:18.235 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:45:18.235 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:45:48.265 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:45:48.266 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:45:48.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:45:48.718 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:45:48.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:45:48.956 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:45:48.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-29T07:45:48.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:45:48.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-29T07:45:48.970 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:45:48.970 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:45:48.974 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:45:48.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-29T07:45:52.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:45:52.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:45:52.018 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:45:52.019 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:45:52.020 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:45:52.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:45:52.043 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:45:52.043 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:45:52.044 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:45:52.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:45:52.044 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:45:52.045 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:45:52.050 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:45:52.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:45:52.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:45:52.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:45:52.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:45:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:45:52.345 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:45:52.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T07:45:52.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:45:52.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:45:52.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:45:52.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:45:52.456 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:45:31
2026-05-29T07:45:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71276, datetime.datetime(2026, 5, 29, 7, 45, 31), datetime.datetime(2026, 5, 29, 7, 45, 31), 'salt', 6.39, 83.67, None, 13.09, 83.39, 2.55, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:45:52.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:45:52.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:45:52.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:31, diff=21.463909s, valid=True
2026-05-29T07:45:52.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:45:52.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:45:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=40.467423s, valid=True
2026-05-29T07:45:52.467 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:45:52.467 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:45:52.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:29, diff=23.475571s, valid=True
2026-05-29T07:45:52.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:45:52.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:45:52.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:45:52.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:45:52.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:45:52.476 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T07:45:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=40.479351s, valid=True
2026-05-29T07:45:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:45:52.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:45:52.479 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:45:52.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966194.480184s, valid=True
2026-05-29T07:45:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:45:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:45:52.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:45:52.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:45:52.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:45:52.545 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:45:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:45:52.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:45:52.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:45:52.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:45:52.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:45:52.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:45:52.761 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:45:52.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:45:53.004 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:45:53.340 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:45:53.438 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:45:53.438 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:45:53.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-29T07:45:53.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-29T07:45:53.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:45:53.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:46:23.635 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:46:23.635 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:46:23.636 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:46:23.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:46:23.954 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:46:24.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:46:24.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-29T07:46:24.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:46:24.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-29T07:46:24.172 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:46:24.172 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:46:24.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:46:24.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-29T07:46:27.023 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:46:27.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:46:27.031 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:46:27.031 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:46:27.032 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:46:27.041 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:46:27.054 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:46:27.055 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:46:27.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:46:27.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:46:27.056 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:46:27.056 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:46:27.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:46:27.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:46:27.189 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:46:27.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:46:27.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:46:27.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:46:27.335 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:46:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T07:46:27.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:46:27.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:46:27.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:46:27.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:46:27.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:46:02
2026-05-29T07:46:27.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71277, datetime.datetime(2026, 5, 29, 7, 46, 2), datetime.datetime(2026, 5, 29, 7, 46, 1), 'salt', 6.39, 83.81, None, 13.97, 87.45, 2.53, 832.86, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:46:27.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:46:27.441 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:46:27.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:46:01, diff=26.448158s, valid=True
2026-05-29T07:46:27.448 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:46:27.448 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:46:27.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=75.451663s, valid=True
2026-05-29T07:46:27.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:46:27.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:46:27.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:46:00, diff=27.459821s, valid=True
2026-05-29T07:46:27.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:46:27.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:46:27.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:46:27.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:46:27.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:46:27.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T07:46:27.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=75.463542s, valid=True
2026-05-29T07:46:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:46:27.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:46:27.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:46:27.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966229.464382s, valid=True
2026-05-29T07:46:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:46:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:46:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:46:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:46:27.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:46:27.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:46:27.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:46:27.531 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:46:27.616 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:46:27.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:46:27.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:46:27.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:46:27.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:46:27.852 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:46:28.058 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:46:28.392 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:46:28.490 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:46:28.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:46:28.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-29T07:46:28.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-29T07:46:28.668 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:46:28.668 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:46:58.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:46:58.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:46:58.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:46:58.883 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:46:58.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:46:59.095 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:46:59.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-29T07:46:59.104 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:46:59.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-29T07:46:59.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:46:59.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:46:59.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:46:59.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-29T07:47:01.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:47:01.727 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:47:01.734 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:47:01.735 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:47:01.735 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:47:01.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:47:01.760 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:47:01.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:47:01.761 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:47:01.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:47:01.762 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:47:01.762 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:47:01.769 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:47:01.893 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:47:01.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:47:01.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:47:01.988 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:47:02.032 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:47:02.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:47:02.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:47:02.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:47:02.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:47:02.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:47:02.080 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:47:02.138 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:46:32
2026-05-29T07:47:02.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71278, datetime.datetime(2026, 5, 29, 7, 46, 32), datetime.datetime(2026, 5, 29, 7, 46, 32), 'salt', 6.52, 83.84, None, 13.9, 86.91, 2.53, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:47:02.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:47:02.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:47:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:46:32, diff=30.146044s, valid=True
2026-05-29T07:47:02.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:47:02.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:47:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=110.149467s, valid=True
2026-05-29T07:47:02.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:47:02.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:46:31, diff=31.157476s, valid=True
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:47:02.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:47:02.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:47:02.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=110.161165s, valid=True
2026-05-29T07:47:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:47:02.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:47:02.161 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:47:02.162 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966264.161982s, valid=True
2026-05-29T07:47:02.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:47:02.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:47:02.163 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:47:02.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:47:02.164 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:47:02.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:47:02.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:47:02.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:47:02.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:47:02.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:47:02.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:47:02.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:47:02.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:47:02.485 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:47:02.689 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:47:03.026 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:47:03.126 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:47:03.126 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:47:03.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-29T07:47:03.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-29T07:47:03.385 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:47:03.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:47:33.406 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:47:33.406 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:47:33.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:47:33.563 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:47:33.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:47:33.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:47:33.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-29T07:47:33.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:47:33.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-29T07:47:33.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:47:33.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:47:33.796 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:47:33.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-29T07:47:36.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-29T07:47:36.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:47:36.372 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:47:36.373 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:47:36.373 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:47:36.383 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:47:36.395 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:47:36.396 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:47:36.396 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:47:36.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:47:36.397 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:47:36.397 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:47:36.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:47:36.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:47:36.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:47:36.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:47:36.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:47:36.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:47:36.709 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:47:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T07:47:36.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:47:36.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:47:36.749 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:47:36.749 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:47:36.810 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:47:33
2026-05-29T07:47:36.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71280, datetime.datetime(2026, 5, 29, 7, 47, 33), datetime.datetime(2026, 5, 29, 7, 47, 32), 'salt', 6.66, 83.57, None, 14.57, 93.23, 2.58, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:47:36.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:47:36.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:47:36.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:47:32, diff=4.81655s, valid=True
2026-05-29T07:47:36.816 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:47:36.816 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:47:36.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=144.819367s, valid=True
2026-05-29T07:47:36.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:47:36.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:47:31, diff=5.826049s, valid=True
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:47:36.826 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T07:47:36.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=144.829079s, valid=True
2026-05-29T07:47:36.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:47:36.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:47:36.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:47:36.829 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966298.829747s, valid=True
2026-05-29T07:47:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:47:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:47:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:47:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:47:36.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:47:36.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:47:36.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:47:36.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:47:36.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:47:36.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:47:37.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:47:37.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:47:37.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:47:37.144 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:47:37.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:47:37.680 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:47:37.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:47:37.780 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:47:37.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-29T07:47:37.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-29T07:47:38.037 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:47:38.037 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:48:08.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:48:08.066 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:48:08.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:48:08.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:48:08.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:48:08.744 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:48:08.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-29T07:48:08.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:48:08.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-29T07:48:08.761 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:48:08.761 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:48:08.766 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:48:08.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-29T07:48:11.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-29T07:48:11.445 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:48:11.452 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:48:11.453 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:48:11.453 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:48:11.464 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:48:11.477 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:48:11.478 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:48:11.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:48:11.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:48:11.479 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:48:11.479 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:48:11.486 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:48:11.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:48:11.613 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:48:11.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:48:11.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:48:11.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:48:11.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:48:11.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:48:11.801 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:48:11.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:48:11.806 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:48:11.806 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:48:11.868 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:48:03
2026-05-29T07:48:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71281, datetime.datetime(2026, 5, 29, 7, 48, 3), datetime.datetime(2026, 5, 29, 7, 48, 2), 'salt', 6.56, 83.54, None, 15.21, 92.43, 2.58, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:48:11.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:48:11.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:48:11.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:48:02, diff=9.87581s, valid=True
2026-05-29T07:48:11.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:48:11.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:48:11.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=179.879274s, valid=True
2026-05-29T07:48:11.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:48:11.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:48:01, diff=10.887387s, valid=True
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:48:11.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:48:11.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=179.891087s, valid=True
2026-05-29T07:48:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:48:11.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:48:11.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:48:11.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966333.891897s, valid=True
2026-05-29T07:48:11.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:48:11.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:48:11.893 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:48:11.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:48:11.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:48:11.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:48:11.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:48:11.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:48:11.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:48:12.031 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:48:12.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:48:12.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:48:12.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:48:12.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:48:12.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:48:12.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:48:12.902 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:48:12.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:48:12.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-29T07:48:12.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-29T07:48:13.192 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:48:13.192 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:48:43.221 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:48:43.221 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:48:43.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:48:43.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:48:43.494 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:48:43.681 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:48:43.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-29T07:48:43.692 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:48:43.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-29T07:48:43.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:48:43.701 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:48:43.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:48:43.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-29T07:48:46.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-29T07:48:46.853 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:48:46.858 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:48:46.859 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:48:46.859 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:48:46.866 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:48:46.878 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:48:46.878 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:48:46.878 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:48:46.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:48:46.878 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:48:46.878 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:48:46.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:48:46.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:48:46.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:48:47.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:48:47.059 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:48:47.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:48:47.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:48:47.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T07:48:47.141 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:48:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:48:47.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:48:47.145 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:48:47.204 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:48:33
2026-05-29T07:48:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71282, datetime.datetime(2026, 5, 29, 7, 48, 33), datetime.datetime(2026, 5, 29, 7, 48, 33), 'salt', 6.62, 83.51, None, 16.48, 91.77, 2.58, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:48:47.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:48:47.204 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:48:47.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:48:33, diff=14.210797s, valid=True
2026-05-29T07:48:47.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:48:47.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:48:47.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=215.213828s, valid=True
2026-05-29T07:48:47.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:48:47.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:48:31, diff=16.221034s, valid=True
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:48:47.221 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T07:48:47.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=215.224293s, valid=True
2026-05-29T07:48:47.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:48:47.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:48:47.224 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:48:47.225 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966369.225036s, valid=True
2026-05-29T07:48:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:48:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:48:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:48:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:48:47.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:48:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:48:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:48:47.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:48:47.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:48:47.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:48:47.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:48:47.456 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:48:47.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:48:47.546 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:48:47.752 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:48:48.088 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:48:48.190 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:48:48.190 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:48:48.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-29T07:48:48.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-29T07:48:48.359 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:48:48.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:49:18.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:49:18.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:49:18.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:49:18.548 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:49:18.564 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:49:18.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:49:18.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-29T07:49:18.775 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:49:18.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-29T07:49:18.786 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:49:18.786 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:49:18.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:49:18.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-29T07:49:22.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-29T07:49:22.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:49:22.273 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:49:22.274 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:49:22.274 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:49:22.284 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:49:22.297 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:49:22.297 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:49:22.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:49:22.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:49:22.298 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:49:22.299 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:49:22.304 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:49:22.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:49:22.425 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:49:22.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:49:22.520 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:49:22.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:49:22.563 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:49:22.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:49:22.603 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:49:22.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:49:22.608 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:49:22.608 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:49:22.669 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:49:03
2026-05-29T07:49:22.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71283, datetime.datetime(2026, 5, 29, 7, 49, 3), datetime.datetime(2026, 5, 29, 7, 49, 3), 'salt', 6.59, 83.48, None, 16.37, 90.95, 2.59, 832.86, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:49:22.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:49:22.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:49:22.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:49:03, diff=19.676975s, valid=True
2026-05-29T07:49:22.677 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:49:22.677 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:49:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=250.680419s, valid=True
2026-05-29T07:49:22.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:49:22.680 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:49:01, diff=21.688302s, valid=True
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:49:22.688 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:49:22.691 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=250.691912s, valid=True
2026-05-29T07:49:22.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:49:22.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:49:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:49:22.692 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966404.692723s, valid=True
2026-05-29T07:49:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:49:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:49:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:49:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:49:22.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:49:22.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:49:22.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:49:22.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:49:22.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:49:22.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:49:22.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:49:22.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:49:22.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:49:23.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:49:23.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:49:23.622 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:49:23.719 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:49:23.719 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:49:23.719 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:49:23.719 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:49:23.893 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:49:23.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:49:53.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:49:53.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:49: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-29T07:49:54.033 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:49:54.043 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:49:54.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:49:54.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-29T07:49:54.245 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:49:54.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-29T07:49:54.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:49:54.254 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:49:54.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:49:54.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-29T07:49:57.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:49:57.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:49:57.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:49:57.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:49:57.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:49:57.710 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:49:57.723 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:49:57.724 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:49:57.724 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:49:57.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:49:57.725 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:49:57.725 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:49:57.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:49:57.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:49:57.854 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:49:57.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:49:57.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:49:57.994 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:49:57.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:49:58.035 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:49:58.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:49:58.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:49:58.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:49:58.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:49:58.099 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:49:34
2026-05-29T07:49:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71284, datetime.datetime(2026, 5, 29, 7, 49, 34), datetime.datetime(2026, 5, 29, 7, 49, 33), 'salt', 6.69, 83.14, None, 15.63, 89.07, 2.65, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:49:58.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:49:58.100 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:49:58.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:49:33, diff=25.107212s, valid=True
2026-05-29T07:49:58.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:49:58.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:49:58.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=286.110672s, valid=True
2026-05-29T07:49:58.110 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:49:58.110 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:49:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:49:31, diff=27.118627s, valid=True
2026-05-29T07:49:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:49:58.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:49:58.118 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:49:58.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:49:58.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:49:58.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:49:58.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=286.122248s, valid=True
2026-05-29T07:49:58.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:49:58.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:49:58.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:49:58.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966440.123045s, valid=True
2026-05-29T07:49:58.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:49:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:49:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:49:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:49:58.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:49:58.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:49:58.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:49:58.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:49:58.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:49:58.263 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:49:58.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:49:58.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:49:58.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:49:58.447 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:49:58.655 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:49:58.993 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:49:59.092 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:49:59.092 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:49:59.092 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T07:49:59.092 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:49:59.262 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:49:59.263 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:50:29.293 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:50:29.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:50:29.293 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:50:29.613 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:50:29.628 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:50:29.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:50:29.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-29T07:50:29.853 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:50:29.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-29T07:50:29.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:50:29.861 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:50:29.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:50:29.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-29T07:50: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-29T07:50:32.463 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:50:32.470 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:50:32.471 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:50:32.471 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:50:32.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:50:32.494 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:50:32.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:50:32.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:50:32.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:50:32.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:50:32.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:50:32.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:50:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:50:32.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:50:32.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:50:32.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:50:32.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:50:32.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:50:32.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:50:32.811 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:50:32.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:50:32.816 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:50:32.816 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:50:32.876 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:50:04
2026-05-29T07:50:32.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71285, datetime.datetime(2026, 5, 29, 7, 50, 4), datetime.datetime(2026, 5, 29, 7, 50, 3), 'salt', 6.62, 82.94, None, 17.22, 91.54, 2.68, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:50:32.876 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:50:32.876 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:50:32.883 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:50:03, diff=29.883886s, valid=True
2026-05-29T07:50:32.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:50:32.884 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:50:32.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=320.887265s, valid=True
2026-05-29T07:50:32.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:50:32.887 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:50:32.894 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:50:02, diff=30.894926s, valid=True
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:50:32.895 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:50:32.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:45:12, diff=320.898241s, valid=True
2026-05-29T07:50:32.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:50:32.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:50:32.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:50:32.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966474.898985s, valid=True
2026-05-29T07:50:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:50:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:50:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:50:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:50:32.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:50:32.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:50:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:50:32.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:50:32.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:50:33.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:50:33.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:50:33.130 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:50:33.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:50:33.219 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:50:33.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:50:33.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:50:33.949 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:50:33.950 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:50:33.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-29T07:50:33.950 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T07:50:34.200 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:50:34.201 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:51:04.222 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:51:04.222 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:51:04.222 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:51:04.653 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:51:04.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:51:04.851 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:51:04.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-29T07:51:04.859 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:51:04.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-29T07:51:04.869 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:51:04.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:51:04.873 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:51:04.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-29T07:51:07.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-29T07:51:07.916 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:51:07.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:51:07.925 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:51:07.925 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:51:07.935 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:51:07.948 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:51:07.948 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:51:07.949 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:51:07.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:51:07.949 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:51:07.950 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:51:07.956 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:51:08.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:51:08.084 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:51:08.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:51:08.181 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:51:08.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:51:08.228 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:51:08.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:51:08.270 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:51:08.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:51:08.275 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:51:08.275 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:51:08.335 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:51:04
2026-05-29T07:51:08.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71287, datetime.datetime(2026, 5, 29, 7, 51, 4), datetime.datetime(2026, 5, 29, 7, 51, 4), 'salt', 6.72, 82.94, None, 15.35, 95.23, 2.68, 832.62, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:51:08.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:51:08.335 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:51:08.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:04, diff=4.342691s, valid=True
2026-05-29T07:51:08.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:51:08.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:51:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:12, diff=-3.653809s, valid=True
2026-05-29T07:51:08.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:51:08.346 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:04, diff=4.354376s, valid=True
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:51:08.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:51:08.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:12, diff=-3.641921s, valid=True
2026-05-29T07:51:08.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:51:08.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:51:08.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:51:08.358 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966510.358907s, valid=True
2026-05-29T07:51:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:51:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:51:08.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:51:08.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:51:08.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:51:08.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:51:08.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:51:08.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:51:08.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:51:08.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:51:08.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:51:08.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:51:08.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:51:08.680 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:51:08.892 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:51:09.231 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:51:09.332 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:51:09.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:51:09.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-29T07:51:09.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-29T07:51:09.505 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:51:09.505 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:51:39.534 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:51:39.534 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:51:39.535 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:51:39.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:51:39.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:51:40.110 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:51:40.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-29T07:51:40.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:51:40.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-29T07:51:40.128 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:51:40.128 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:51:40.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:51:40.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-29T07:51:43.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:51:43.074 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:51:43.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:51:43.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:51:43.082 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:51:43.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:51:43.106 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:51:43.106 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:51:43.107 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:51:43.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:51:43.107 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:51:43.108 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:51:43.115 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:51:43.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:51:43.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:51:43.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:51:43.344 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:51:43.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:51:43.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:51:43.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:51:43.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:51:43.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:51:43.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:51:43.435 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:51:43.493 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:51:34
2026-05-29T07:51:43.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71288, datetime.datetime(2026, 5, 29, 7, 51, 34), datetime.datetime(2026, 5, 29, 7, 51, 34), 'salt', 6.76, 82.75, None, 13.06, 96.33, 2.72, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:51:43.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:51:43.494 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:51:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:34, diff=9.501151s, valid=True
2026-05-29T07:51:43.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:51:43.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:51:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:12, diff=-28.495356s, valid=True
2026-05-29T07:51:43.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:51:43.504 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:51:43.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:51:32, diff=11.512579s, valid=True
2026-05-29T07:51:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:51:43.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:51:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:51:43.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:51:43.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:51:43.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:51:43.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:12, diff=-28.483843s, valid=True
2026-05-29T07:51:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:51:43.516 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:51:43.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:51:43.516 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966545.51695s, valid=True
2026-05-29T07:51:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:51:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:51:43.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:51:43.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:51:43.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:51:43.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:51:43.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:51:43.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:51:43.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:51:43.656 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:51:43.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:51:43.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:51:43.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:51:43.908 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:51:44.119 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:51:44.462 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:51:44.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:51:44.562 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:51:44.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-29T07:51:44.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-29T07:51:44.733 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:51:44.733 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:52:14.763 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:52:14.763 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:52:14.763 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:52:15.070 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:52:15.081 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:52:15.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:52:15.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-29T07:52:15.288 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:52:15.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-29T07:52:15.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:52:15.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:52:15.303 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:52:15.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-29T07:52:17.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T07:52:17.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:52:17.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:52:17.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:52:17.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:52:17.955 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:52:17.968 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:52:17.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:52:17.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:52:17.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:52:17.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:52:17.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:52:17.977 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:52:18.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:52:18.105 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:52:18.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:52:18.200 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:52:18.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:52:18.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:52:18.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:52:18.291 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:52:18.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:52:18.295 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:52:18.295 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:52:18.355 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:52:05
2026-05-29T07:52:18.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71289, datetime.datetime(2026, 5, 29, 7, 52, 5), datetime.datetime(2026, 5, 29, 7, 52, 4), 'salt', 6.79, 82.71, None, 16.2, 98.82, 2.73, 832.81, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:52:18.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:52:18.356 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:52:18.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:04, diff=14.363005s, valid=True
2026-05-29T07:52:18.363 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:52:18.363 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:52:18.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:12, diff=6.366384s, valid=True
2026-05-29T07:52:18.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:52:18.366 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:03, diff=15.374253s, valid=True
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:52:18.374 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:52:18.377 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:12, diff=6.377878s, valid=True
2026-05-29T07:52:18.377 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:52:18.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:52:18.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:52:18.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966580.378671s, valid=True
2026-05-29T07:52:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:52:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:52:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:52:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:52:18.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:52:18.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:52:18.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:52:18.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:52:18.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:52:18.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:52:18.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:52:18.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:52:18.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:52:18.700 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:52:18.930 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:52:19.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:52:19.373 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:52:19.373 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:52:19.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-29T07:52:19.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-29T07:52:19.624 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:52:19.624 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:52:49.630 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:52:49.631 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:52:49.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:52:50.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:52:50.056 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:52:50.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:52:50.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-29T07:52:50.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:52:50.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-29T07:52:50.265 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:52:50.265 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:52:50.271 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:52:50.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-29T07:52:52.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-29T07:52:52.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:52:52.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:52:52.838 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:52:52.838 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:52:52.849 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:52:52.862 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:52:52.862 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:52:52.863 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:52:52.863 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:52:52.863 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:52:52.863 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:52:52.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:52:52.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:52:52.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:52:53.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:52:53.094 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:52:53.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:52:53.139 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:52:53.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:52:53.180 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:52:53.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:52:53.185 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:52:53.185 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:52:53.246 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:52:35
2026-05-29T07:52:53.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71290, datetime.datetime(2026, 5, 29, 7, 52, 35), datetime.datetime(2026, 5, 29, 7, 52, 35), 'salt', 6.72, 82.78, None, 16.02, 101.28, 2.71, 832.68, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:52:53.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:52:53.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:52:53.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:35, diff=18.254206s, valid=True
2026-05-29T07:52:53.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:52:53.254 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:52:53.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:12, diff=-18.742302s, valid=True
2026-05-29T07:52:53.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:52:53.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:52:53.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:52:33, diff=20.265752s, valid=True
2026-05-29T07:52:53.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:52:53.265 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:52:53.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:52:53.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:52:53.266 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:52:53.266 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:52:53.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:12, diff=-18.730429s, valid=True
2026-05-29T07:52:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:52:53.269 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:52:53.269 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:52:53.270 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966615.270389s, valid=True
2026-05-29T07:52:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:52:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:52:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:52:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:52:53.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:52:53.336 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:52:53.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:52:53.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:52:53.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:52:53.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:52:53.536 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:52:53.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:52:53.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:52:53.658 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:52:53.873 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:52:54.214 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:52:54.315 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:52:54.315 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:52:54.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-29T07:52:54.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-29T07:52:54.562 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:52:54.562 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:53:24.585 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:53:24.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:53:24.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:53:24.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:53:24.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:53:24.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:53:24.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-29T07:53:24.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:53:24.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-29T07:53:24.963 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:53:24.963 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:53:24.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:53:24.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-29T07:53:27.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-29T07:53:27.674 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:53:27.681 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:53:27.682 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:53:27.683 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:53:27.693 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:53:27.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:53:27.706 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:53:27.706 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:53:27.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:53:27.707 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:53:27.707 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:53:27.713 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:53:27.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:53:27.842 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:53:27.939 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:53:27.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:53:27.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:53:27.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:53:28.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:53:28.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:53:28.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:53:28.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:53:28.033 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:53:28.094 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:53:05
2026-05-29T07:53:28.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71291, datetime.datetime(2026, 5, 29, 7, 53, 5), datetime.datetime(2026, 5, 29, 7, 53, 5), 'salt', 6.69, 83.04, None, 17.04, 99.9, 2.67, 832.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:53:28.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:53:28.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:53:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:05, diff=23.101592s, valid=True
2026-05-29T07:53:28.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:53:28.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:53:28.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:12, diff=16.105063s, valid=True
2026-05-29T07:53:28.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:53:28.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:53:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:03, diff=25.113528s, valid=True
2026-05-29T07:53:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:53:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:53:28.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:53:28.113 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:53:28.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:53:28.114 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:53:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:12, diff=16.117277s, valid=True
2026-05-29T07:53:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:53:28.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:53:28.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:53:28.118 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966650.118086s, valid=True
2026-05-29T07:53:28.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:53:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:53:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:53:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:53:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:53:28.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:53:28.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:53:28.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:53:28.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:53:28.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:53:28.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:53:28.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:53:28.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:53:28.445 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:53:28.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:53:29.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:53:29.109 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:53:29.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:53:29.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-29T07:53:29.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-29T07:53:29.320 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:53:29.320 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:53:59.331 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:53:59.331 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:53:59.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:53:59.484 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:53:59.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:53:59.737 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:53:59.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-29T07:53:59.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:53:59.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-29T07:53:59.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:53:59.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:53:59.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:53:59.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-29T07:54:02.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-29T07:54:02.334 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:54:02.342 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:54:02.343 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:54:02.343 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:54:02.354 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:54:02.366 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:54:02.367 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:54:02.367 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:54:02.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:54:02.368 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:54:02.368 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:54:02.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:54:02.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:54:02.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:54:02.592 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:54:02.593 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:54:02.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:54:02.634 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:54:02.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:54:02.673 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:54:02.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:54:02.678 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:54:02.678 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:54:02.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:53:35
2026-05-29T07:54:02.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71292, datetime.datetime(2026, 5, 29, 7, 53, 35), datetime.datetime(2026, 5, 29, 7, 53, 35), 'salt', 6.72, 83.44, None, 15.07, 95.62, 2.6, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:54:02.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:54:02.736 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:54:02.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:35, diff=27.743381s, valid=True
2026-05-29T07:54:02.743 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:54:02.743 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:54:02.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:54:12, diff=-9.25337s, valid=True
2026-05-29T07:54:02.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:54:02.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:53:33, diff=29.754335s, valid=True
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:54:02.754 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:54:02.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:54:12, diff=-9.242264s, valid=True
2026-05-29T07:54:02.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:54:02.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:54:02.757 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:54:02.758 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966684.758478s, valid=True
2026-05-29T07:54:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:54:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:54:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:54:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:54:02.760 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:54:02.822 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:54:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:54:02.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:54:02.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:54:02.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:54:02.976 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:54:03.009 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:54:03.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:54:03.100 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:54:03.339 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:54:03.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:54:03.783 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:54:03.783 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:54:03.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-29T07:54:03.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-29T07:54:04.024 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:54:04.024 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:54:34.050 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:54:34.050 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:54:34.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:54:34.192 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:54:34.204 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:54:34.402 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:54:34.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-29T07:54:34.412 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:54:34.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-29T07:54:34.420 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:54:34.420 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:54:34.427 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:54:34.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-29T07:54:37.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-29T07:54:37.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:54:37.072 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:54:37.072 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:54:37.072 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:54:37.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:54:37.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:54:37.095 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:54:37.095 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:54:37.095 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:54:37.095 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:54:37.095 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:54:37.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:54:37.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:54:37.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:54:37.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:54:37.286 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:54:37.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:54:37.330 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:54:37.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:54:37.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:54:37.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:54:37.374 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:54:37.374 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:54:37.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:54:36
2026-05-29T07:54:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71294, datetime.datetime(2026, 5, 29, 7, 54, 36), datetime.datetime(2026, 5, 29, 7, 54, 36), 'salt', 6.76, 83.97, None, 18.42, 99.03, 2.51, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T07:54:37.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:54:37.433 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:54:37.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:54:36, diff=1.440265s, valid=True
2026-05-29T07:54:37.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:54:37.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:54:37.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:12, diff=-34.556482s, valid=True
2026-05-29T07:54:37.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:54:37.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:54:34, diff=3.451139s, valid=True
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:54:37.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:54:37.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:12, diff=-34.545322s, valid=True
2026-05-29T07:54:37.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:54:37.454 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:54:37.454 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:54:37.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966719.455434s, valid=True
2026-05-29T07:54:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:54:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:54:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:54:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:54:37.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:54:37.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:54:37.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:54:37.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:54:37.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:54:37.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:54:37.655 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:54:37.688 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:54:37.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:54:37.777 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:54:37.989 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:54:38.390 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:54:38.489 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:54:38.489 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:54:38.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-29T07:54:38.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-29T07:54:38.666 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:54:38.666 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:55:08.677 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:55:08.677 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:55:08.678 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:55:09.005 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:55:09.024 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:55:09.262 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:55:09.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-29T07:55:09.269 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:55:09.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-29T07:55:09.279 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:55:09.279 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:55:09.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:55:09.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-29T07:55:12.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-29T07:55:12.021 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:55:12.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:55:12.030 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:55:12.030 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:55:12.042 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:55:12.060 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:55:12.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:55:12.061 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:55:12.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:55:12.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:55:12.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:55:12.068 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:55:12.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:55:12.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:55:12.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:55:12.296 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:55:12.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:55:12.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:55:12.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:55:12.385 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:55:12.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:55:12.390 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:55:12.390 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:55:12.450 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:55:06
2026-05-29T07:55:12.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71295, datetime.datetime(2026, 5, 29, 7, 55, 6), datetime.datetime(2026, 5, 29, 7, 55, 6), 'salt', 6.82, 84.27, None, 15.32, 106.54, 2.46, 832.68, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:55:12.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:55:12.451 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:55:12.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:06, diff=6.458563s, valid=True
2026-05-29T07:55:12.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:55:12.458 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:55:12.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:12, diff=0.462066s, valid=True
2026-05-29T07:55:12.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:55:12.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:05, diff=7.470374s, valid=True
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:55:12.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:55:12.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:12, diff=0.474164s, valid=True
2026-05-29T07:55:12.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:55:12.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:55:12.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:55:12.475 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966754.475011s, valid=True
2026-05-29T07:55:12.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:55:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:55:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:55:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:55:12.477 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:55:12.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:55:12.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:55:12.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:55:12.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:55:12.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:55:12.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:55:12.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:55:12.758 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:55:12.797 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:55:13.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:55:13.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:55:13.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:55:13.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:55:13.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-29T07:55:13.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-29T07:55:13.628 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:55:13.628 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:55:43.658 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:55:43.659 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:55:43.659 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:55:43.990 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:55:44.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:55:44.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:55:44.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-29T07:55:44.230 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:55:44.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-29T07:55:44.239 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:55:44.239 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:55:44.244 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:55:44.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-29T07:55:46.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-29T07:55:46.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:55:46.974 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:55:46.975 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:55:46.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:55:46.984 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:55:46.996 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:55:46.997 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:55:46.998 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:55:46.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:55:46.998 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:55:46.998 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:55:47.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:55:47.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:55:47.136 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:55:47.229 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:55:47.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:55:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:55:47.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:55:47.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:55:47.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:55:47.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:55:47.320 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:55:47.320 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:55:47.381 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:55:36
2026-05-29T07:55:47.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71296, datetime.datetime(2026, 5, 29, 7, 55, 36), datetime.datetime(2026, 5, 29, 7, 55, 36), 'salt', 6.89, 84.24, None, 15.46, 96.0, 2.47, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:55:47.381 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:55:47.381 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:55:47.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:36, diff=11.388546s, valid=True
2026-05-29T07:55:47.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:55:47.388 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:55:47.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:12, diff=-24.608006s, valid=True
2026-05-29T07:55:47.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:55:47.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:55:47.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:55:34, diff=13.399932s, valid=True
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:55:47.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:55:47.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:12, diff=-24.596468s, valid=True
2026-05-29T07:55:47.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:55:47.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:55:47.403 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:55:47.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966789.404347s, valid=True
2026-05-29T07:55:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:55:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:55:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:55:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:55:47.406 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:55:47.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:55:47.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:55:47.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:55:47.491 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:55:47.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:55:47.605 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:55:47.637 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:55:47.686 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:55:47.727 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:55:48.013 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:55:48.359 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:55:48.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:55:48.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:55: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-29T07:55: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-29T07:55:48.623 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:55:48.623 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:56:18.651 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:56:18.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:56:18.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:56:18.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:56:18.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:56:19.030 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:56:19.030 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T07:56:19.040 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:56:19.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-29T07:56:19.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:56:19.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:56:19.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:56:19.055 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:56:21.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-29T07:56:21.894 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:56:21.902 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:56:21.903 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:56:21.903 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:56:21.913 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:56:21.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:56:21.927 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:56:21.927 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:56:21.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:56:21.928 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:56:21.928 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:56:21.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:56:22.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:56:22.063 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:56:22.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:56:22.159 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:56:22.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:56:22.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:56:22.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:56:22.248 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:56:22.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:56:22.252 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:56:22.252 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:56:22.360 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:56:07
2026-05-29T07:56:22.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71297, datetime.datetime(2026, 5, 29, 7, 56, 7), datetime.datetime(2026, 5, 29, 7, 56, 6), 'salt', 6.76, 84.44, None, 16.13, 96.92, 2.44, 832.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:56:22.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:56:22.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:56:22.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:06, diff=16.368056s, valid=True
2026-05-29T07:56:22.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:56:22.368 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:56:22.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:12, diff=10.37146s, valid=True
2026-05-29T07:56:22.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:56:22.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:04, diff=18.37944s, valid=True
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:56:22.379 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:56:22.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:56:22.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:12, diff=10.383168s, valid=True
2026-05-29T07:56:22.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:56:22.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:56:22.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:56:22.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966824.383996s, valid=True
2026-05-29T07:56:22.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:56:22.385 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:56:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:56:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:56:22.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:56:22.450 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:56:22.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:56:22.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:56:22.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:56:22.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:56:22.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:56:22.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:56:22.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:56:22.706 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:56:22.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:56:23.262 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:56:23.362 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:56:23.362 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:56:23.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-29T07:56:23.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-29T07:56:23.609 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:56:23.610 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:56:53.640 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:56:53.640 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:56:53.640 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:56:53.816 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:56:53.830 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:56:54.034 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:56:54.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-29T07:56:54.044 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:56:54.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-29T07:56:54.053 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:56:54.053 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:56:54.061 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:56:54.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-29T07:56:56.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-29T07:56:56.798 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:56:56.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:56:56.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:56:56.806 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:56:56.817 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:56:56.830 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:56:56.830 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:56:56.831 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:56:56.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:56:56.831 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:56:56.832 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:56:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:56:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:56:56.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:56:57.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:56:57.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:56:57.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:56:57.102 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:56:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:56:57.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:56:57.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:56:57.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:56:57.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:56:57.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:56:37
2026-05-29T07:56:57.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71298, datetime.datetime(2026, 5, 29, 7, 56, 37), datetime.datetime(2026, 5, 29, 7, 56, 37), 'salt', 6.72, 84.5, None, 17.5, 92.64, 2.42, 832.93, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:56:57.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:56:57.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:56:57.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:37, diff=20.21585s, valid=True
2026-05-29T07:56:57.215 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:56:57.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:56:57.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:12, diff=-14.780753s, valid=True
2026-05-29T07:56:57.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:56:57.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:56:35, diff=22.227112s, valid=True
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:56:57.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:56:57.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:12, diff=-14.769293s, valid=True
2026-05-29T07:56:57.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:56:57.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:56:57.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:56:57.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966859.231485s, valid=True
2026-05-29T07:56:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:56:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:56:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:56:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:56:57.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:56:57.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:56:57.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:56:57.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:56:57.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:56:57.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:56:57.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:56:57.464 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:56:57.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:56:57.622 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:56:57.835 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:56:58.179 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:56:58.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:56:58.279 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:56:58.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-29T07:56:58.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-29T07:56:58.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:56:58.451 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:57:28.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:57:28.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:57:28.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:57:28.632 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:57:28.645 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:57:28.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:57:28.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-29T07:57:28.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:57:28.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-29T07:57:28.864 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:57:28.864 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:57:28.871 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:57:28.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-29T07:57:31.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-29T07:57:31.899 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:57:31.907 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:57:31.908 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:57:31.908 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:57:31.919 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:57:31.932 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:57:31.932 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:57:31.933 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:57:31.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:57:31.933 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:57:31.934 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:57:31.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:57:32.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:57:32.077 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:57:32.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:57:32.176 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:57:32.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:57:32.220 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:57:32.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:57:32.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:57:32.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:57:32.268 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:57:32.268 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:57:32.332 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:57:07
2026-05-29T07:57:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71299, datetime.datetime(2026, 5, 29, 7, 57, 7), datetime.datetime(2026, 5, 29, 7, 57, 7), 'salt', 6.79, 84.5, None, 14.26, 105.6, 2.42, 832.87, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:57:32.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:57:32.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:57:32.338 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:07, diff=25.338973s, valid=True
2026-05-29T07:57:32.339 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:57:32.339 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:57:32.341 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:12, diff=20.341877s, valid=True
2026-05-29T07:57:32.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:57:32.342 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:57:32.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:05, diff=27.34866s, valid=True
2026-05-29T07:57:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:57:32.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:57:32.348 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:57:32.348 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:57:32.349 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:57:32.349 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:57:32.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:12, diff=20.35167s, valid=True
2026-05-29T07:57:32.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:57:32.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:57:32.351 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:57:32.352 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966894.352334s, valid=True
2026-05-29T07:57:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:57:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:57:32.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:57:32.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:57:32.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:57:32.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:57:32.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:57:32.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:57:32.433 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:57:32.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:57:32.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:57:32.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:57:32.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:57:32.670 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:57:32.881 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:57:33.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:57:33.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:57:33.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:57:33.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-29T07:57:33.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-29T07:57:33.493 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:57:33.494 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:58:03.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:58:03.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:58:03.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:58:03.799 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:58:03.813 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:58:04.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:58:04.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-29T07:58:04.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:58:04.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-29T07:58:04.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:58:04.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:58:04.036 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:58:04.036 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:58:06.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-29T07:58:06.692 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:58:06.699 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:58:06.699 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:58:06.699 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:58:06.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:58:06.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:58:06.721 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:58:06.721 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:58:06.721 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:58:06.721 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:58:06.721 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:58:06.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:58:06.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T07:58:06.810 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:58:06.907 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T07:58:06.908 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:58:06.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:58:06.952 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:58:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:58:06.991 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:58:06.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:58:06.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:58:06.997 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:58:07.061 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:57:37
2026-05-29T07:58:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71300, datetime.datetime(2026, 5, 29, 7, 57, 37), datetime.datetime(2026, 5, 29, 7, 57, 37), 'salt', 6.72, 84.4, None, 16.3, 94.57, 2.43, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:58:07.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:58:07.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T07:58:07.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:37, diff=30.068761s, valid=True
2026-05-29T07:58:07.068 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:58:07.068 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:58:07.071 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:58:12, diff=-4.92809s, valid=True
2026-05-29T07:58:07.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:58:07.072 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:57:35, diff=32.07926s, valid=True
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:58:07.079 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:58:07.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:58:12, diff=-4.917329s, valid=True
2026-05-29T07:58:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:58:07.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:58:07.082 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:58:07.083 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966929.083406s, valid=True
2026-05-29T07:58:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:58:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:58:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:58:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:58:07.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:58:07.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:58:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:58:07.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:58:07.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:58:07.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:58:07.351 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:58:07.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:58:07.432 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:58:07.472 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:58:07.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:58:08.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:58:08.129 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:58:08.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:58:08.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-29T07:58:08.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-29T07:58:08.383 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:58:08.383 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:58:38.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:58:38.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:58:38.386 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:58:38.550 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:58:38.565 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:58:38.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:58:38.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-29T07:58:38.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:58:38.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-29T07:58:38.789 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:58:38.789 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:58:38.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:58:38.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-29T07:58:41.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-29T07:58:41.606 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:58:41.613 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:58:41.615 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:58:41.615 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:58:41.624 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:58:41.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:58:41.637 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:58:41.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:58:41.639 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:58:41.639 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:58:41.639 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:58:41.646 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:58:41.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:58:41.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:58:41.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:58:41.868 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:58:41.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:58:41.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:58:41.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:58:41.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:58:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:58:41.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:58:41.961 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:58:42.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:58:38
2026-05-29T07:58:42.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71302, datetime.datetime(2026, 5, 29, 7, 58, 38), datetime.datetime(2026, 5, 29, 7, 58, 38), 'salt', 6.79, 84.3, None, 16.2, 94.87, 2.46, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:58:42.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:58:42.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:58:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:58:38, diff=4.029324s, valid=True
2026-05-29T07:58:42.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:58:42.029 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:58:42.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:12, diff=-29.967251s, valid=True
2026-05-29T07:58:42.032 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:58:42.032 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:58:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:58:36, diff=6.040705s, valid=True
2026-05-29T07:58:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:58:42.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:58:42.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:58:42.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:58:42.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:58:42.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:58:42.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:12, diff=-29.955657s, valid=True
2026-05-29T07:58:42.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:58:42.044 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:58:42.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:58:42.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966964.045145s, valid=True
2026-05-29T07:58:42.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:58:42.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:58:42.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:58:42.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:58:42.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:58:42.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:58:42.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:58:42.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:58:42.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:58:42.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:58:42.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:58:42.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:58:42.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:58:42.367 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:58:42.579 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:58:42.920 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:58:43.019 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:58:43.019 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:58:43.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-29T07:58:43.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-29T07:58:43.269 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:58:43.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:59:13.299 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:59:13.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:59:13.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:59:13.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:59:13.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:59:13.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:59:13.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-29T07:59:13.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:59:13.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-29T07:59:13.999 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:59:13.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:59:14.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:59:14.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-29T07:59:17.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-29T07:59:17.005 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:59:17.012 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:59:17.013 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:59:17.013 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:59:17.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:59:17.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:59:17.037 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:59:17.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:59:17.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:59:17.038 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:59:17.038 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:59:17.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:59:17.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:59:17.165 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:59:17.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:59:17.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:59:17.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:59:17.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:59:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T07:59:17.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:59:17.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:59:17.334 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:59:17.334 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:59:17.392 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:59:08
2026-05-29T07:59:17.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71303, datetime.datetime(2026, 5, 29, 7, 59, 8), datetime.datetime(2026, 5, 29, 7, 59, 8), 'salt', 6.79, 84.3, None, 16.37, 88.32, 2.46, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:59:17.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:59:17.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:59:17.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:08, diff=9.399178s, valid=True
2026-05-29T07:59:17.399 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:59:17.399 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:59:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:12, diff=5.402097s, valid=True
2026-05-29T07:59:17.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:59:17.402 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:59:17.408 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:06, diff=11.408887s, valid=True
2026-05-29T07:59:17.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:59:17.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:59:17.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:59:17.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:59:17.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:59:17.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T07:59:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:12, diff=5.411984s, valid=True
2026-05-29T07:59:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:59:17.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:59:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:59:17.412 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=966999.412654s, valid=True
2026-05-29T07:59:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:59:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:59:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:59:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:59:17.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:59:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:59:17.473 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:59:17.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:59:17.493 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:59:17.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:59:17.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:59:17.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:59:17.754 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:59:17.794 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:59:18.008 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:59:18.356 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:59:18.458 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:59:18.458 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:59:18.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-29T07:59:18.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-29T07:59:18.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:59:18.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T07:59:48.645 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T07:59:48.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T07:59:48.646 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T07:59:48.954 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T07:59:48.967 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T07:59:49.168 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T07:59:49.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-29T07:59:49.175 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T07:59:49.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-29T07:59:49.182 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T07:59:49.182 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T07:59:49.195 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T07:59:49.195 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T07:59:52.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-29T07:59:52.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T07:59:52.191 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T07:59:52.191 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-28
2026-05-29T07:59:52.192 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T07:59:52.202 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-28
2026-05-29T07:59:52.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-28', '07:28', '17:40', '15:36', '05:42', 95, '19:06', '06:01')
2026-05-29T07:59:52.215 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T07:59:52.216 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T07:59:52.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T07:59:52.216 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T07:59:52.216 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T07:59:52.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T07:59:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T07:59:52.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T07:59:52.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T07:59:52.442 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:59:52.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:59:52.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T07:59:52.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T07:59:52.529 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T07:59:52.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T07:59:52.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T07:59:52.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T07:59:52.595 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 07:59:39
2026-05-29T07:59:52.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71304, datetime.datetime(2026, 5, 29, 7, 59, 39), datetime.datetime(2026, 5, 29, 7, 59, 38), 'salt', 6.79, 84.27, None, 15.88, 89.66, 2.46, 832.8, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T07:59:52.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T07:59:52.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T07:59:52.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:38, diff=14.602769s, valid=True
2026-05-29T07:59:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T07:59:52.602 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:59:52.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:12, diff=-19.393771s, valid=True
2026-05-29T07:59:52.606 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T07:59:52.606 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 07:59:37, diff=15.614304s, valid=True
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T07:59:52.614 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T07:59:52.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:12, diff=-19.382022s, valid=True
2026-05-29T07:59:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T07:59:52.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T07:59:52.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T07:59:52.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967034.618801s, valid=True
2026-05-29T07:59:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T07:59:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T07:59:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T07:59:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T07:59:52.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T07:59:52.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T07:59:52.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T07:59:52.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T07:59:52.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T07:59:52.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T07:59:52.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T07:59:52.871 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T07:59:52.920 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T07:59:52.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T07:59:53.174 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:59:53.516 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T07:59:53.617 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T07:59:53.618 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T07:59:53.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-29T07:59:53.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-29T07:59:53.691 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T07:59:53.691 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:00:23.697 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:00:23.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:00:23.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:00:23.860 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:00:23.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:00:24.133 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:00:24.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-29T08:00:24.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:00:24.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-29T08:00:24.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:00:24.151 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:00:24.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:00:24.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-29T08:00:27.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-29T08:00:27.029 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:00:27.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:00:27.038 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:00:27.038 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:00:27.048 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:00:27.061 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:00:27.061 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:00:27.062 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:00:27.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:00:27.062 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:00:27.062 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:00:27.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:00:27.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:00:27.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:00:27.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:00:27.288 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:00:27.331 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:00:27.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:00:27.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:00:27.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:00:27.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:00:27.377 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:00:27.377 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:00:27.437 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:00:09
2026-05-29T08:00:27.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71305, datetime.datetime(2026, 5, 29, 8, 0, 9), datetime.datetime(2026, 5, 29, 8, 0, 9), 'salt', 6.76, 84.24, None, 14.93, 90.55, 2.47, 832.74, 'DRY', 0, None, 0, 1, 0, 1)]
2026-05-29T08:00:27.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:00:27.437 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:00:27.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:09, diff=18.444252s, valid=True
2026-05-29T08:00:27.444 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:00:27.444 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:00:27.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:12, diff=15.447587s, valid=True
2026-05-29T08:00:27.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:00:27.447 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:09, diff=18.455454s, valid=True
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:00:27.455 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:00:27.456 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:00:27.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:12, diff=15.459021s, valid=True
2026-05-29T08:00:27.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:00:27.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:00:27.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:00:27.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967069.45981s, valid=True
2026-05-29T08:00:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:00:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:00:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:00:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:00:27.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:00:27.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:00:27.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:00:27.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:00:27.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:00:27.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:00:27.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:00:27.691 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:00:27.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:00:27.780 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:00:27.991 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:00:28.334 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:00:28.433 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:00:28.433 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:00:28.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-29T08:00:28.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-29T08:00:28.608 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:00:28.608 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:00:58.638 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:00:58.638 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:00:58.639 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:00:58.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:00:58.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:00:58.992 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:00:58.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-29T08:00:59.000 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:00:59.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-29T08:00:59.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:00:59.009 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:00:59.016 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:00:59.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-29T08:01:01.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-29T08:01:01.747 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:01:01.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:01:01.756 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:01:01.756 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:01:01.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:01:01.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-29T08:01:01.778 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:01:01.779 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:01:01.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:01:01.779 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:01:01.779 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:01:01.787 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:01:01.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:01:01.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:01:01.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:01:01.960 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:01:02.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:01:02.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:01:02.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:01:02.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:01:02.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:01:02.044 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:01:02.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:01:02.102 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:00:39
2026-05-29T08:01:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71306, datetime.datetime(2026, 5, 29, 8, 0, 39), datetime.datetime(2026, 5, 29, 8, 0, 39), 'salt', 6.86, 83.74, None, 16.62, 92.9, 2.56, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:01:02.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:01:02.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:01:02.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:39, diff=23.10897s, valid=True
2026-05-29T08:01:02.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:01:02.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:01:02.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:12, diff=-9.887963s, valid=True
2026-05-29T08:01:02.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:01:02.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:00:36, diff=26.11939s, valid=True
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:01:02.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:01:02.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:12, diff=-9.877314s, valid=True
2026-05-29T08:01:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:01:02.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:01:02.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:01:02.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967104.123409s, valid=True
2026-05-29T08:01:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:01:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:01:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:01:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:01:02.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:01:02.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:01:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:01:02.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:01:02.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:01:02.260 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:01:02.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:01:02.353 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:01:02.403 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:01:02.443 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:01:02.672 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:01:03.080 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:01:03.181 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:01:03.181 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:01:03.181 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:01:03.181 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:01:03.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:01:03.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:01:33.430 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:01:33.431 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:01: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-29T08:01:33.605 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:01:33.615 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:01:33.805 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:01:33.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-29T08:01:33.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:01:33.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-29T08:01:33.824 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:01:33.824 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:01:33.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:01:33.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-29T08:01:36.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-29T08:01:36.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:01:36.494 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:01:36.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:01:36.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:01:36.506 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:01:36.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-29T08:01:36.520 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:01:36.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:01:36.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:01:36.521 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:01:36.521 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:01:36.528 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:01:36.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:01:36.664 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:01:36.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:01:36.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:01:36.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:01:36.809 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:01:36.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:01:36.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:01:36.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:01:36.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:01:36.861 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:01:36.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:01:09
2026-05-29T08:01:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71307, datetime.datetime(2026, 5, 29, 8, 1, 9), datetime.datetime(2026, 5, 29, 8, 1, 9), 'salt', 7.15, 82.51, None, 14.12, 91.23, 2.76, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:01:36.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:01:36.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:01:36.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:09, diff=27.932806s, valid=True
2026-05-29T08:01:36.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:01:36.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:01:36.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:12, diff=24.936195s, valid=True
2026-05-29T08:01:36.936 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:01:36.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:07, diff=29.944055s, valid=True
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:01:36.944 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:01:36.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:01:12, diff=24.947683s, valid=True
2026-05-29T08:01:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:01:36.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:01:36.947 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:01:36.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967138.948463s, valid=True
2026-05-29T08:01:36.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:01:36.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:01:36.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:01:36.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:01:36.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:01:37.013 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:01:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:01:37.014 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:01:37.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:01:37.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:01:37.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:01:37.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:01:37.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:01:37.270 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:01:37.483 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:01:37.829 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:01:37.928 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:01:37.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:01:37.929 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:01:37.929 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:01:38.165 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:01:38.165 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:02:08.195 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:02:08.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:02:08.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:02:08.344 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:02:08.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:02:08.591 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:02:08.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-29T08:02:08.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:02:08.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-29T08:02:08.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:02:08.610 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:02:08.615 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:02:08.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-29T08:02:11.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-29T08:02:11.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:02:11.760 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:02:11.761 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:02:11.761 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:02:11.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:02:11.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-29T08:02:11.784 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:02:11.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:02:11.784 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:02:11.785 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:02:11.785 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:02:11.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:02:11.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:02:11.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:02:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:02:12.010 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:02:12.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:02:12.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:02:12.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:02:12.095 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:02:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:02:12.100 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:02:12.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:02:12.158 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:02:10
2026-05-29T08:02:12.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71309, datetime.datetime(2026, 5, 29, 8, 2, 10), datetime.datetime(2026, 5, 29, 8, 2, 10), 'salt', 7.22, 81.62, None, 14.33, 91.96, 2.93, 832.77, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:02:12.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:02:12.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:02:12.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:10, diff=2.165614s, valid=True
2026-05-29T08:02:12.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:02:12.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:02:12.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:12, diff=0.169028s, valid=True
2026-05-29T08:02:12.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:02:12.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:02:12.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:07, diff=5.17696s, valid=True
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:02:12.177 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:02:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:12, diff=0.185095s, valid=True
2026-05-29T08:02:12.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:02:12.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:02:12.185 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:02:12.186 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967174.186749s, valid=True
2026-05-29T08:02:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:02:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:02:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:02:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:02:12.190 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:02:12.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:02:12.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:02:12.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:02:12.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:02:12.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:02:12.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:02:12.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:02:12.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:02:12.508 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:02:12.789 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:02:13.130 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:02:13.234 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:02:13.234 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:02:13.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-29T08:02:13.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-29T08:02:13.409 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:02:13.409 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:02:43.439 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:02:43.439 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:02:43.439 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:02:43.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:02:43.608 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:02:43.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:02:43.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-29T08:02:43.820 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:02:43.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-29T08:02:43.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:02:43.827 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:02:43.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:02:43.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-29T08:02:46.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-29T08:02:46.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:02:46.787 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:02:46.788 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:02:46.788 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:02:46.798 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:02:46.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:02:46.811 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:02:46.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:02:46.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:02:46.812 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:02:46.813 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:02:46.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:02:46.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:02:46.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:02:47.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:02:47.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:02:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:02:47.083 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:02:47.126 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:02:47.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:02:47.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:02:47.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:02:47.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:02:47.192 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:02:40
2026-05-29T08:02:47.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71310, datetime.datetime(2026, 5, 29, 8, 2, 40), datetime.datetime(2026, 5, 29, 8, 2, 40), 'salt', 7.29, 81.68, None, 16.37, 93.42, 2.92, 832.74, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:02:47.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:02:47.192 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:02:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:40, diff=7.199467s, valid=True
2026-05-29T08:02:47.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:02:47.199 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:02:47.202 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:12, diff=-24.797125s, valid=True
2026-05-29T08:02:47.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:02:47.203 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:02:47.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:02:37, diff=10.210708s, valid=True
2026-05-29T08:02:47.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:02:47.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:02:47.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:02:47.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:02:47.211 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:02:47.211 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:02:47.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:12, diff=-24.785687s, valid=True
2026-05-29T08:02:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:02:47.214 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:02:47.214 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:02:47.215 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967209.215102s, valid=True
2026-05-29T08:02:47.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:02:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:02:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:02:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:02:47.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:02:47.280 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:02:47.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:02:47.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:02:47.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:02:47.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:02:47.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:02:47.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:02:47.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:02:47.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:02:47.747 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:02:48.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:02:48.196 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:02:48.196 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:02:48.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-29T08:02:48.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-29T08:02:48.381 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:02:48.381 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:03:18.394 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:03:18.394 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:03:18.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:03:18.865 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:03:18.884 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:03:19.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:03:19.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-29T08:03:19.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:03:19.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-29T08:03:19.116 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:03:19.116 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:03:19.120 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:03:19.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-29T08:03:21.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-29T08:03:21.875 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:03:21.880 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:03:21.880 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:03:21.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:03:21.888 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:03:21.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-29T08:03:21.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:03:21.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:03:21.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:03:21.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:03:21.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:03:21.905 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:03:21.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:03:21.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:03:22.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:03:22.080 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:03:22.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:03:22.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:03:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:03:22.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:03:22.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:03:22.172 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:03:22.173 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:03:22.230 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:03:10
2026-05-29T08:03:22.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71311, datetime.datetime(2026, 5, 29, 8, 3, 10), datetime.datetime(2026, 5, 29, 8, 3, 10), 'salt', 7.35, 81.48, None, 16.3, 87.85, 2.95, 832.86, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:03:22.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:03:22.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:03:22.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:10, diff=12.236954s, valid=True
2026-05-29T08:03:22.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:03:22.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:03:22.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:12, diff=10.24025s, valid=True
2026-05-29T08:03:22.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:03:22.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:03:22.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:08, diff=14.247922s, valid=True
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:03:22.248 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:03:22.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:12, diff=10.251412s, valid=True
2026-05-29T08:03:22.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:03:22.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:03:22.251 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:03:22.252 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967244.252193s, valid=True
2026-05-29T08:03:22.253 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:03:22.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:03:22.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:03:22.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:03:22.254 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:03:22.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:03:22.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:03:22.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:03:22.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:03:22.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:03:22.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:03:22.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:03:22.534 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:03:22.574 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:03:22.879 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:03:23.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:03:23.326 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:03:23.326 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:03:23.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-29T08:03:23.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-29T08:03:23.500 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:03:23.500 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:03:53.509 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:03:53.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:03:53.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:03:53.835 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:03:53.849 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:03:54.048 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:03: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-29T08:03:54.059 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:03:54.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-29T08:03:54.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:03:54.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:03:54.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:03:54.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-29T08:03:57.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-29T08:03:57.621 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:03:57.629 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:03:57.630 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:03:57.630 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:03:57.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:03:57.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-29T08:03:57.654 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:03:57.654 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:03:57.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:03:57.655 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:03:57.655 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:03:57.661 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:03:57.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:03:57.793 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:03:57.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:03:57.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:03:57.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:03:57.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:03:57.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:03:57.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:03:58.003 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:03:58.004 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:03:58.004 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:03:58.067 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:03:41
2026-05-29T08:03:58.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71312, datetime.datetime(2026, 5, 29, 8, 3, 41), datetime.datetime(2026, 5, 29, 8, 3, 40), 'salt', 7.29, 81.42, None, 17.18, 85.62, 2.97, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:03:58.067 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:03:58.067 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:03:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:40, diff=18.074464s, valid=True
2026-05-29T08:03:58.074 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:03:58.074 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:03:58.077 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:12, diff=-13.922095s, valid=True
2026-05-29T08:03:58.078 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:03:58.078 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:03:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:03:39, diff=19.08573s, valid=True
2026-05-29T08:03:58.085 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:03:58.085 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:03:58.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:03:58.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:03:58.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:03:58.086 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:03:58.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:12, diff=-13.910731s, valid=True
2026-05-29T08:03:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:03:58.089 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:03:58.089 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:03:58.090 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967280.090038s, valid=True
2026-05-29T08:03:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:03:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:03:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:03:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:03:58.092 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:03:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:03:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:03:58.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:03:58.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:03:58.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:03:58.288 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:03:58.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:03:58.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:03:58.411 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:03:58.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:03:58.968 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:03:59.069 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:03:59.069 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:03:59.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-29T08:03:59.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-29T08:03:59.309 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:03:59.309 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:04:29.335 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:04:29.335 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:04:29.335 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:04:29.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:04:29.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:04:29.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:04:29.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-29T08:04:29.794 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:04:29.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:04:29.803 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:04:29.803 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:04:29.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:04:29.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:04:32.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-29T08:04:32.631 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:04:32.639 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:04:32.639 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:04:32.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:04:32.649 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:04:32.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-29T08:04:32.663 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:04:32.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:04:32.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:04:32.664 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:04:32.664 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:04:32.668 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:04:32.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:04:32.894 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:04:32.982 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:04:32.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:04:33.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:04:33.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:04:33.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:04:33.081 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:04:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:04:33.085 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:04:33.085 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:04:33.148 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:04:11
2026-05-29T08:04:33.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71313, datetime.datetime(2026, 5, 29, 8, 4, 11), datetime.datetime(2026, 5, 29, 8, 4, 10), 'salt', 7.35, 80.99, None, 16.27, 88.46, 3.04, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:04:33.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:04:33.149 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:04:33.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:10, diff=23.15533s, valid=True
2026-05-29T08:04:33.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:04:33.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:04:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:12, diff=21.158257s, valid=True
2026-05-29T08:04:33.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:04:33.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:04:33.164 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:10, diff=23.16493s, valid=True
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:04:33.165 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:04:33.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:12, diff=21.168023s, valid=True
2026-05-29T08:04:33.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:04:33.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:04:33.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:04:33.168 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967315.168701s, valid=True
2026-05-29T08:04:33.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:04:33.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:04:33.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:04:33.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:04:33.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:04:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:04:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:04:33.230 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:04:33.250 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:04:33.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:04:33.366 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:04:33.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:04:33.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:04:33.561 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:04:33.776 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:04:34.126 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:04:34.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:04:34.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:04:34.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-29T08:04:34.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-29T08:04:34.485 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:04:34.485 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:05:04.515 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:05:04.515 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:05:04.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:05:04.945 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:05:04.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:05:05.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:05:05.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-29T08:05:05.143 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:05:05.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-29T08:05:05.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:05:05.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:05:05.158 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:05:05.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-29T08:05:07.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:05:07.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:05:07.691 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:05:07.692 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:05:07.692 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:05:07.703 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:05:07.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-29T08:05:07.715 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:05:07.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:05:07.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:05:07.715 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:05:07.716 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:05:07.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:05:07.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:05:07.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:05:08.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:05:08.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:05:08.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:05:08.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:05:08.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:05:08.164 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:05:08.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:05:08.168 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:05:08.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:05:08.231 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:04:41
2026-05-29T08:05:08.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71314, datetime.datetime(2026, 5, 29, 8, 4, 41), datetime.datetime(2026, 5, 29, 8, 4, 41), 'salt', 7.42, 80.62, None, 17.04, 88.02, 3.11, 832.8, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:05:08.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:05:08.231 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:05:08.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:41, diff=27.237317s, valid=True
2026-05-29T08:05:08.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:05:08.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:05:08.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:05:12, diff=-3.759855s, valid=True
2026-05-29T08:05:08.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:05:08.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:05:08.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:04:38, diff=30.24682s, valid=True
2026-05-29T08:05:08.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:05:08.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:05:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:05:08.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:05:08.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:05:08.247 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:05:08.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:05:12, diff=-3.750162s, valid=True
2026-05-29T08:05:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:05:08.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:05:08.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:05:08.250 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967350.250499s, valid=True
2026-05-29T08:05:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:05:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:05:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:05:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:05:08.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:05:08.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:05:08.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:05:08.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:05:08.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:05:08.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:05:08.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:05:08.478 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:05:08.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:05:08.567 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:05:08.782 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:05:09.127 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:05:09.229 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:05:09.229 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:05:09.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-29T08:05:09.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-29T08:05:09.477 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:05:09.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:05:39.508 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:05:39.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:05:39.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:05:39.696 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:05:39.703 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:05:39.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:05:39.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-29T08:05:39.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:05:39.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-29T08:05:39.915 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:05:39.915 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:05:39.920 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:05:39.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-29T08:05:42.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-29T08:05:42.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:05:42.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:05:42.410 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:05:42.410 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:05:42.418 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:05:42.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-29T08:05:42.430 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:05:42.430 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:05:42.430 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:05:42.430 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:05:42.430 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:05:42.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:05:42.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:05:42.625 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:05:42.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:05:42.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:05:42.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:05:42.883 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:05:42.921 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:05:42.922 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:05:42.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:05:42.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:05:42.925 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:05:43.000 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:05:42
2026-05-29T08:05:43.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71316, datetime.datetime(2026, 5, 29, 8, 5, 42), datetime.datetime(2026, 5, 29, 8, 5, 41), 'salt', 7.69, 78.99, None, 16.87, 89.5, 3.41, 832.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:05:43.001 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:05:43.001 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:05:43.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:05:41, diff=2.007136s, valid=True
2026-05-29T08:05:43.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:05:43.007 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:05:43.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:12, diff=-28.989973s, valid=True
2026-05-29T08:05:43.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:05:43.010 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:05:39, diff=4.01658s, valid=True
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:05:43.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:05:43.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:05:43.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:12, diff=-28.9804s, valid=True
2026-05-29T08:05:43.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:05:43.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:05:43.019 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:05:43.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967385.020303s, valid=True
2026-05-29T08:05:43.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:05:43.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:05:43.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:05:43.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:05:43.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:05:43.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:05:43.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:05:43.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:05:43.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:05:43.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:05:43.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:05:43.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:05:43.368 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:05:43.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:05:43.625 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:05:43.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:05:44.074 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:05:44.075 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:05:44.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-29T08:05:44.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-29T08:05:44.248 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:05:44.248 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:06:14.278 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:06:14.278 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:06:14.278 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:06:14.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:06:14.742 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:06:14.928 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:06:14.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-29T08:06:14.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:06:14.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-29T08:06:14.944 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:06:14.945 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:06:14.950 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:06:14.950 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:06:17.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-29T08:06:17.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:06:17.500 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:06:17.500 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:06:17.500 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:06:17.510 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:06:17.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-29T08:06:17.522 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:06:17.522 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:06:17.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:06:17.523 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:06:17.523 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:06:17.527 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:06:17.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:06:17.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:06:17.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:06:17.775 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:06:17.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:06:17.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:06:17.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:06:17.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:06:17.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:06:17.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:06:17.874 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:06:17.935 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:06:12
2026-05-29T08:06:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71317, datetime.datetime(2026, 5, 29, 8, 6, 12), datetime.datetime(2026, 5, 29, 8, 6, 12), 'salt', 7.72, 77.97, None, 15.28, 84.19, 3.59, 832.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:06:17.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:06:17.935 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:06:17.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:12, diff=5.942119s, valid=True
2026-05-29T08:06:17.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:06:17.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:06:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:12, diff=5.945164s, valid=True
2026-05-29T08:06:17.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:06:17.945 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:09, diff=8.952288s, valid=True
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:06:17.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:06:17.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:12, diff=5.955519s, valid=True
2026-05-29T08:06:17.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:06:17.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:06:17.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:06:17.956 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967419.956219s, valid=True
2026-05-29T08:06:17.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:06:17.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:06:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:06:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:06:17.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:06:18.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:06:18.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:06:18.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:06:18.042 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:06:18.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:06:18.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:06:18.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:06:18.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:06:18.298 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:06:18.541 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:06:18.903 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:06:19.012 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:06:19.013 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:06:19.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-29T08:06:19.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-29T08:06:19.240 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:06:19.241 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:06:49.269 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:06:49.270 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:06:49.270 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:06:49.520 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:06:49.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:06:49.774 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:06: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-29T08:06:49.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:06:49.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-29T08:06:49.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:06:49.791 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:06:49.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:06:49.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-29T08:06:52.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-29T08:06:52.240 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:06:52.244 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:06:52.245 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:06:52.245 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:06:52.253 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:06:52.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-29T08:06:52.265 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:06:52.265 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:06:52.265 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:06:52.265 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:06:52.265 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:06:52.269 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:06:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:06:52.349 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:06:52.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:06:52.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:06:52.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:06:52.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:06:52.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:06:52.519 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:06:52.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:06:52.523 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:06:52.523 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:06:52.581 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:06:42
2026-05-29T08:06:52.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71318, datetime.datetime(2026, 5, 29, 8, 6, 42), datetime.datetime(2026, 5, 29, 8, 6, 42), 'salt', 7.82, 77.57, None, 15.81, 89.59, 3.67, 832.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:06:52.581 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:06:52.581 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:06:52.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:42, diff=10.587531s, valid=True
2026-05-29T08:06:52.587 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:06:52.587 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:06:52.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:12, diff=-19.409604s, valid=True
2026-05-29T08:06:52.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:06:52.590 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:06:39, diff=13.597055s, valid=True
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:06:52.597 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:06:52.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:12, diff=-19.399839s, valid=True
2026-05-29T08:06:52.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:06:52.600 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:06:52.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:06:52.600 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967454.600854s, valid=True
2026-05-29T08:06:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:06:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:06:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:06:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:06:52.602 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:06:52.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:06:52.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:06:52.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:06:52.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:06:52.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:06:52.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:06:52.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:06:52.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:06:52.922 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:06:53.157 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:06:53.502 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:06:53.601 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:06:53.601 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:06:53.602 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:06:53.602 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:06:53.858 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:06:53.858 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:07:23.888 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:07:23.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:07:23.888 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:07:24.146 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:07:24.153 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:07:24.332 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:07:24.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-29T08:07:24.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:07:24.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-29T08:07:24.351 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:07:24.351 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:07:24.359 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:07:24.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-29T08:07:27.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-29T08:07:27.741 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:07:27.744 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:07:27.745 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:07:27.745 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:07:27.754 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:07:27.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:07:27.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:07:27.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:07:27.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:07:27.766 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:07:27.766 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:07:27.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:07:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:07:27.850 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:07:27.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:07:27.937 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:07:28.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:07:28.002 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:07:28.039 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:07:28.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:07:28.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:07:28.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:07:28.044 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:07:28.101 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:07:12
2026-05-29T08:07:28.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71319, datetime.datetime(2026, 5, 29, 8, 7, 12), datetime.datetime(2026, 5, 29, 8, 7, 12), 'salt', 7.79, 77.57, None, 15.42, 87.62, 3.67, 832.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:07:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:07:28.102 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:07:28.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:12, diff=16.108813s, valid=True
2026-05-29T08:07:28.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:07:28.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:07:28.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:12, diff=16.112249s, valid=True
2026-05-29T08:07:28.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:07:28.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:10, diff=18.120093s, valid=True
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:07:28.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:07:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:12, diff=16.123688s, valid=True
2026-05-29T08:07:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:07:28.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:07:28.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:07:28.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967490.12448s, valid=True
2026-05-29T08:07:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:07:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:07:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:07:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:07:28.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:07:28.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:07:28.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:07:28.189 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:07:28.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:07:28.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:07:28.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:07:28.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:07:28.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:07:28.446 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:07:28.658 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:07:29.061 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:07:29.160 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:07:29.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:07:29.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-29T08:07:29.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-29T08:07:29.431 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:07:29.431 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:07:59.461 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:07:59.461 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:07:59.461 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:07:59.594 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:07:59.601 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:07:59.790 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:07:59.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-29T08:07:59.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:07:59.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-29T08:07:59.808 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:07:59.808 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:07:59.815 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:07:59.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-29T08:08:02.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-29T08:08:02.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:08:02.460 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:08:02.461 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:08:02.461 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:08:02.469 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:08:02.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:08:02.482 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:08:02.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:08:02.482 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:08:02.482 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:08:02.482 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:08:02.488 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:08:02.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:08:02.567 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:08:02.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:08:02.653 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:08:02.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:08:02.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:08:02.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:08:02.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:08:02.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:08:02.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:08:02.736 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:08:02.794 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:07:43
2026-05-29T08:08:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71320, datetime.datetime(2026, 5, 29, 8, 7, 43), datetime.datetime(2026, 5, 29, 8, 7, 42), 'salt', 7.72, 77.4, None, 15.84, 89.57, 3.7, 832.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:08:02.794 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:08:02.794 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:08:02.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:42, diff=20.800267s, valid=True
2026-05-29T08:08:02.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:08:02.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:08:02.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:12, diff=-9.196879s, valid=True
2026-05-29T08:08:02.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:08:02.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:08:02.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:07:40, diff=22.809769s, valid=True
2026-05-29T08:08:02.809 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:08:02.809 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:08:02.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:08:02.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:08:02.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:08:02.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:08:02.812 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:12, diff=-9.187172s, valid=True
2026-05-29T08:08:02.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:08:02.812 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:08:02.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:08:02.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967524.813479s, valid=True
2026-05-29T08:08:02.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:08:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:08:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:08:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:08:02.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:08:02.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:08:02.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:08:02.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:08:02.895 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:08:02.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:08:03.010 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:08:03.043 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:08:03.093 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:08:03.133 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:08:03.347 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:08:03.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:08:03.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:08:03.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:08:03.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-29T08:08:03.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-29T08:08:04.080 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:08:04.081 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:08:34.096 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:08:34.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:08:34.096 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:08:34.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:08:34.658 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:08:34.882 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:08:34.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-29T08:08:34.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:08:34.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-29T08:08:34.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:08:34.901 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:08:34.908 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:08:34.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-29T08:08:37.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-29T08:08:37.340 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:08:37.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:08:37.344 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:08:37.344 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:08:37.353 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:08:37.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-29T08:08:37.365 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:08:37.365 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:08:37.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:08:37.365 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:08:37.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:08:37.370 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:08:37.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:08:37.492 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:08:37.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:08:37.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:08:37.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:08:37.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:08:37.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:08:37.666 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:08:37.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:08:37.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:08:37.670 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:08:37.730 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:08:13
2026-05-29T08:08:37.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71321, datetime.datetime(2026, 5, 29, 8, 8, 13), datetime.datetime(2026, 5, 29, 8, 8, 12), 'salt', 7.75, 77.5, None, 14.08, 88.42, 3.68, 832.99, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:08:37.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:08:37.731 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:08:37.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:12, diff=25.737119s, valid=True
2026-05-29T08:08:37.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:08:37.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:08:37.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:12, diff=25.740001s, valid=True
2026-05-29T08:08:37.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:08:37.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:08:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:11, diff=26.746672s, valid=True
2026-05-29T08:08:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:08:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:08:37.746 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:08:37.746 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:08:37.747 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:08:37.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:08:37.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:12, diff=25.749711s, valid=True
2026-05-29T08:08:37.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:08:37.749 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:08:37.749 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:08:37.750 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967559.750363s, valid=True
2026-05-29T08:08:37.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:08:37.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:08:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:08:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:08:37.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:08:37.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:08:37.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:08:37.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:08:37.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:08:37.884 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:08:37.945 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:08:37.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:08:38.027 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:08:38.066 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:08:38.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:08:38.706 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:08:38.805 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:08:38.805 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:08: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-29T08:08: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-29T08:08:39.015 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:08:39.015 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:09:09.046 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:09:09.046 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:09:09.046 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:09:09.254 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:09:09.261 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:09:09.442 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:09:09.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-29T08:09:09.451 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:09:09.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-29T08:09:09.462 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:09:09.462 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:09:09.470 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:09:09.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-29T08:09:11.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-29T08:09:11.956 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:09:11.960 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:09:11.960 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:09:11.961 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:09:11.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:09:11.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-29T08:09:11.982 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:09:11.982 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:09:11.983 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:09:11.983 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:09:11.983 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:09:11.986 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:09:12.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:09:12.066 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:09:12.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:09:12.154 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:09:12.198 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:09:12.199 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:09:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:09:12.237 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:09:12.241 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:09:12.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:09:12.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:09:12.301 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:08:43
2026-05-29T08:09:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71322, datetime.datetime(2026, 5, 29, 8, 8, 43), datetime.datetime(2026, 5, 29, 8, 8, 43), 'salt', 7.69, 77.7, None, 15.1, 85.62, 3.64, 832.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:09:12.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:09:12.301 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:09:12.307 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:43, diff=29.307928s, valid=True
2026-05-29T08:09:12.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:09:12.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:09:12.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:09:12, diff=0.310877s, valid=True
2026-05-29T08:09:12.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:09:12.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:08:40, diff=32.318038s, valid=True
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:09:12.318 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:09:12.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:09:12, diff=0.321259s, valid=True
2026-05-29T08:09:12.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:09:12.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:09:12.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:09:12.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967594.321982s, valid=True
2026-05-29T08:09:12.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:09:12.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:09:12.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:09:12.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:09:12.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:09:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:09:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:09:12.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:09:12.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:09:12.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:09:12.528 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:09:12.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:09:12.617 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:09:12.660 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:09:12.885 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:09:13.252 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:09:13.357 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:09:13.357 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:09:13.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-29T08:09:13.358 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:09:13.617 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:09:13.617 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:09:43.641 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:09:43.641 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:09:43.641 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:09:44.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:09:44.163 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:09:44.343 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:09:44.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-29T08:09:44.352 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:09:44.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-29T08:09:44.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:09:44.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:09:44.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:09:44.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-29T08:09:47.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-29T08:09:47.485 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:09:47.488 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:09:47.488 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:09:47.489 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:09:47.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:09:47.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-29T08:09:47.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:09:47.508 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:09:47.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:09:47.508 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:09:47.508 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:09:47.514 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:09:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:09:47.594 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:09:47.681 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:09:47.682 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:09:47.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:09:47.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:09:47.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:09:47.764 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:09:47.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:09:47.768 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:09:47.768 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:09:47.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:09:43
2026-05-29T08:09:47.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71324, datetime.datetime(2026, 5, 29, 8, 9, 43), datetime.datetime(2026, 5, 29, 8, 9, 43), 'salt', 7.75, 78.5, None, 15.03, 86.21, 3.49, 832.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:09:47.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:09:47.828 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:09:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:09:43, diff=4.834439s, valid=True
2026-05-29T08:09:47.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:09:47.834 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:09:47.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:12, diff=-24.162666s, valid=True
2026-05-29T08:09:47.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:09:47.837 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:09:41, diff=6.844095s, valid=True
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:09:47.844 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:09:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:12, diff=-24.152856s, valid=True
2026-05-29T08:09:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:09:47.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:09:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:09:47.847 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967629.847815s, valid=True
2026-05-29T08:09:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:09:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:09:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:09:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:09:47.849 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:09:47.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:09:47.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:09:47.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:09:47.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:09:47.984 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:09:48.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:09:48.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:09:48.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:09:48.173 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:09:48.465 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:09:48.821 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:09:48.923 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:09:48.924 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:09:48.924 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:09:48.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-29T08:09:49.177 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:09:49.178 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:10:19.208 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:10:19.208 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:10:19.208 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:10:19.446 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:10:19.453 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:10:19.640 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:10:19.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-29T08:10:19.650 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:10:19.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-29T08:10:19.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:10:19.660 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:10:19.667 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:10:19.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-29T08:10:22.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-29T08:10:22.662 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:10:22.666 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:10:22.666 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:10:22.666 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:10:22.675 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:10:22.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-29T08:10:22.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:10:22.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:10:22.687 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:10:22.687 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:10:22.687 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:10:22.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:10:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:10:22.772 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:10:22.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:10:22.857 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:10:22.901 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:10:22.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:10:22.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:10:22.940 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:10:22.944 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:10:22.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:10:22.945 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:10:23.001 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:10:14
2026-05-29T08:10:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71325, datetime.datetime(2026, 5, 29, 8, 10, 14), datetime.datetime(2026, 5, 29, 8, 10, 14), 'salt', 7.72, 78.8, None, 13.41, 90.72, 3.44, 832.74, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:10:23.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:10:23.002 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:10:23.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:14, diff=9.008179s, valid=True
2026-05-29T08:10:23.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:10:23.008 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:10:23.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:12, diff=11.01106s, valid=True
2026-05-29T08:10:23.011 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:10:23.011 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:10:23.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:11, diff=12.017746s, valid=True
2026-05-29T08:10:23.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:10:23.017 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:10:23.017 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:10:23.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:10:23.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:10:23.018 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:10:23.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:12, diff=11.020768s, valid=True
2026-05-29T08:10:23.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:10:23.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:10:23.020 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:10:23.021 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967665.021431s, valid=True
2026-05-29T08:10:23.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:10:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:10:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:10:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:10:23.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:10:23.081 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:10:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:10:23.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:10:23.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:10:23.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:10:23.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:10:23.251 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:10:23.301 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:10:23.342 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:10:23.558 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:10:23.901 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:10:24.005 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:10:24.005 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:10:24.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-29T08:10:24.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-29T08:10:24.259 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:10:24.259 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:10:54.262 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:10:54.262 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:10:54.263 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:10:54.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:10:54.603 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:10:54.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:10:54.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-29T08:10:54.795 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:10:54.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-29T08:10:54.804 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:10:54.804 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:10:54.811 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:10:54.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-29T08:10:57.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-29T08:10:57.519 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:10:57.523 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:10:57.523 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:10:57.523 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:10:57.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:10: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-29T08:10:57.543 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:10:57.543 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:10:57.543 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:10:57.543 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:10:57.543 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:10:57.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:10:57.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:10:57.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:10:57.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:10:57.712 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:10:57.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:10:57.755 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:10:57.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:10:57.795 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:10:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:10:57.799 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:10:57.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:10:57.859 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:10:45
2026-05-29T08:10:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71326, datetime.datetime(2026, 5, 29, 8, 10, 45), datetime.datetime(2026, 5, 29, 8, 10, 44), 'salt', 7.69, 79.03, None, 17.29, 89.28, 3.4, 832.8, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:10:57.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:10:57.859 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:10:57.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:44, diff=13.865295s, valid=True
2026-05-29T08:10:57.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:10:57.865 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:10:57.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:12, diff=-14.131784s, valid=True
2026-05-29T08:10:57.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:10:57.868 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:10:57.874 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:10:41, diff=16.87485s, valid=True
2026-05-29T08:10:57.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:10:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:10:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:10:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:10:57.875 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:10:57.875 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:10:57.877 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:12, diff=-14.122049s, valid=True
2026-05-29T08:10:57.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:10:57.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:10:57.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:10:57.878 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967699.878605s, valid=True
2026-05-29T08:10:57.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:10:57.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:10:57.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:10:57.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:10:57.880 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:10:57.938 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:10:57.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:10:57.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:10:57.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:10:58.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:10:58.073 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:10:58.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:10:58.231 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:10:58.271 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:10:58.486 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:10:58.833 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:10:58.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:10:58.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:10:58.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-29T08:10:58.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-29T08:10:59.197 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:10:59.197 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:11:29.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:11:29.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:11:29.228 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:11:29.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:11:29.580 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:11:29.762 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:11:29.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-29T08:11:29.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:11:29.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-29T08:11:29.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:11:29.779 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:11:29.784 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:11:29.784 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:11:32.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-29T08:11:32.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:11:32.957 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:11:32.957 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:11:32.957 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:11:32.965 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:11:32.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-29T08:11:32.977 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:11:32.977 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:11:32.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:11:32.977 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:11:32.977 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:11:32.983 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:11:33.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:11:33.064 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:11:33.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:11:33.153 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:11:33.196 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:11:33.197 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:11:33.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:11:33.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:11:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:11:33.242 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:11:33.242 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:11:33.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:11:15
2026-05-29T08:11:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71327, datetime.datetime(2026, 5, 29, 8, 11, 15), datetime.datetime(2026, 5, 29, 8, 11, 14), 'salt', 7.69, 79.06, None, 17.11, 87.85, 3.4, 832.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:11:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:11:33.304 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:11:33.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:14, diff=19.310048s, valid=True
2026-05-29T08:11:33.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:11:33.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:11:33.312 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:12, diff=21.312936s, valid=True
2026-05-29T08:11:33.313 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:11:33.313 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:11, diff=22.319569s, valid=True
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:11:33.319 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:11:33.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:11:33.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:12, diff=21.322632s, valid=True
2026-05-29T08:11:33.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:11:33.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:11:33.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:11:33.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967735.323291s, valid=True
2026-05-29T08:11:33.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:11:33.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:11:33.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:11:33.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:11:33.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:11:33.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:11:33.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:11:33.384 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:11:33.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:11:33.457 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:11:33.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:11:33.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:11:33.601 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:11:33.641 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:11:33.854 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:11:34.199 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:11:34.299 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:11:34.299 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:11:34.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-29T08:11:34.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-29T08:11:34.557 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:11:34.557 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:12:04.588 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:12:04.588 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:12:04.588 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:12:04.731 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:12:04.738 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:12:04.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:12:04.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-29T08:12:04.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:12:04.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-29T08:12:04.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:12:04.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:12:04.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:12:04.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:12:07.546 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:12:07.546 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:12:07.550 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:12:07.550 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:12:07.550 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:12:07.561 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:12:07.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-29T08:12:07.573 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:12:07.573 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:12:07.573 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:12:07.574 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:12:07.574 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:12:07.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:12:07.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:12:07.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:12:07.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:12:07.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:12:07.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:12:07.785 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:12:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:12:07.822 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:12:07.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:12:07.827 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:12:07.827 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:12:07.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:11:45
2026-05-29T08:12:07.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71328, datetime.datetime(2026, 5, 29, 8, 11, 45), datetime.datetime(2026, 5, 29, 8, 11, 45), 'salt', 7.69, 78.63, None, 17.93, 89.07, 3.47, 832.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:12:07.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:12:07.890 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:12:07.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:45, diff=22.896064s, valid=True
2026-05-29T08:12:07.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:12:07.896 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:12:07.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:12, diff=-4.101043s, valid=True
2026-05-29T08:12:07.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:12:07.899 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:12:07.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:11:42, diff=25.905768s, valid=True
2026-05-29T08:12:07.905 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:12:07.905 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:12:07.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:12:07.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:12:07.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:12:07.906 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:12:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:12, diff=-4.091228s, valid=True
2026-05-29T08:12:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:12:07.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:12:07.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:12:07.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967769.909425s, valid=True
2026-05-29T08:12:07.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:12:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:12:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:12:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:12:07.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:12:07.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:12:07.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:12:07.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:12:08.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:12:08.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:12:08.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:12:08.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:12:08.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:12:08.298 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:12:08.514 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:12:08.861 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:12:08.961 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:12:08.961 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:12:08.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-29T08:12: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-29T08:12:09.144 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:12:09.144 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:12:39.175 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:12:39.175 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:12:39.175 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:12:39.753 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:12:39.773 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:12:39.997 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:12:39.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-29T08:12:40.006 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:12:40.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-29T08:12:40.017 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:12:40.017 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:12:40.024 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:12:40.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-29T08:12:43.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-29T08:12:43.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:12:43.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:12:43.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:12:43.422 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:12:43.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:12:43.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-29T08:12:43.446 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:12:43.446 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:12:43.447 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:12:43.447 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:12:43.447 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:12:43.453 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:12:43.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:12:43.581 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:12:43.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:12:43.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:12:43.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:12:43.723 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:12:43.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 660 rows from lcogt
2026-05-29T08:12:43.765 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:12:43.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:12:43.770 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:12:43.770 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:12:43.831 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:12:16
2026-05-29T08:12:43.831 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71329, datetime.datetime(2026, 5, 29, 8, 12, 16), datetime.datetime(2026, 5, 29, 8, 12, 15), 'salt', 7.62, 78.5, None, 15.03, 99.78, 3.49, 832.86, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:12:43.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:12:43.832 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:12:43.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:15, diff=28.839165s, valid=True
2026-05-29T08:12:43.839 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:12:43.839 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:12:43.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:12, diff=31.84266s, valid=True
2026-05-29T08:12:43.842 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:12:43.842 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:12, diff=31.851177s, valid=True
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:12:43.851 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 660 rows. Structure expected: 10 fields
2026-05-29T08:12:43.854 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:12:12, diff=31.854884s, valid=True
2026-05-29T08:12:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:12:43.855 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:12:43.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:12:43.855 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967805.8557s, valid=True
2026-05-29T08:12:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:12:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:12:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:12:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:12:43.857 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:12:43.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:12:43.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:12:43.923 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:12:43.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:12:43.999 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:12:44.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:12:44.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:12:44.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:12:44.188 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:12:44.440 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:12:44.791 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:12:44.895 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:12:44.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:12:44.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-29T08:12:44.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-29T08:12:45.167 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:12:45.167 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:13:15.182 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:13:15.182 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:13:15.183 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:13:15.485 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:13:15.499 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:13:15.765 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:13:15.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-29T08:13:15.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:13:15.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-29T08:13:15.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:13:15.783 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:13:15.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:13:15.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-29T08:13: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-29T08:13:18.273 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:13:18.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:13:18.283 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:13:18.283 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:13:18.294 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:13:18.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-29T08:13:18.308 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:13:18.308 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:13:18.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:13:18.309 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:13:18.309 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:13:18.314 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:13:18.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:13:18.446 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:13:18.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:13:18.546 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:13:18.589 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:13:18.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:13:18.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 661 rows from lcogt
2026-05-29T08:13:18.637 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:13:18.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:13:18.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:13:18.642 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:13:18.715 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:13:16
2026-05-29T08:13:18.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71331, datetime.datetime(2026, 5, 29, 8, 13, 16), datetime.datetime(2026, 5, 29, 8, 13, 16), 'salt', 7.52, 79.59, None, 15.99, 85.01, 3.29, 832.93, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:13:18.715 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:13:18.715 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:13:18.722 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:16, diff=2.722851s, valid=True
2026-05-29T08:13:18.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:13:18.723 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:13:18.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:12, diff=6.726317s, valid=True
2026-05-29T08:13:18.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:13:18.726 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:15, diff=3.734393s, valid=True
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:13:18.734 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 661 rows. Structure expected: 10 fields
2026-05-29T08:13:18.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:12, diff=6.738081s, valid=True
2026-05-29T08:13:18.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:13:18.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:13:18.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:13:18.738 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967840.738908s, valid=True
2026-05-29T08:13:18.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:13:18.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:13:18.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:13:18.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:13:18.741 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:13:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:13:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:13:18.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:13:18.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:13:18.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:13:18.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:13:18.972 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:13:19.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:13:19.061 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:13:19.273 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:13:19.616 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:13:19.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:13:19.715 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:13:19.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-29T08:13:19.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-29T08:13:19.943 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:13:19.943 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:13:49.973 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:13:49.973 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:13:49.974 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:13:50.167 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:13:50.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:13:50.360 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:13:50.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:13:50.371 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:13:50.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-29T08:13:50.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:13:50.381 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:13:50.385 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:13:50.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-29T08:13:53.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-29T08:13:53.325 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:13:53.332 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:13:53.333 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:13:53.333 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:13:53.345 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:13:53.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-29T08:13:53.358 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:13:53.359 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:13:53.359 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:13:53.359 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:13:53.359 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:13:53.366 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:13:53.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:13:53.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:13:53.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:13:53.611 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:13:53.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:13:53.656 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:13:53.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:13:53.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:13:53.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:13:53.705 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:13:53.706 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:13:53.777 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:13:46
2026-05-29T08:13:53.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71332, datetime.datetime(2026, 5, 29, 8, 13, 46), datetime.datetime(2026, 5, 29, 8, 13, 46), 'salt', 7.52, 79.86, None, 15.49, 94.1, 3.25, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:13:53.778 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:13:53.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:13:53.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:46, diff=7.785527s, valid=True
2026-05-29T08:13:53.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:13:53.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:13:53.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:12, diff=-18.210902s, valid=True
2026-05-29T08:13:53.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:13:53.789 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:13:43, diff=10.797383s, valid=True
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:13:53.797 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:13:53.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:12, diff=-18.198812s, valid=True
2026-05-29T08:13:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:13:53.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:13:53.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:13:53.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967875.802019s, valid=True
2026-05-29T08:13:53.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:13:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:13:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:13:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:13:53.804 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:13:53.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:13:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:13:53.870 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:13:53.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:13:53.944 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:13:54.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:13:54.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:13:54.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:13:54.127 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:13:54.338 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:13:54.738 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:13:54.837 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:13:54.837 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:13:54.838 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:13:54.838 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:13:55.129 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:13:55.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:14:25.160 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:14:25.160 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:14:25.160 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:14:25.508 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:14:25.524 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:14:25.734 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:14:25.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-29T08:14:25.745 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:14:25.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-29T08:14:25.754 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:14:25.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:14:25.758 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:14:25.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-29T08:14:28.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-29T08:14:28.749 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:14:28.757 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:14:28.758 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:14:28.759 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:14:28.769 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:14:28.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-29T08:14:28.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:14:28.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:14:28.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:14:28.783 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:14:28.783 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:14:28.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:14:28.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:14:28.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:14:29.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:14:29.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:14:29.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:14:29.096 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:14:29.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:14:29.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:14:29.149 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:14:29.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:14:29.150 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:14:29.218 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:14:17
2026-05-29T08:14:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71333, datetime.datetime(2026, 5, 29, 8, 14, 17), datetime.datetime(2026, 5, 29, 8, 14, 16), 'salt', 7.45, 79.86, None, 14.96, 92.38, 3.24, 833.05, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:14:29.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:14:29.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:14:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:16, diff=13.226265s, valid=True
2026-05-29T08:14:29.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:14:29.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:14:29.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:12, diff=17.229796s, valid=True
2026-05-29T08:14:29.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:14:29.230 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:13, diff=16.238014s, valid=True
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:14:29.238 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:14:29.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:12, diff=17.241715s, valid=True
2026-05-29T08:14:29.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:14:29.241 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:14:29.241 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:14:29.242 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967911.242525s, valid=True
2026-05-29T08:14:29.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:14:29.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:14:29.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:14:29.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:14:29.244 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:14:29.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:14:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:14:29.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:14:29.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:14:29.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:14:29.443 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:14:29.475 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:14:29.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:14:29.564 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:14:29.778 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:14:30.158 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:14:30.263 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:14:30.263 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:14:30.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-29T08:14:30.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-29T08:14:30.429 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:14:30.429 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:15:00.436 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:15:00.436 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:15:00.436 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:15:00.857 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:15:00.876 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:15:01.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:15:01.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-29T08:15:01.096 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:15:01.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-29T08:15:01.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:15:01.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:15:01.113 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:15:01.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-29T08:15:03.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-29T08:15:03.792 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:15:03.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:15:03.800 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:15:03.800 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:15:03.811 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:15:03.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-29T08:15:03.824 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:15:03.825 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:15:03.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:15:03.825 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:15:03.825 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:15:03.831 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:15:03.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:15:03.957 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:15:04.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:15:04.047 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:15:04.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:15:04.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:15:04.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:15:04.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:15:04.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:15:04.131 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:15:04.131 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:15:04.190 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:14:47
2026-05-29T08:15:04.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71334, datetime.datetime(2026, 5, 29, 8, 14, 47), datetime.datetime(2026, 5, 29, 8, 14, 46), 'salt', 7.45, 80.12, None, 15.35, 87.87, 3.19, 833.05, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:15:04.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:15:04.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:15:04.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:46, diff=18.197185s, valid=True
2026-05-29T08:15:04.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:15:04.197 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:15:04.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:12, diff=-7.799715s, valid=True
2026-05-29T08:15:04.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:15:04.200 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:14:43, diff=21.207086s, valid=True
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:15:04.207 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:15:04.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:12, diff=-7.789762s, valid=True
2026-05-29T08:15:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:15:04.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:15:04.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:15:04.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967946.210912s, valid=True
2026-05-29T08:15:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:15:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:15:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:15:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:15:04.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:15:04.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:15:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:15:04.272 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:15:04.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:15:04.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:15:04.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:15:04.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:15:04.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:15:04.529 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:15:04.815 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:15:05.160 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:15:05.260 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:15:05.260 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:15:05.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-29T08:15:05.260 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:15:05.523 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:15:05.523 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:15:35.539 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:15:35.539 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:15:35.540 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:15:35.971 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:15:35.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:15:36.162 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:15:36.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-29T08:15:36.272 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:15:36.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-29T08:15:36.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:15:36.281 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:15:36.368 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:15:36.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-29T08:15:38.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-29T08:15:38.936 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:15:38.944 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:15:38.945 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:15:38.945 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:15:38.956 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:15:38.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-29T08:15:38.969 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:15:38.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:15:38.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:15:38.970 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:15:38.970 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:15:38.975 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:15:39.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:15:39.103 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:15:39.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:15:39.204 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:15:39.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:15:39.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:15:39.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:15:39.287 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:15:39.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:15:39.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:15:39.292 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:15:39.353 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:15:17
2026-05-29T08:15:39.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71335, datetime.datetime(2026, 5, 29, 8, 15, 17), datetime.datetime(2026, 5, 29, 8, 15, 17), 'salt', 7.35, 80.22, None, 15.46, 87.66, 3.17, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:15:39.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:15:39.354 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:15:39.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:17, diff=22.361035s, valid=True
2026-05-29T08:15:39.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:15:39.361 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:15:39.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:12, diff=27.364357s, valid=True
2026-05-29T08:15:39.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:15:39.364 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:13, diff=26.371999s, valid=True
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:15:39.372 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:15:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:12, diff=27.375453s, valid=True
2026-05-29T08:15:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:15:39.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:15:39.375 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:15:39.376 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=967981.376255s, valid=True
2026-05-29T08:15:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:15:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:15:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:15:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:15:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:15:39.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:15:39.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:15:39.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:15:39.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:15:39.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:15:39.580 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:15:39.614 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:15:39.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:15:39.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:15:39.928 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:15:40.284 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:15:40.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:15:40.384 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:15:40.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-29T08:15:40.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-29T08:15:40.553 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:15:40.553 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:16:10.583 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:16:10.584 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:16:10.584 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:16:10.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:16:10.989 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:16:11.197 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:16:11.197 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:16:11.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:16:11.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-29T08:16:11.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:16:11.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:16:11.219 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:16:11.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-29T08:16:13.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-29T08:16:13.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:16:13.765 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:16:13.766 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:16:13.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:16:13.776 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:16:13.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-29T08:16:13.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:16:13.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:16:13.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:16:13.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:16:13.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:16:13.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:16:13.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:16:13.919 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:16:14.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:16:14.012 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:16:14.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:16:14.056 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:16:14.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:16:14.101 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:16:14.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:16:14.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:16:14.106 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:16:14.168 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:15:47
2026-05-29T08:16:14.168 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71336, datetime.datetime(2026, 5, 29, 8, 15, 47), datetime.datetime(2026, 5, 29, 8, 15, 47), 'salt', 7.25, 80.69, None, 14.54, 90.88, 3.09, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:16:14.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:16:14.169 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:16:14.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:47, diff=27.176052s, valid=True
2026-05-29T08:16:14.176 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:16:14.176 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:16:14.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:16:12, diff=2.179425s, valid=True
2026-05-29T08:16:14.179 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:16:14.179 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:15:44, diff=30.187304s, valid=True
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:16:14.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:16:14.190 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:16:12, diff=2.190918s, valid=True
2026-05-29T08:16:14.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:16:14.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:16:14.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:16:14.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968016.191719s, valid=True
2026-05-29T08:16:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:16:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:16:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:16:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:16:14.193 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:16:14.257 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:16:14.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:16:14.258 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:16:14.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:16:14.331 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:16:14.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:16:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:16:14.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:16:14.583 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:16:14.796 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:16:15.138 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:16:15.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:16:15.239 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:16: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-29T08:16: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-29T08:16:15.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:16:15.425 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:16:45.455 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:16:45.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:16:45.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:16:45.783 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:16:45.793 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:16:46.008 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:16:46.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-29T08:16:46.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:16:46.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:16:46.027 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:16:46.027 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:16:46.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:16:46.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-29T08:16:49.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-29T08:16:49.061 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:16:49.065 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:16:49.065 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:16:49.065 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:16:49.071 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:16:49.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-29T08:16:49.086 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:16:49.086 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:16:49.086 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:16:49.086 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:16:49.086 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:16:49.091 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:16:49.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:16:49.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:16:49.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:16:49.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:16:49.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:16:49.300 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:16:49.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:16:49.338 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:16:49.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:16:49.342 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:16:49.342 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:16:49.400 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:16:48
2026-05-29T08:16:49.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71338, datetime.datetime(2026, 5, 29, 8, 16, 48), datetime.datetime(2026, 5, 29, 8, 16, 48), 'salt', 7.25, 80.92, None, 16.23, 74.84, 3.05, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:16:49.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:16:49.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:16:49.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:16:48, diff=1.407121s, valid=True
2026-05-29T08:16:49.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:16:49.407 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:16:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:12, diff=-22.589754s, valid=True
2026-05-29T08:16:49.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:16:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:16:45, diff=4.417386s, valid=True
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:16:49.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:16:49.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:12, diff=-22.579327s, valid=True
2026-05-29T08:16:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:16:49.420 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:16:49.420 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:16:49.421 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968051.421415s, valid=True
2026-05-29T08:16:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:16:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:16:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:16:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:16:49.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:16:49.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:16:49.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:16:49.485 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:16:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:16:49.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:16:49.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:16:49.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:16:49.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:16:49.742 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:16:49.965 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:16:50.313 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:16:50.412 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:16:50.412 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:16:50.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-29T08:16:50.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-29T08:16:50.667 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:16:50.667 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:17:20.676 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:17:20.676 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:17:20.677 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:17:21.012 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:17:21.019 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:17:21.199 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:17:21.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-29T08:17:21.209 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:17:21.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-29T08:17:21.218 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:17:21.218 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:17:21.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:17:21.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-29T08:17:23.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-29T08:17:23.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:17:23.895 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:17:23.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:17:23.896 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:17:23.907 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:17:23.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-29T08:17:23.921 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:17:23.921 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:17:23.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:17:23.922 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:17:23.922 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:17:23.928 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:17:24.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:17:24.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:17:24.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:17:24.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:17:24.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:17:24.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:17:24.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:17:24.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:17:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:17:24.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:17:24.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:17:24.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:17:18
2026-05-29T08:17:24.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71339, datetime.datetime(2026, 5, 29, 8, 17, 18), datetime.datetime(2026, 5, 29, 8, 17, 18), 'salt', 7.35, 81.02, None, 15.1, 92.55, 3.03, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:17:24.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:17:24.298 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:17:24.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:18, diff=6.305338s, valid=True
2026-05-29T08:17:24.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:17:24.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:17:24.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:12, diff=12.308758s, valid=True
2026-05-29T08:17:24.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:17:24.308 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:17:24.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:17, diff=7.316579s, valid=True
2026-05-29T08:17:24.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:17:24.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:17:24.316 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:17:24.316 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:17:24.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:17:24.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:17:24.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:12, diff=12.320253s, valid=True
2026-05-29T08:17:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:17:24.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:17:24.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:17:24.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968086.321052s, valid=True
2026-05-29T08:17:24.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:17:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:17:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:17:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:17:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:17:24.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:17:24.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:17:24.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:17:24.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:17:24.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:17:24.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:17:24.671 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:17:24.711 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:17:24.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:17:25.279 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:17:25.378 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:17:25.378 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:17:25.378 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:17:25.378 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:17:25.550 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:17:25.550 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:17:55.577 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:17:55.578 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:17:55.578 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:17:55.973 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:17:55.990 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:17:56.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:17:56.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-29T08:17:56.207 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:17:56.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-29T08:17:56.216 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:17:56.216 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:17:56.222 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:17:56.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-29T08:17:58.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-29T08:17:58.852 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:17:58.860 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:17:58.860 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:17:58.861 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:17:58.874 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:17:58.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-29T08:17:58.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:17:58.888 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:17:58.888 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:17:58.889 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:17:58.889 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:17:58.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:17:59.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:17:59.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:17:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:17:59.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:17:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:17:59.162 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:17:59.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:17:59.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:17:59.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:17:59.207 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:17:59.208 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:17:59.266 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:17:48
2026-05-29T08:17:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71340, datetime.datetime(2026, 5, 29, 8, 17, 48), datetime.datetime(2026, 5, 29, 8, 17, 48), 'salt', 7.42, 81.12, None, 13.48, 83.11, 3.02, 832.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:17:59.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:17:59.267 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:17:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:48, diff=11.274191s, valid=True
2026-05-29T08:17:59.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:17:59.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:17:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:12, diff=-12.722383s, valid=True
2026-05-29T08:17:59.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:17:59.277 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:17:59.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:17:48, diff=11.285574s, valid=True
2026-05-29T08:17:59.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:17:59.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:17:59.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:17:59.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:17:59.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:17:59.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:17:59.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:12, diff=-12.710818s, valid=True
2026-05-29T08:17:59.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:17:59.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:17:59.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:17:59.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968121.289988s, valid=True
2026-05-29T08:17:59.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:17:59.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:17:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:17:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:17:59.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:17:59.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:17:59.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:17:59.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:17:59.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:17:59.428 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:17:59.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:17:59.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:17:59.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:17:59.610 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:17:59.822 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:18:00.194 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:18:00.293 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:18:00.293 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:18:00.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-29T08:18:00.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-29T08:18:00.465 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:18:00.465 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:18:30.495 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:18:30.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:18:30.496 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:18:30.701 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:18:30.708 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:18:30.888 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:18:30.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-29T08:18:30.898 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:18:30.898 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:18:30.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:18:30.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:18:30.911 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:18:30.911 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:18:33.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-29T08:18:33.697 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:18:33.704 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:18:33.705 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:18:33.705 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:18:33.715 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:18:33.728 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:18:33.728 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:18:33.729 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:18:33.729 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:18:33.729 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:18:33.729 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:18:33.735 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:18:33.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:18:33.860 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:18:33.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:18:33.955 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:18:34.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:18:34.000 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:18:34.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:18:34.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:18:34.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:18:34.048 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:18:34.048 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:18:34.117 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:18:19
2026-05-29T08:18:34.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71341, datetime.datetime(2026, 5, 29, 8, 18, 19), datetime.datetime(2026, 5, 29, 8, 18, 18), 'salt', 7.42, 81.18, None, 13.27, 78.74, 3.01, 832.99, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:18:34.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:18:34.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:18:34.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:18, diff=16.124704s, valid=True
2026-05-29T08:18:34.124 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:18:34.124 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:18:34.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:12, diff=22.128142s, valid=True
2026-05-29T08:18:34.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:18:34.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:15, diff=19.136015s, valid=True
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:18:34.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:18:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:12, diff=22.139661s, valid=True
2026-05-29T08:18:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:18:34.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:18:34.139 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:18:34.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968156.140439s, valid=True
2026-05-29T08:18:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:18:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:18:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:18:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:18:34.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:18:34.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:18:34.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:18:34.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:18:34.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:18:34.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:18:34.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:18:34.437 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:18:34.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:18:34.526 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:18:34.740 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:18:35.085 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:18:35.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:18:35.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:18:35.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-29T08:18:35.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-29T08:18:35.442 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:18:35.442 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:19:05.459 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:19:05.459 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:19:05.460 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:19:05.713 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:19:05.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:19:05.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:19:05.918 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:19:05.926 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:19:05.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-29T08:19:05.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:19:05.934 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:19:05.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:19:05.939 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:19:08.773 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:19:08.774 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:19:08.781 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:19:08.782 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:19:08.782 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:19:08.792 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:19:08.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-29T08:19:08.806 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:19:08.806 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:19:08.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:19:08.807 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:19:08.807 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:19:08.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:19:08.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:19:08.945 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:19:09.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:19:09.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:19:09.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:19:09.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:19:09.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:19:09.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:19:09.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:19:09.132 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:19:09.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:19:09.194 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:18:49
2026-05-29T08:19:09.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71342, datetime.datetime(2026, 5, 29, 8, 18, 49), datetime.datetime(2026, 5, 29, 8, 18, 49), 'salt', 7.42, 81.42, None, 14.22, 89.54, 2.97, 833.17, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:19:09.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:19:09.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:19:09.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:49, diff=20.20159s, valid=True
2026-05-29T08:19:09.201 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:19:09.201 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:19:09.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:12, diff=-2.79493s, valid=True
2026-05-29T08:19:09.205 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:19:09.205 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:18:45, diff=24.213013s, valid=True
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:19:09.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:19:09.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:12, diff=-2.783341s, valid=True
2026-05-29T08:19:09.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:19:09.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:19:09.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:19:09.217 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968191.217414s, valid=True
2026-05-29T08:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:19:09.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:19:09.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:19:09.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:19:09.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:19:09.302 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:19:09.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:19:09.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:19:09.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:19:09.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:19:09.541 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:19:09.757 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:19:10.124 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:19:10.227 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:19:10.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:19:10.227 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:19:10.227 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:19:10.402 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:19:10.402 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:19:40.432 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:19:40.432 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:19:40.432 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:19:41.086 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:19:41.106 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:19:41.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:19:41.389 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:19:41.399 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:19:41.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:19:41.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:19:41.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:19:41.417 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:19:41.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-29T08:19:44.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-29T08:19:44.961 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:19:44.969 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:19:44.970 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:19:44.970 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:19:44.980 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:19:44.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-29T08:19:44.993 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:19:44.994 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:19:44.994 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:19:44.994 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:19:44.994 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:19:45.001 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:19:45.127 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:19:45.128 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:19:45.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:19:45.222 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:19:45.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:19:45.267 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:19:45.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:19:45.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:19:45.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:19:45.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:19:45.313 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:19:45.373 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:19:19
2026-05-29T08:19:45.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71343, datetime.datetime(2026, 5, 29, 8, 19, 19), datetime.datetime(2026, 5, 29, 8, 19, 19), 'salt', 7.45, 81.52, None, 14.5, 79.47, 2.95, 832.93, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:19:45.373 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:19:45.373 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:19:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:19, diff=26.380425s, valid=True
2026-05-29T08:19:45.380 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:19:45.380 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:19:45.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:12, diff=33.38378s, valid=True
2026-05-29T08:19:45.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:19:45.383 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:19:45.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:15, diff=30.391562s, valid=True
2026-05-29T08:19:45.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:19:45.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:19:45.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:19:45.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:19:45.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:19:45.392 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:19:45.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:19:12, diff=33.395133s, valid=True
2026-05-29T08:19:45.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:19:45.395 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:19:45.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:19:45.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968227.39591s, valid=True
2026-05-29T08:19:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:19:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:19:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:19:45.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:19:45.398 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:19:45.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:19:45.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:19:45.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:19:45.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:19:45.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:19:45.594 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:19:45.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:19:45.675 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:19:45.715 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:19:45.927 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:19:46.271 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:19:46.370 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:19:46.370 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:19:46.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-29T08:19: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-29T08:19:46.633 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:19:46.634 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:20:16.650 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:20:16.650 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:20:16.651 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:20:17.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:20:17.234 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:20:17.450 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:20:17.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-29T08:20:17.458 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:20:17.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-29T08:20:17.468 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:20:17.468 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:20:17.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:20:17.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-29T08:20:19.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-29T08:20:19.841 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:20:19.845 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:20:19.845 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:20:19.845 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:20:19.854 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:20:19.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-29T08:20:19.866 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:20:19.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:20:19.867 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:20:19.867 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:20:19.867 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:20:19.872 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:20:19.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:20:19.962 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:20:20.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:20:20.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:20:20.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:20:20.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:20:20.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:20:20.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:20:20.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:20:20.143 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:20:20.143 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:20:20.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:20:20
2026-05-29T08:20:20.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71345, datetime.datetime(2026, 5, 29, 8, 20, 20), datetime.datetime(2026, 5, 29, 8, 20, 19), 'salt', 7.55, 81.95, None, 14.43, 87.66, 2.87, 833.05, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:20:20.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:20:20.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:20:20.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:19, diff=1.213077s, valid=True
2026-05-29T08:20:20.213 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:20:20.213 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:20:20.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:12, diff=8.216205s, valid=True
2026-05-29T08:20:20.216 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:20:20.216 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:16, diff=4.223289s, valid=True
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:20:20.223 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:20:20.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:12, diff=8.226573s, valid=True
2026-05-29T08:20:20.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:20:20.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:20:20.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:20:20.227 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968262.227281s, valid=True
2026-05-29T08:20:20.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:20:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:20:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:20:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:20:20.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:20:20.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:20:20.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:20:20.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:20:20.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:20:20.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:20:20.425 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:20:20.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:20:20.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:20:20.548 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:20:20.762 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:20:21.166 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:20:21.266 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:20:21.267 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:20:21.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-29T08:20:21.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-29T08:20:21.440 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:20:21.441 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:20:51.471 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:20:51.471 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:20:51.471 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:20:51.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:20:51.855 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:20:52.055 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:20:52.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-29T08:20:52.065 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:20:52.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-29T08:20:52.073 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:20:52.073 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:20:52.080 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:20:52.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-29T08:20:54.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-29T08:20:54.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:20:54.477 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:20:54.479 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:20:54.479 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:20:54.490 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:20:54.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-29T08:20:54.503 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:20:54.503 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:20:54.504 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:20:54.504 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:20:54.504 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:20:54.510 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:20:54.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:20:54.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:20:54.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:20:54.734 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:20:54.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:20:54.780 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:20:54.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:20:54.823 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:20:54.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:20:54.828 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:20:54.828 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:20:54.890 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:20:50
2026-05-29T08:20:54.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71346, datetime.datetime(2026, 5, 29, 8, 20, 50), datetime.datetime(2026, 5, 29, 8, 20, 50), 'salt', 7.45, 81.75, None, 14.29, 87.92, 2.91, 833.11, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:20:54.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:20:54.891 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:20:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:50, diff=4.898246s, valid=True
2026-05-29T08:20:54.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:20:54.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:20:54.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:12, diff=-17.098328s, valid=True
2026-05-29T08:20:54.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:20:54.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:20:54.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:20:46, diff=8.909703s, valid=True
2026-05-29T08:20:54.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:20:54.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:20:54.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:20:54.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:20:54.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:20:54.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:20:54.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:12, diff=-17.086679s, valid=True
2026-05-29T08:20:54.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:20:54.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:20:54.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:20:54.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968296.914135s, valid=True
2026-05-29T08:20:54.915 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:20:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:20:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:20:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:20:54.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:20:54.979 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:20:54.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:20:54.980 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:20:55.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:20:55.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:20:55.113 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:20:55.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:20:55.199 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:20:55.239 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:20:55.454 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:20:55.799 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:20:55.898 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:20:55.899 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:20:55.899 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:20:55.899 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:20:56.078 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:20:56.078 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:21:26.108 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:21:26.109 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:21:26.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:21:26.727 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:21:26.737 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:21:26.939 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:21:26.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-29T08:21:26.949 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:21:26.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-29T08:21:26.959 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:21:26.959 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:21:26.964 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:21:26.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-29T08:21:29.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-29T08:21:29.476 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:21:29.483 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:21:29.483 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:21:29.484 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:21:29.495 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:21:29.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-29T08:21:29.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:21:29.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:21:29.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:21:29.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:21:29.510 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:21:29.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:21:29.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:21:29.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:21:29.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:21:29.737 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:21:29.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:21:29.783 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:21:29.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:21:29.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:21:29.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:21:29.830 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:21:29.830 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:21:29.891 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:21:20
2026-05-29T08:21:29.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71347, datetime.datetime(2026, 5, 29, 8, 21, 20), datetime.datetime(2026, 5, 29, 8, 21, 20), 'salt', 7.65, 81.82, None, 13.45, 86.77, 2.9, 833.11, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:21:29.892 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:21:29.892 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:21:29.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:20, diff=9.898263s, valid=True
2026-05-29T08:21:29.898 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:21:29.898 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:21:29.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:12, diff=17.901233s, valid=True
2026-05-29T08:21:29.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:21:29.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:21:29.907 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:17, diff=12.90796s, valid=True
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:21:29.908 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:21:29.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:12, diff=17.911483s, valid=True
2026-05-29T08:21:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:21:29.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:21:29.911 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:21:29.912 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968331.912219s, valid=True
2026-05-29T08:21:29.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:21:29.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:21:29.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:21:29.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:21:29.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:21:29.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:21:29.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:21:29.978 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:21:30.000 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:21:30.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:21:30.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:21:30.160 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:21:30.210 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:21:30.250 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:21:30.549 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:21:30.893 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:21:30.993 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:21:30.993 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:21:30.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-29T08:21:30.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-29T08:21:31.342 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:21:31.342 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:22:01.359 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:22:01.360 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:22:01.360 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:22:01.862 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:22:01.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:22:02.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:22:02.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-29T08:22:02.057 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:22:02.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-29T08:22:02.067 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:22:02.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:22:02.071 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:22:02.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-29T08:22:05.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-29T08:22:05.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:22:05.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:22:05.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:22:05.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:22:05.409 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:22:05.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-29T08:22:05.422 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:22:05.423 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:22:05.423 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:22:05.423 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:22:05.424 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:22:05.430 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:22:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:22:05.556 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:22:05.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:22:05.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:22:05.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:22:05.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:22:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:22:05.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:22:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:22:05.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:22:05.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:22:05.800 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:21:51
2026-05-29T08:22:05.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71348, datetime.datetime(2026, 5, 29, 8, 21, 51), datetime.datetime(2026, 5, 29, 8, 21, 50), 'salt', 7.62, 81.75, None, 12.39, 85.97, 2.91, 833.17, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:22:05.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:22:05.800 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:22:05.807 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:50, diff=15.807945s, valid=True
2026-05-29T08:22:05.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:22:05.808 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:22:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:12, diff=-6.188465s, valid=True
2026-05-29T08:22:05.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:22:05.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:22:05.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:21:49, diff=16.819531s, valid=True
2026-05-29T08:22:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:22:05.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:22:05.819 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:22:05.819 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:22:05.820 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:22:05.820 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:22:05.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:12, diff=-6.176763s, valid=True
2026-05-29T08:22:05.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:22:05.823 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:22:05.823 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:22:05.824 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968367.824038s, valid=True
2026-05-29T08:22:05.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:22:05.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:22:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:22:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:22:05.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:22:05.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:22:05.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:22:05.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:22:05.909 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:22:05.962 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:22:06.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:22:06.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:22:06.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:22:06.146 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:22:06.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:22:06.700 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:22:06.799 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:22:06.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:22:06.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-29T08:22:06.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-29T08:22:06.971 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:22:06.971 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:22:37.001 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:22:37.001 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:22:37.001 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:22:37.312 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:22:37.324 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:22:37.517 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:22:37.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-29T08:22:37.528 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:22:37.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-29T08:22:37.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:22:37.537 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:22:37.542 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:22:37.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-29T08:22:39.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-29T08:22:39.871 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:22:39.874 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:22:39.875 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:22:39.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:22:39.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:22:39.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-29T08:22:39.900 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:22:39.900 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:22:39.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:22:39.900 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:22:39.900 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:22:39.906 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:22:39.997 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:22:39.998 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:22:40.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:22:40.088 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:22:40.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:22:40.134 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:22:40.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:22:40.173 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:22:40.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:22:40.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:22:40.177 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:22:40.239 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:22:21
2026-05-29T08:22:40.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71349, datetime.datetime(2026, 5, 29, 8, 22, 21), datetime.datetime(2026, 5, 29, 8, 22, 20), 'salt', 7.62, 81.78, None, 13.59, 86.14, 2.91, 832.92, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:22:40.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:22:40.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:22:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:20, diff=20.246799s, valid=True
2026-05-29T08:22:40.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:22:40.246 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:22:40.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:12, diff=28.249793s, valid=True
2026-05-29T08:22:40.249 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:22:40.249 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:20, diff=20.256583s, valid=True
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:22:40.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:22:40.257 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:22:40.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:12, diff=28.259678s, valid=True
2026-05-29T08:22:40.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:22:40.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:22:40.259 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:22:40.260 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968402.260344s, valid=True
2026-05-29T08:22:40.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:22:40.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:22:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:22:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:22:40.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:22:40.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:22:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:22:40.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:22:40.342 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:22:40.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:22:40.458 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:22:40.492 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:22:40.636 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:22:40.748 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:22:40.960 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:22:41.309 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:22:41.408 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:22:41.409 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:22:41.409 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:22:41.409 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:22:41.581 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:22:41.581 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:23:11.582 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:23:11.582 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:23:11.583 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:23:12.260 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:23:12.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:23:12.449 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:23:12.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-29T08:23:12.456 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:23:12.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-29T08:23:12.469 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:23:12.469 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:23:12.475 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:23:12.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-29T08:23:14.906 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:23:14.906 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:23:14.914 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:23:14.915 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:23:14.915 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:23:14.926 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:23:14.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-29T08:23:14.939 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:23:14.940 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:23:14.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:23:14.940 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:23:14.940 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:23:14.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:23:15.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:23:15.075 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:23:15.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:23:15.170 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:23:15.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:23:15.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:23:15.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:23:15.256 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:23:15.260 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:23:15.261 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:23:15.261 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:23:15.321 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:22:51
2026-05-29T08:23:15.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71350, datetime.datetime(2026, 5, 29, 8, 22, 51), datetime.datetime(2026, 5, 29, 8, 22, 51), 'salt', 7.62, 82.05, None, 13.9, 84.51, 2.86, 833.11, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:23:15.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:23:15.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:23:15.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:51, diff=24.32899s, valid=True
2026-05-29T08:23:15.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:23:15.329 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:23:15.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:12, diff=3.332406s, valid=True
2026-05-29T08:23:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:23:15.332 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:22:47, diff=28.34033s, valid=True
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:23:15.340 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:23:15.343 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:12, diff=3.343948s, valid=True
2026-05-29T08:23:15.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:23:15.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:23:15.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:23:15.344 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968437.344748s, valid=True
2026-05-29T08:23:15.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:23:15.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:23:15.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:23:15.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:23:15.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:23:15.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:23:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:23:15.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:23:15.431 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:23:15.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:23:15.546 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:23:15.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:23:15.628 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:23:15.668 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:23:15.880 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:23:16.224 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:23:16.324 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:23:16.324 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:23:16.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-29T08:23:16.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-29T08:23:16.489 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:23:16.490 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:23:46.519 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:23:46.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08: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-29T08:23:47.011 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:23:47.025 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:23:47.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:23:47.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-29T08:23:47.243 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:23:47.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-29T08:23:47.251 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:23:47.252 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:23:47.256 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:23:47.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-29T08:23:50.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-29T08:23:50.663 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:23:50.671 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:23:50.671 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:23:50.672 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:23:50.682 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:23:50.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-29T08:23:50.696 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:23:50.696 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:23:50.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:23:50.697 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:23:50.697 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:23:50.701 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:23:50.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:23:50.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:23:50.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:23:50.948 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:23:50.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:23:50.996 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:23:51.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:23:51.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:23:51.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:23:51.043 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:23:51.043 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:23:51.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:23:21
2026-05-29T08:23:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71351, datetime.datetime(2026, 5, 29, 8, 23, 21), datetime.datetime(2026, 5, 29, 8, 23, 21), 'salt', 7.62, 81.98, None, 14.79, 85.03, 2.87, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:23:51.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:23:51.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:23:51.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:21, diff=30.119601s, valid=True
2026-05-29T08:23:51.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:23:51.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:23:51.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:12, diff=39.123052s, valid=True
2026-05-29T08:23:51.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:23:51.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:17, diff=34.131134s, valid=True
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:23:51.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:23:51.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:23:12, diff=39.134825s, valid=True
2026-05-29T08:23:51.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:23:51.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:23:51.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:23:51.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968473.135657s, valid=True
2026-05-29T08:23:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:23:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:23:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:23:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:23:51.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:23:51.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:23:51.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:23:51.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:23:51.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:23:51.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:23:51.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:23:51.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:23:51.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:23:51.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:23:51.751 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:23:52.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:23:52.197 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:23:52.197 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:23:52.197 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:23:52.197 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:23:52.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:23:52.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:24:22.389 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:24:22.389 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:24:22.390 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:24:22.813 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:24:22.832 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:24:23.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:24:23.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:24:23.032 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:24:23.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-29T08:24:23.042 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:24:23.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:24:23.045 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:24:23.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-29T08:24:25.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-29T08:24:25.508 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:24:25.516 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:24:25.517 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:24:25.517 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:24:25.527 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:24:25.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-29T08:24:25.540 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:24:25.541 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:24:25.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:24:25.542 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:24:25.542 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:24:25.548 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:24:25.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:24:25.689 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:24:25.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:24:25.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:24:25.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:24:25.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:24:25.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:24:25.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:24:25.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:24:25.885 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:24:25.885 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:24:25.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:24:22
2026-05-29T08:24:25.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71353, datetime.datetime(2026, 5, 29, 8, 24, 22), datetime.datetime(2026, 5, 29, 8, 24, 21), 'salt', 7.72, 81.68, None, 14.47, 92.52, 2.93, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:24:25.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:24:25.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:24:25.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:21, diff=4.955317s, valid=True
2026-05-29T08:24:25.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:24:25.955 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:24:25.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:12, diff=13.958756s, valid=True
2026-05-29T08:24:25.958 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:24:25.958 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:24:25.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:17, diff=8.966787s, valid=True
2026-05-29T08:24:25.966 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:24:25.966 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:24:25.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:24:25.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:24:25.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:24:25.967 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:24:25.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:12, diff=13.970391s, valid=True
2026-05-29T08:24:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:24:25.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:24:25.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:24:25.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968507.9712s, valid=True
2026-05-29T08:24:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:24:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:24:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:24:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:24:25.973 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:24:26.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:24:26.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:24:26.036 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:24:26.055 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:24:26.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:24:26.170 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:24:26.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:24:26.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:24:26.291 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:24:26.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:24:26.842 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:24:26.941 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:24:26.941 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:24:26.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-29T08:24:26.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-29T08:24:27.110 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:24:27.111 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:24:57.141 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:24:57.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:24:57.141 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:24:57.377 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:24:57.384 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:24:57.573 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:24:57.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-29T08:24:57.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:24:57.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-29T08:24:57.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:24:57.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:24:57.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:24:57.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-29T08:25:00.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-29T08:25:00.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:25:00.074 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:25:00.074 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:25:00.075 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:25:00.084 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:25:00.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-29T08:25:00.096 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:25:00.096 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:25:00.096 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:25:00.096 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:25:00.096 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:25:00.099 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:25:00.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:25:00.193 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:25:00.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:25:00.292 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:25:00.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:25:00.337 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:25:00.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:25:00.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:25:00.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:25:00.380 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:25:00.380 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:25:00.442 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:24:52
2026-05-29T08:25:00.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71354, datetime.datetime(2026, 5, 29, 8, 24, 52), datetime.datetime(2026, 5, 29, 8, 24, 51), 'salt', 7.65, 81.18, None, 13.9, 90.45, 3.01, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:25:00.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:25:00.443 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:25:00.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:51, diff=9.44958s, valid=True
2026-05-29T08:25:00.449 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:25:00.449 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:25:00.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:12, diff=-11.547162s, valid=True
2026-05-29T08:25:00.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:25:00.453 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:24:48, diff=12.460305s, valid=True
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:25:00.460 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:25:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:12, diff=-11.5365s, valid=True
2026-05-29T08:25:00.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:25:00.463 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:25:00.463 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:25:00.464 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968542.464206s, valid=True
2026-05-29T08:25:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:25:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:25:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:25:00.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:25:00.466 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:25:00.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:25:00.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:25:00.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:25:00.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:25:00.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:25:00.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:25:00.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:25:00.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:25:00.845 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:25:01.056 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:25:01.401 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:25:01.501 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:25:01.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:25:01.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-29T08:25:01.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-29T08:25:01.672 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:25:01.672 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:25:31.686 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:25:31.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:25:31.687 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:25:32.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:25:32.267 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:25:32.486 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:25:32.486 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:25:32.496 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:25:32.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-29T08:25:32.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:25:32.506 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:25:32.510 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:25:32.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-29T08:25:35.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-29T08:25:35.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:25:35.693 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:25:35.694 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:25:35.694 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:25:35.704 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:25:35.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-29T08:25:35.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:25:35.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:25:35.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:25:35.719 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:25:35.719 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:25:35.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:25:35.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:25:35.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:25:35.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:25:35.951 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:25:35.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:25:35.995 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:25:36.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:25:36.036 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:25:36.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:25:36.040 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:25:36.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:25:36.100 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:25:22
2026-05-29T08:25:36.100 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71355, datetime.datetime(2026, 5, 29, 8, 25, 22), datetime.datetime(2026, 5, 29, 8, 25, 22), 'salt', 7.65, 80.92, None, 13.48, 89.12, 3.06, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:25:36.101 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:25:36.101 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:25:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:22, diff=14.108286s, valid=True
2026-05-29T08:25:36.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:25:36.108 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:25:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:12, diff=24.111665s, valid=True
2026-05-29T08:25:36.111 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:25:36.111 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:18, diff=18.11929s, valid=True
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:25:36.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:25:36.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:12, diff=24.122793s, valid=True
2026-05-29T08:25:36.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:25:36.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:25:36.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:25:36.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968578.123531s, valid=True
2026-05-29T08:25:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:25:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:25:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:25:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:25:36.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:25:36.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:25:36.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:25:36.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:25:36.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:25:36.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:25:36.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:25:36.357 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:25:36.408 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:25:36.448 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:25:36.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:25:37.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:25:37.105 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:25:37.106 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:25:37.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-29T08:25:37.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-29T08:25:37.273 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:25:37.273 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:26:07.280 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:26:07.280 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:26:07.280 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:26:07.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:26:07.882 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:26:08.157 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:26:08.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-29T08:26:08.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:26:08.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:26:08.173 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:26:08.173 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:26:08.178 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:26:08.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-29T08:26:10.610 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:26:10.611 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:26:10.619 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:26:10.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:26:10.620 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:26:10.631 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:26:10.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-29T08:26:10.644 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:26:10.645 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:26:10.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:26:10.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:26:10.646 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:26:10.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:26:10.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:26:10.782 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:26:10.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:26:10.881 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:26:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:26:10.927 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:26:10.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:26:10.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:26:10.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:26:10.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:26:10.974 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:26:11.037 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:25:53
2026-05-29T08:26:11.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71356, datetime.datetime(2026, 5, 29, 8, 25, 53), datetime.datetime(2026, 5, 29, 8, 25, 52), 'salt', 7.62, 80.95, None, 11.65, 91.18, 3.05, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:26:11.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:26:11.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:26:11.044 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:52, diff=19.0449s, valid=True
2026-05-29T08:26:11.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:26:11.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:26:11.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:12, diff=-0.951684s, valid=True
2026-05-29T08:26:11.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:26:11.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:25:50, diff=21.056285s, valid=True
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:26:11.056 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:26:11.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:12, diff=-0.940006s, valid=True
2026-05-29T08:26:11.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:26:11.060 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:26:11.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:26:11.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968613.060791s, valid=True
2026-05-29T08:26:11.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:26:11.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:26:11.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:26:11.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:26:11.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:26:11.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:26:11.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:26:11.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:26:11.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:26:11.200 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:26:11.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:26:11.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:26:11.343 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:26:11.383 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:26:11.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:26:11.935 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:26:12.035 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:26:12.035 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:26:12.035 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:26:12.035 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:26:12.206 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:26:12.206 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:26:42.236 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:26:42.236 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:26:42.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:26:42.495 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:26:42.509 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:26:42.707 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:26:42.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-29T08:26:42.716 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:26:42.716 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:26:42.726 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:26:42.726 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:26:42.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:26:42.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:26:45.689 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:26:45.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:26:45.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:26:45.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:26:45.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:26:45.709 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:26:45.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-29T08:26:45.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:26:45.723 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:26:45.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:26:45.724 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:26:45.724 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:26:45.730 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:26:45.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:26:45.861 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:26:45.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:26:45.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:26:46.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:26:46.014 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:26:46.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:26:46.057 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:26:46.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:26:46.062 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:26:46.062 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:26:46.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:26:23
2026-05-29T08:26:46.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71357, datetime.datetime(2026, 5, 29, 8, 26, 23), datetime.datetime(2026, 5, 29, 8, 26, 22), 'salt', 7.72, 81.25, None, 12.95, 94.28, 3.0, 833.11, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:26:46.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:26:46.135 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:26:46.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:22, diff=24.142778s, valid=True
2026-05-29T08:26:46.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:26:46.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:26:46.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:12, diff=34.146324s, valid=True
2026-05-29T08:26:46.146 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:26:46.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:21, diff=25.154488s, valid=True
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:26:46.154 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:26:46.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:26:46.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:12, diff=34.158312s, valid=True
2026-05-29T08:26:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:26:46.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:26:46.158 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:26:46.159 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968648.159157s, valid=True
2026-05-29T08:26:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:26:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:26:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:26:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:26:46.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:26:46.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:26:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:26:46.227 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:26:46.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:26:46.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:26:46.360 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:26:46.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:26:46.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:26:46.481 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:26:46.693 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:26:47.116 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:26:47.215 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:26:47.215 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:26:47.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-29T08:26:47.216 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:26:47.384 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:26:47.384 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:27:17.398 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:27:17.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:27:17.399 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:27:17.798 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:27:17.811 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:27:18.010 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:27:18.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-29T08:27:18.018 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:27:18.018 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:27:18.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:27:18.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:27:18.035 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:27:18.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-29T08:27:20.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-29T08:27:20.586 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:27:20.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:27:20.595 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:27:20.595 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:27:20.606 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:27:20.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-29T08:27:20.620 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:27:20.620 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:27:20.620 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:27:20.621 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:27:20.621 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:27:20.627 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:27:20.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:27:20.759 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:27:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:27:20.856 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:27:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:27:20.902 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:27:20.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:27:20.942 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:27:20.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:27:20.947 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:27:20.947 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:27:21.015 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:26:53
2026-05-29T08:27:21.015 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71358, datetime.datetime(2026, 5, 29, 8, 26, 53), datetime.datetime(2026, 5, 29, 8, 26, 53), 'salt', 7.75, 81.45, None, 13.37, 91.82, 2.97, 833.1, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:27:21.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:27:21.016 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:27:21.022 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:53, diff=28.0229s, valid=True
2026-05-29T08:27:21.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:27:21.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:27:21.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:27:12, diff=9.026277s, valid=True
2026-05-29T08:27:21.026 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:27:21.026 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:26:52, diff=29.03415s, valid=True
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:27:21.034 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:27:21.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:27:12, diff=9.037766s, valid=True
2026-05-29T08:27:21.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:27:21.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:27:21.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:27:21.038 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968683.03855s, valid=True
2026-05-29T08:27:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:27:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:27:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:27:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:27:21.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:27:21.103 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:27:21.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:27:21.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:27:21.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:27:21.182 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:27:21.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:27:21.274 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:27:21.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:27:21.365 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:27:21.593 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:27:21.938 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:27:22.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:27:22.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:27:22.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-29T08:27:22.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-29T08:27:22.941 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:27:22.941 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:27:52.952 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:27:52.952 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:27:52.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:27:53.280 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:27:53.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:27:53.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:27:53.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-29T08:27:53.525 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:27:53.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-29T08:27:53.534 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:27:53.534 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:27:53.540 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:27:53.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-29T08:27:57.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-29T08:27:57.358 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:27:57.366 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:27:57.366 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:27:57.367 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:27:57.377 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:27: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-29T08:27:57.390 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:27:57.391 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:27:57.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:27:57.392 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:27:57.392 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:27:57.397 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:27:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:27:57.530 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:27:57.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:27:57.624 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:27:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:27:57.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:27:57.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:27:57.714 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:27:57.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:27:57.719 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:27:57.719 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:27:57.782 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:27:54
2026-05-29T08:27:57.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71360, datetime.datetime(2026, 5, 29, 8, 27, 54), datetime.datetime(2026, 5, 29, 8, 27, 53), 'salt', 7.68, 81.51, None, 12.92, 98.55, 2.95, 833.23, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:27:57.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:27:57.783 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:27:57.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:27:53, diff=4.790341s, valid=True
2026-05-29T08:27:57.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:27:57.790 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:27:57.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:12, diff=-14.20623s, valid=True
2026-05-29T08:27:57.793 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:27:57.793 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:27:57.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:27:49, diff=8.801744s, valid=True
2026-05-29T08:27:57.801 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:27:57.801 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:27:57.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:27:57.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:27:57.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:27:57.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:27:57.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:12, diff=-14.194591s, valid=True
2026-05-29T08:27:57.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:27:57.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:27:57.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:27:57.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968719.806219s, valid=True
2026-05-29T08:27:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:27:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:27:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:27:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:27:57.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:27:57.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:27:57.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:27:57.873 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:27:57.894 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:27:57.947 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:27:58.008 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:27:58.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:27:58.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:27:58.131 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:27:58.411 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:27:58.753 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:27:58.853 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:27:58.853 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:27:58.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-29T08:27:58.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-29T08:27:59.109 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:27:59.110 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:28:29.136 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:28:29.136 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:28:29.137 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:28:29.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:28:29.623 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:28:29.819 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:28:29.819 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:28:29.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:28:29.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-29T08:28:29.837 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:28:29.837 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:28:29.841 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:28:29.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-29T08:28:32.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-29T08:28:32.863 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:28:32.866 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:28:32.867 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:28:32.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:28:32.875 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:28:32.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-29T08:28:32.887 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:28:32.887 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:28:32.887 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:28:32.887 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:28:32.888 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:28:32.891 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:28:32.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:28:32.974 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:28:33.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:28:33.067 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:28:33.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:28:33.111 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:28:33.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:28:33.150 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:28:33.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:28:33.155 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:28:33.155 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:28:33.219 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:28:24
2026-05-29T08:28:33.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71361, datetime.datetime(2026, 5, 29, 8, 28, 24), datetime.datetime(2026, 5, 29, 8, 28, 23), 'salt', 7.72, 81.68, None, 13.06, 101.0, 2.93, 833.04, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:28:33.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:28:33.219 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:28:33.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:23, diff=10.22627s, valid=True
2026-05-29T08:28:33.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:28:33.226 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:28:33.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:12, diff=21.229334s, valid=True
2026-05-29T08:28:33.229 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:28:33.229 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:28:33.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:19, diff=14.236594s, valid=True
2026-05-29T08:28:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:28:33.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:28:33.236 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:28:33.236 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:28:33.237 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:28:33.237 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:28:33.239 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:12, diff=21.239901s, valid=True
2026-05-29T08:28:33.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:28:33.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:28:33.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:28:33.240 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968755.240603s, valid=True
2026-05-29T08:28:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:28:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:28:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:28:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:28:33.242 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:28:33.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:28:33.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:28:33.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:28:33.324 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:28:33.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:28:33.440 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:28:33.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:28:33.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:28:33.562 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:28:33.773 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:28:34.114 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:28:34.213 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:28:34.213 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:28:34.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-29T08:28:34.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-29T08:28:34.482 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:28:34.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:29:04.512 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:29:04.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:29:04.512 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:29:05.009 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:29:05.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:29:05.223 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:29:05.223 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:29:05.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:29:05.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-29T08:29:05.241 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:29:05.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:29:05.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:29:05.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-29T08:29:08.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-29T08:29:08.104 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:29:08.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:29:08.112 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:29:08.112 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:29:08.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:29:08.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-29T08:29:08.136 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:29:08.137 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:29:08.137 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:29:08.137 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:29:08.138 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:29:08.144 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:29:08.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:29:08.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:29:08.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:29:08.382 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:29:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:29:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:29:08.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:29:08.474 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:29:08.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:29:08.479 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:29:08.479 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:29:08.541 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:28:54
2026-05-29T08:29:08.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71362, datetime.datetime(2026, 5, 29, 8, 28, 54), datetime.datetime(2026, 5, 29, 8, 28, 54), 'salt', 7.85, 81.71, None, 15.67, 99.12, 2.92, 833.16, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:29:08.541 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:29:08.541 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:29:08.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:54, diff=14.54838s, valid=True
2026-05-29T08:29:08.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:29:08.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:29:08.551 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:12, diff=-3.448036s, valid=True
2026-05-29T08:29:08.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:29:08.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:28:49, diff=19.560048s, valid=True
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:29:08.560 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:29:08.563 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:12, diff=-3.436155s, valid=True
2026-05-29T08:29:08.563 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:29:08.564 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:29:08.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:29:08.564 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968790.564677s, valid=True
2026-05-29T08:29:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:29:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:29:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:29:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:29:08.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:29:08.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:29:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:29:08.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:29:08.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:29:08.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:29:08.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:29:08.797 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:29:08.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:29:08.957 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:29:09.165 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:29:09.506 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:29:09.609 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:29:09.609 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:29:09.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-29T08:29:09.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-29T08:29:09.863 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:29:09.863 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:29:39.893 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:29:39.893 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:29:39.893 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:29:40.366 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:29:40.378 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:29:40.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:29:40.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-29T08:29:40.583 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:29:40.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-29T08:29:40.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:29:40.592 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:29:40.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:29:40.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-29T08:29:43.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-29T08:29:43.068 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:29:43.076 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:29:43.077 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:29:43.077 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:29:43.087 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:29:43.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:29:43.101 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:29:43.101 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:29:43.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:29:43.102 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:29:43.102 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:29:43.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:29:43.246 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:29:43.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:29:43.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:29:43.346 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:29:43.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:29:43.394 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:29:43.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:29:43.435 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:29:43.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:29:43.440 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:29:43.440 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:29:43.501 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:29:24
2026-05-29T08:29:43.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71363, datetime.datetime(2026, 5, 29, 8, 29, 24), datetime.datetime(2026, 5, 29, 8, 29, 24), 'salt', 7.75, 81.38, None, 15.42, 98.04, 2.98, 833.04, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:29:43.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:29:43.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:29:43.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:24, diff=19.509086s, valid=True
2026-05-29T08:29:43.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:29:43.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:29:43.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:12, diff=31.512518s, valid=True
2026-05-29T08:29:43.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:29:43.512 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:20, diff=23.520424s, valid=True
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:29:43.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:29:43.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:12, diff=31.524023s, valid=True
2026-05-29T08:29:43.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:29:43.524 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:29:43.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:29:43.524 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968825.524809s, valid=True
2026-05-29T08:29:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:29:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:29:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:29:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:29:43.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:29:43.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:29:43.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:29:43.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:29:43.610 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:29:43.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:29:43.724 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:29:43.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:29:43.806 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:29:43.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:29:44.067 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:29:44.413 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:29:44.513 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:29:44.513 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:29:44.513 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:29:44.513 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:29:44.783 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:29:44.784 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:30:14.798 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:30:14.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:30:14.799 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:30:14.976 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:30:14.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:30:15.196 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:30:15.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-29T08:30:15.205 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:30: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-29T08:30:15.214 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:30:15.214 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:30:15.221 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:30:15.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-29T08:30:18.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-29T08:30:18.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:30:18.327 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:30:18.327 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:30:18.328 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:30:18.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:30:18.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-29T08:30:18.353 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:30:18.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:30:18.354 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:30:18.354 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:30:18.354 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:30:18.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:30:18.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:30:18.487 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:30:18.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:30:18.585 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:30:18.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:30:18.631 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:30:18.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:30:18.672 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:30:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:30:18.677 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:30:18.677 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:30:18.737 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:29:55
2026-05-29T08:30:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71364, datetime.datetime(2026, 5, 29, 8, 29, 55), datetime.datetime(2026, 5, 29, 8, 29, 54), 'salt', 7.78, 81.22, None, 15.56, 101.35, 3.01, 833.04, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:30:18.737 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:30:18.737 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:30:18.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:54, diff=24.744756s, valid=True
2026-05-29T08:30:18.744 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:30:18.744 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:30:18.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:12, diff=6.748112s, valid=True
2026-05-29T08:30:18.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:30:18.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:30:18.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:29:50, diff=28.75588s, valid=True
2026-05-29T08:30:18.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:30:18.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:30:18.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:30:18.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:30:18.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:30:18.756 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:30:18.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:12, diff=6.759508s, valid=True
2026-05-29T08:30:18.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:30:18.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:30:18.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:30:18.760 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968860.7603s, valid=True
2026-05-29T08:30:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:30:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:30:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:30:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:30:18.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:30:18.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:30:18.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:30:18.826 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:30:18.846 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:30:18.900 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:30:18.960 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:30:19.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:30:19.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:30:19.149 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:30:19.358 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:30:19.699 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:30:19.801 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:30:19.801 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:30:19.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-29T08:30:19.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-29T08:30:19.974 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:30:19.974 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:30:50.003 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:30:50.003 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:30:50.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:30:50.278 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:30:50.286 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:30:50.472 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:30:50.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-29T08:30:50.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:30:50.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-29T08:30:50.491 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:30:50.491 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:30:50.499 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:30:50.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-29T08:30:53.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-29T08:30:53.473 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:30:53.480 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:30:53.481 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:30:53.482 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:30:53.492 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:30:53.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-29T08:30:53.508 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:30:53.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:30:53.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:30:53.509 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:30:53.509 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:30:53.515 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:30:53.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:30:53.642 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:30:53.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:30:53.742 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:30:53.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:30:53.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:30:53.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:30:53.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:30:53.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:30:53.837 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:30:53.837 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:30:53.913 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:30:25
2026-05-29T08:30:53.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71365, datetime.datetime(2026, 5, 29, 8, 30, 25), datetime.datetime(2026, 5, 29, 8, 30, 24), 'salt', 7.78, 81.15, None, 15.63, 100.53, 3.02, 833.1, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:30:53.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:30:53.914 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:30:53.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:24, diff=29.921363s, valid=True
2026-05-29T08:30:53.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:30:53.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:30:53.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:12, diff=41.925026s, valid=True
2026-05-29T08:30:53.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:30:53.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:22, diff=31.933141s, valid=True
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:30:53.933 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:30:53.936 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:30:12, diff=41.936938s, valid=True
2026-05-29T08:30:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:30:53.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:30:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:30:53.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968895.937755s, valid=True
2026-05-29T08:30:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:30:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:30:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:30:53.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:30:53.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:30:54.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:30:54.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:30:54.004 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:30:54.024 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:30:54.077 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:30:54.139 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:30:54.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:30:54.221 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:30:54.261 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:30:54.470 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:30:54.811 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:30:54.910 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:30:54.910 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:30:54.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-29T08:30:54.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-29T08:30:55.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:30:55.164 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:31:25.194 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:31:25.194 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:31:25.194 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:31:25.638 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:31:25.656 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:31:25.868 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:31:25.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-29T08:31:25.878 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:31:25.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-29T08:31:25.887 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:31:25.887 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:31:25.892 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:31:25.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-29T08:31:28.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-29T08:31:28.560 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:31:28.564 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:31:28.564 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:31:28.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:31:28.573 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:31:28.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-29T08:31:28.585 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:31:28.585 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:31:28.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:31:28.585 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:31:28.585 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:31:28.590 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:31:28.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:31:28.674 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:31:28.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:31:28.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:31:28.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:31:28.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:31:28.864 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:31:28.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:31:28.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:31:28.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:31:28.869 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:31:28.932 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:31:25
2026-05-29T08:31:28.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71367, datetime.datetime(2026, 5, 29, 8, 31, 25), datetime.datetime(2026, 5, 29, 8, 31, 25), 'salt', 7.75, 81.12, None, 12.32, 105.24, 3.03, 832.98, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:31:28.932 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:31:28.932 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:31:28.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:25, diff=3.939468s, valid=True
2026-05-29T08:31:28.939 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:31:28.939 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:31:28.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:12, diff=16.942803s, valid=True
2026-05-29T08:31:28.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:31:28.942 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:25, diff=3.950501s, valid=True
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:31:28.950 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:31:28.951 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:31:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:12, diff=16.95414s, valid=True
2026-05-29T08:31:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:31:28.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:31:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:31:28.954 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968930.954932s, valid=True
2026-05-29T08:31:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:31:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:31:28.956 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:31:28.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:31:28.957 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:31:29.020 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:31:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:31:29.021 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:31:29.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:31:29.161 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:31:29.222 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:31:29.255 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:31:29.304 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:31:29.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:31:29.557 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:31:29.915 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:31:30.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:31:30.030 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:31:30.030 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:31:30.030 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:31:30.290 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:31:30.290 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:32:00.319 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:32:00.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:32:00.319 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:32:00.983 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:32:01.003 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:32:01.225 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:32:01.225 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:32:01.233 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:32:01.233 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:32:01.242 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:32:01.242 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:32:01.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:32:01.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-29T08:32:03.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-29T08:32:03.958 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:32:03.963 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:32:03.964 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:32:03.964 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:32:03.975 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:32:03.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-29T08:32:03.987 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:32:03.988 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:32:03.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:32:03.988 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:32:03.988 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:32:03.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:32:04.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:32:04.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:32:04.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:32:04.160 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:32:04.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:32:04.203 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:32:04.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:32:04.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:32:04.244 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:32:04.245 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:32:04.245 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:32:04.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:31:56
2026-05-29T08:32:04.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71368, datetime.datetime(2026, 5, 29, 8, 31, 56), datetime.datetime(2026, 5, 29, 8, 31, 55), 'salt', 7.85, 81.28, None, 12.49, 101.25, 3.0, 833.1, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:32:04.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:32:04.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:32:04.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:55, diff=9.310904s, valid=True
2026-05-29T08:32:04.311 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:32:04.311 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:32:04.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:12, diff=-7.685503s, valid=True
2026-05-29T08:32:04.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:32:04.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:32:04.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:31:46, diff=18.322737s, valid=True
2026-05-29T08:32:04.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:32:04.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:32:04.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:32:04.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:32:04.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:32:04.323 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:32:04.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:12, diff=-7.673757s, valid=True
2026-05-29T08:32:04.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:32:04.326 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:32:04.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:32:04.327 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=968966.327056s, valid=True
2026-05-29T08:32:04.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:32:04.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:32:04.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:32:04.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:32:04.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:32:04.410 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:32:04.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:32:04.411 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:32:04.451 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:32:04.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:32:04.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:32:04.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:32:04.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:32:04.702 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:32:04.912 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:32:05.253 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:32:05.353 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:32:05.353 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:32:05.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-29T08:32:05.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-29T08:32:05.527 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:32:05.527 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:32:35.544 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:32:35.544 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:32:35.544 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:32:36.007 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:32:36.020 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:32:36.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:32:36.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-29T08:32:36.283 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:32:36.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-29T08:32:36.292 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:32:36.292 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:32:36.297 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:32:36.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-29T08:32:38.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-29T08:32:38.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:32:38.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:32:38.690 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:32:38.690 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:32:38.700 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:32:38.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-29T08:32:38.717 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:32:38.718 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:32:38.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:32:38.718 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:32:38.718 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:32:38.724 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:32:38.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:32:38.851 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:32:38.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:32:38.946 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:32:38.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:32:38.992 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:32:39.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:32:39.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:32:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:32:39.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:32:39.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:32:39.098 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:32:26
2026-05-29T08:32:39.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71369, datetime.datetime(2026, 5, 29, 8, 32, 26), datetime.datetime(2026, 5, 29, 8, 32, 26), 'salt', 7.85, 81.18, None, 11.54, 103.37, 3.02, 833.04, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:32:39.099 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:32:39.099 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:32:39.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:26, diff=13.105913s, valid=True
2026-05-29T08:32:39.106 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:32:39.106 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:32:39.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:12, diff=27.109276s, valid=True
2026-05-29T08:32:39.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:32:39.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:21, diff=18.117064s, valid=True
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:32:39.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:32:39.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:12, diff=27.120663s, valid=True
2026-05-29T08:32:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:32:39.120 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:32:39.120 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:32:39.121 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969001.121443s, valid=True
2026-05-29T08:32:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:32:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:32:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:32:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:32:39.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:32:39.186 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:32:39.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:32:39.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:32:39.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:32:39.259 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:32:39.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:32:39.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:32:39.402 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:32:39.441 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:32:39.666 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:32:40.028 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:32:40.138 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:32:40.139 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:32:40.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-29T08:32:40.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-29T08:32:40.669 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:32:40.669 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:33:10.689 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:33:10.689 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:33:10.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:33:11.381 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:33:11.395 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:33:11.604 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:33:11.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-29T08:33:11.611 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:33:11.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-29T08:33:11.620 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:33:11.620 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:33:11.625 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:33:11.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-29T08:33:13.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-29T08:33:13.999 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:33:14.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:33:14.007 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:33:14.008 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:33:14.019 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:33:14.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-29T08:33:14.033 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:33:14.034 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:33:14.034 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:33:14.034 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:33:14.034 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:33:14.041 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:33:14.166 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:33:14.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:33:14.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:33:14.262 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:33:14.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:33:14.308 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:33:14.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:33:14.350 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:33:14.355 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:33:14.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:33:14.356 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:33:14.416 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:32:56
2026-05-29T08:33:14.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71370, datetime.datetime(2026, 5, 29, 8, 32, 56), datetime.datetime(2026, 5, 29, 8, 32, 56), 'salt', 7.82, 81.15, None, 12.39, 101.42, 3.03, 833.16, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:33:14.417 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:33:14.417 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:33:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:56, diff=18.424101s, valid=True
2026-05-29T08:33:14.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:33:14.424 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:33:14.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:12, diff=2.427589s, valid=True
2026-05-29T08:33:14.427 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:33:14.427 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:33:14.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:32:52, diff=22.435603s, valid=True
2026-05-29T08:33:14.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:33:14.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:33:14.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:33:14.435 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:33:14.436 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:33:14.436 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:33:14.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:12, diff=2.439321s, valid=True
2026-05-29T08:33:14.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:33:14.439 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:33:14.439 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:33:14.440 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969036.44012s, valid=True
2026-05-29T08:33:14.441 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:33:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:33:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:33:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:33:14.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:33:14.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:33:14.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:33:14.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:33:14.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:33:14.579 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:33:14.640 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:33:14.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:33:14.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:33:14.762 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:33:14.972 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:33:15.374 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:33:15.474 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:33:15.474 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:33:15.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-29T08:33:15.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-29T08:33:15.646 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:33:15.647 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:33:45.655 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:33:45.655 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:33:45.655 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:33:46.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:33:46.266 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:33:46.481 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:33:46.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-29T08:33:46.490 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:33:46.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-29T08:33:46.498 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:33:46.498 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:33:46.506 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:33:46.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-29T08:33:48.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-29T08:33:48.971 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:33:48.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:33:48.980 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:33:48.981 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:33:48.991 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:33:49.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-29T08:33:49.004 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:33:49.004 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:33:49.005 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:33:49.005 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:33:49.005 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:33:49.011 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:33:49.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:33:49.138 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:33:49.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:33:49.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:33:49.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:33:49.278 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:33:49.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:33:49.319 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:33:49.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:33:49.324 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:33:49.324 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:33:49.389 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:33:26
2026-05-29T08:33:49.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71371, datetime.datetime(2026, 5, 29, 8, 33, 26), datetime.datetime(2026, 5, 29, 8, 33, 26), 'salt', 7.98, 81.48, None, 14.22, 100.85, 2.97, 832.97, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:33:49.389 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:33:49.389 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:33:49.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:26, diff=23.397162s, valid=True
2026-05-29T08:33:49.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:33:49.397 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:33:49.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:12, diff=37.400751s, valid=True
2026-05-29T08:33:49.400 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:33:49.400 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:22, diff=27.409471s, valid=True
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:33:49.409 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:33:49.410 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:33:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:12, diff=37.413223s, valid=True
2026-05-29T08:33:49.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:33:49.413 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:33:49.413 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:33:49.414 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969071.414051s, valid=True
2026-05-29T08:33:49.415 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:33:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:33:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:33:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:33:49.416 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:33:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:33:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:33:49.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:33:49.500 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:33:49.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:33:49.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:33:49.645 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:33:49.696 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:33:49.736 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:33:49.964 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:33:50.314 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:33:50.414 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:33:50.414 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:33:50.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-29T08:33:50.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-29T08:33:50.591 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:33:50.592 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:34:20.594 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:34:20.594 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:34:20.594 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:34:20.988 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:34:20.995 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:34:21.177 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:34:21.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-29T08:34:21.189 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:34:21.189 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:34:21.200 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:34:21.200 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:34:21.206 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:34:21.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-29T08:34:23.690 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:34:23.690 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:34:23.697 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:34:23.698 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:34:23.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:34:23.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:34:23.721 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:34:23.722 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:34:23.722 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:34:23.723 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:34:23.723 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:34:23.723 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:34:23.729 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:34:23.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:34:23.855 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:34:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:34:23.949 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:34:23.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:34:23.993 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:34:24.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:34:24.033 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:34:24.037 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:34:24.038 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:34:24.038 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:34:24.105 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:33:57
2026-05-29T08:34:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71372, datetime.datetime(2026, 5, 29, 8, 33, 57), datetime.datetime(2026, 5, 29, 8, 33, 56), 'salt', 7.98, 81.35, None, 13.52, 103.98, 2.99, 833.22, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:34:24.105 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:34:24.105 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:34:24.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:56, diff=28.112803s, valid=True
2026-05-29T08:34:24.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:34:24.112 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:34:24.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:34:12, diff=12.116048s, valid=True
2026-05-29T08:34:24.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:34:24.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:33:53, diff=31.123224s, valid=True
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:34:24.123 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:34:24.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:34:12, diff=12.126457s, valid=True
2026-05-29T08:34:24.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:34:24.126 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:34:24.126 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:34:24.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969106.127159s, valid=True
2026-05-29T08:34:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:34:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:34:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:34:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:34:24.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:34:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:34:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:34:24.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:34:24.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:34:24.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:34:24.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:34:24.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:34:24.405 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:34:24.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:34:24.725 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:34:25.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:34:25.165 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:34:25.165 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:34:25.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-29T08:34:25.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-29T08:34:25.425 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:34:25.426 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:34:55.456 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:34:55.456 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:34:55.456 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:34:55.858 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:34:55.878 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:34:56.094 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:34:56.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-29T08:34:56.102 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:34:56.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-29T08:34:56.109 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:34:56.109 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:34:56.115 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:34:56.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-29T08:34:58.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-29T08:34:58.614 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:34:58.621 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:34:58.622 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:34:58.622 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:34:58.632 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:34:58.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-29T08:34:58.645 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:34:58.646 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:34:58.646 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:34:58.646 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:34:58.647 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:34:58.652 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:34:58.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:34:58.778 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:34:58.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:34:58.871 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:34:58.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:34:58.914 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:34:58.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:34:58.959 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:34:58.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:34:58.964 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:34:58.964 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:34:59.022 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:34:57
2026-05-29T08:34:59.022 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71374, datetime.datetime(2026, 5, 29, 8, 34, 57), datetime.datetime(2026, 5, 29, 8, 34, 57), 'salt', 7.88, 80.45, None, 15.28, 101.25, 3.15, 833.22, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:34:59.023 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:34:59.023 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:34:59.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:34:57, diff=2.03002s, valid=True
2026-05-29T08:34:59.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:34:59.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:34:59.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:12, diff=-12.966517s, valid=True
2026-05-29T08:34:59.033 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:34:59.033 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:34:54, diff=5.041337s, valid=True
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:34:59.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:34:59.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:12, diff=-12.954981s, valid=True
2026-05-29T08:34:59.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:34:59.045 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:34:59.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:34:59.045 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969141.04581s, valid=True
2026-05-29T08:34:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:34:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:34:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:34:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:34:59.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:34:59.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:34:59.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:34:59.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:34:59.132 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:34:59.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:34:59.247 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:34:59.279 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:34:59.329 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:34:59.368 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:34:59.578 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:34:59.933 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:35:00.039 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:35:00.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:35:00.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-29T08:35:00.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-29T08:35:00.220 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:35:00.220 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:35:30.240 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:35:30.241 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:35:30.241 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:35:30.524 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:35:30.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:35:30.712 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:35:30.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-29T08:35:30.721 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:35:30.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-29T08:35:30.730 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:35:30.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:35:30.735 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:35:30.735 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:35:33.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-29T08:35:33.198 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:35:33.205 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:35:33.205 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:35:33.206 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:35:33.214 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:35:33.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-29T08:35:33.227 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:35:33.228 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:35:33.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:35:33.228 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:35:33.229 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:35:33.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:35:33.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:35:33.360 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:35:33.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:35:33.456 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:35:33.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:35:33.501 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:35:33.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:35:33.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:35:33.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:35:33.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:35:33.547 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:35:33.607 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:35:28
2026-05-29T08:35:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71375, datetime.datetime(2026, 5, 29, 8, 35, 28), datetime.datetime(2026, 5, 29, 8, 35, 27), 'salt', 7.91, 80.28, None, 14.47, 105.15, 3.17, 833.03, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:35:33.608 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:35:33.608 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:35:33.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:27, diff=6.615296s, valid=True
2026-05-29T08:35:33.615 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:35:33.615 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:35:33.618 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:12, diff=21.618807s, valid=True
2026-05-29T08:35:33.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:35:33.619 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:35:33.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:26, diff=7.62671s, valid=True
2026-05-29T08:35:33.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:35:33.626 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:35:33.626 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:35:33.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:35:33.627 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:35:33.627 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:35:33.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:12, diff=21.630362s, valid=True
2026-05-29T08:35:33.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:35:33.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:35:33.630 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:35:33.631 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969175.631163s, valid=True
2026-05-29T08:35:33.632 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:35:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:35:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:35:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:35:33.633 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:35:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:35:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:35:33.697 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:35:33.718 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:35:33.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:35:33.832 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:35:33.865 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:35:33.914 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:35:34.023 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:35:34.232 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:35:34.574 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:35:34.673 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:35:34.673 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:35:34.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-29T08:35:34.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-29T08:35:34.839 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:35:34.839 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:36:04.869 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:36:04.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:36:04.869 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:36:05.348 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:36:05.365 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:36:05.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:36:05.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-29T08:36:05.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:36:05.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-29T08:36:05.596 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:36:05.596 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:36:05.600 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:36:05.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-29T08:36: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-29T08:36:08.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:36:08.091 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:36:08.092 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:36:08.093 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:36:08.103 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:36:08.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-29T08:36:08.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:36:08.116 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:36:08.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:36:08.117 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:36:08.117 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:36:08.124 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:36:08.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:36:08.250 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:36:08.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:36:08.343 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:36:08.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:36:08.387 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:36:08.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:36:08.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:36:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:36:08.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:36:08.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:36:08.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:35:58
2026-05-29T08:36:08.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71376, datetime.datetime(2026, 5, 29, 8, 35, 58), datetime.datetime(2026, 5, 29, 8, 35, 57), 'salt', 7.98, 80.15, None, 14.72, 104.09, 3.2, 833.28, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:36:08.501 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:36:08.501 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:36:08.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:57, diff=11.50815s, valid=True
2026-05-29T08:36:08.508 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:36:08.508 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:36:08.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:12, diff=-3.488458s, valid=True
2026-05-29T08:36:08.511 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:36:08.511 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:35:57, diff=11.519469s, valid=True
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:36:08.519 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:36:08.520 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:36:08.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:12, diff=-3.476862s, valid=True
2026-05-29T08:36:08.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:36:08.523 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:36:08.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:36:08.523 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969210.523936s, valid=True
2026-05-29T08:36:08.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:36:08.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:36:08.525 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:36:08.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:36:08.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:36:08.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:36:08.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:36:08.590 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:36:08.611 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:36:08.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:36:08.725 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:36:08.757 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:36:08.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:36:08.846 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:36:09.068 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:36:09.410 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:36:09.509 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:36:09.509 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:36: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-29T08:36: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-29T08:36:09.764 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:36:09.764 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:36:39.794 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:36:39.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:36:39.794 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:36:40.186 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:36:40.196 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:36:40.391 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:36:40.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-29T08:36:40.401 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:36:40.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-29T08:36:40.409 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:36:40.409 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:36:40.414 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:36:40.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-29T08:36:43.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-29T08:36:43.049 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:36:43.055 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:36:43.056 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:36:43.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:36:43.066 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:36:43.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-29T08:36:43.079 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:36:43.080 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:36:43.080 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:36:43.080 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:36:43.081 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:36:43.087 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:36:43.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:36:43.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:36:43.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:36:43.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:36:43.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:36:43.353 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:36:43.395 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:36:43.396 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:36:43.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:36:43.401 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:36:43.401 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:36:43.461 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:36:28
2026-05-29T08:36:43.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71377, datetime.datetime(2026, 5, 29, 8, 36, 28), datetime.datetime(2026, 5, 29, 8, 36, 28), 'salt', 8.01, 80.02, None, 13.87, 96.74, 3.22, 833.09, 'DRY', 0, None, 0, 1, 0, 0)]
2026-05-29T08:36:43.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:36:43.461 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:36:43.468 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:28, diff=15.46884s, valid=True
2026-05-29T08:36:43.468 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:36:43.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:36:43.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:12, diff=31.472312s, valid=True
2026-05-29T08:36:43.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:36:43.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:18, diff=25.480319s, valid=True
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:36:43.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:36:43.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:12, diff=31.484098s, valid=True
2026-05-29T08:36:43.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:36:43.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:36:43.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:36:43.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969245.484924s, valid=True
2026-05-29T08:36:43.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:36:43.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:36:43.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:36:43.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:36:43.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:36:43.550 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:36:43.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:36:43.551 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:36:43.572 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:36:43.625 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:36:43.685 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:36:43.786 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:36:43.835 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:36:43.875 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:36:44.084 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:36:44.426 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:36:44.527 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:36:44.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:36:44.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-29T08:36:44.527 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:36:44.696 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:36:44.696 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:37:14.698 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:37:14.698 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:37:14.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:37:14.934 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:37:14.951 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:37:15.156 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:37: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-29T08:37:15.165 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:37:15.165 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:37:15.174 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:37:15.174 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:37:15.179 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:37:15.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-29T08:37:17.619 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:37:17.619 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:37:17.627 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:37:17.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:37:17.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:37:17.640 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:37:17.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-29T08:37:17.653 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:37:17.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:37:17.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:37:17.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:37:17.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:37:17.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:37:17.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:37:17.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:37:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:37:17.886 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:37:17.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:37:17.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:37:17.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:37:17.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:37:17.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:37:17.978 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:37:17.978 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:37:18.039 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:36:58
2026-05-29T08:37:18.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71378, datetime.datetime(2026, 5, 29, 8, 36, 58), datetime.datetime(2026, 5, 29, 8, 36, 58), 'salt', 8.05, 79.92, None, 14.4, 101.6, 3.25, 833.34, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:37:18.039 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:37:18.039 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:37:18.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:58, diff=20.046358s, valid=True
2026-05-29T08:37:18.046 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:37:18.046 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:37:18.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:12, diff=6.049771s, valid=True
2026-05-29T08:37:18.049 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:37:18.049 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:37:18.057 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:36:54, diff=24.057833s, valid=True
2026-05-29T08:37:18.057 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:37:18.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:37:18.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:37:18.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:37:18.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:37:18.058 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:37:18.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:12, diff=6.06146s, valid=True
2026-05-29T08:37:18.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:37:18.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:37:18.061 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:37:18.062 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969280.06226s, valid=True
2026-05-29T08:37:18.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:37:18.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:37:18.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:37:18.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:37:18.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:37:18.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:37:18.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:37:18.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:37:18.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:37:18.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:37:18.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:37:18.295 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:37:18.344 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:37:18.384 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:37:18.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:37:18.917 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:37:19.016 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:37:19.016 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:37:19.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-29T08:37:19.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-29T08:37:19.184 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:37:19.184 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:37:49.189 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:37:49.189 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:37:49.190 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:37:49.515 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:37:49.528 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:37:49.723 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:37:49.723 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:37:49.732 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:37:49.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-29T08:37:49.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:37:49.740 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:37:49.746 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:37:49.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-29T08:37:52.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-29T08:37:52.327 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:37:52.334 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:37:52.335 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:37:52.335 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:37:52.347 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:37:52.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-29T08:37:52.360 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:37:52.361 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:37:52.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:37:52.362 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:37:52.362 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:37:52.369 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:37:52.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:37:52.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:37:52.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:37:52.602 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:37:52.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:37:52.648 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:37:52.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:37:52.688 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:37:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:37:52.693 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:37:52.693 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:37:52.755 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:37:29
2026-05-29T08:37:52.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71379, datetime.datetime(2026, 5, 29, 8, 37, 29), datetime.datetime(2026, 5, 29, 8, 37, 28), 'salt', 7.98, 79.62, None, 14.33, 101.16, 3.3, 833.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:37:52.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:37:52.755 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:37:52.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:28, diff=24.762466s, valid=True
2026-05-29T08:37:52.762 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:37:52.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:37:52.765 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:12, diff=40.765898s, valid=True
2026-05-29T08:37:52.766 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:37:52.766 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:37:52.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:24, diff=28.773698s, valid=True
2026-05-29T08:37:52.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:37:52.773 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:37:52.773 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:37:52.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:37:52.774 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:37:52.774 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:37:52.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:12, diff=40.777353s, valid=True
2026-05-29T08:37:52.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:37:52.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:37:52.777 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:37:52.778 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969314.778154s, valid=True
2026-05-29T08:37:52.779 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:37:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:37:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:37:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:37:52.780 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:37:52.847 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:37:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:37:52.848 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:37:52.935 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:37:52.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:37:53.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:37:53.082 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:37:53.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:37:53.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:37:53.373 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:37:53.707 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:37:53.806 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:37:53.807 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:37:53.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-29T08:37:53.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-29T08:37:54.057 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:37:54.057 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:38:24.087 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:38:24.087 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:38:24.087 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:38:24.687 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:38:24.700 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:38:24.907 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:38:24.907 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:38:24.917 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:38:24.917 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:38:24.927 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:38:24.927 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:38:24.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:38:24.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:38:27.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-29T08:38:27.391 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:38:27.398 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:38:27.399 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:38:27.399 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:38:27.408 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:38:27.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-29T08:38:27.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:38:27.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:38:27.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:38:27.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:38:27.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:38:27.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:38:27.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:38:27.547 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:38:27.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:38:27.641 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:38:27.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:38:27.686 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:38:27.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:38:27.727 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:38:27.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:38:27.732 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:38:27.732 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:38:27.792 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:37:59
2026-05-29T08:38:27.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71380, datetime.datetime(2026, 5, 29, 8, 37, 59), datetime.datetime(2026, 5, 29, 8, 37, 58), 'salt', 7.98, 79.49, None, 14.72, 93.31, 3.32, 833.28, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:38:27.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:38:27.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:38:27.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:58, diff=29.799528s, valid=True
2026-05-29T08:38:27.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:38:27.799 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:38:27.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:38:12, diff=15.802986s, valid=True
2026-05-29T08:38:27.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:38:27.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:37:55, diff=32.811099s, valid=True
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:38:27.811 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:38:27.814 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:38:12, diff=15.814776s, valid=True
2026-05-29T08:38:27.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:38:27.814 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:38:27.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:38:27.815 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969349.815567s, valid=True
2026-05-29T08:38:27.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:38:27.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:38:27.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:38:27.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:38:27.817 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:38:27.881 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:38:27.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:38:27.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:38:27.902 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:38:27.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:38:28.016 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:38:28.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:38:28.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:38:28.145 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:38:28.349 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:38:28.682 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:38:28.782 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:38:28.782 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:38:28.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-29T08:38:28.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-29T08:38:28.950 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:38:28.950 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:38:58.980 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:38:58.981 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:38:58.981 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:38:59.301 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:38:59.313 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:38:59.572 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:38:59.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-29T08:38:59.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:38:59.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-29T08:38:59.588 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:38:59.589 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:38:59.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:38:59.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-29T08:39:02.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-29T08:39:02.042 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:39:02.051 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:39:02.052 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:39:02.052 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:39:02.064 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:39:02.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-29T08:39:02.082 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:39:02.083 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:39:02.083 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:39:02.083 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:39:02.084 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:39:02.090 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:39:02.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:39:02.214 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:39:02.312 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:39:02.313 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:39:02.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:39:02.356 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:39:02.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:39:02.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:39:02.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:39:02.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:39:02.403 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:39:02.462 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:38:59
2026-05-29T08:39:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71382, datetime.datetime(2026, 5, 29, 8, 38, 59), datetime.datetime(2026, 5, 29, 8, 38, 59), 'salt', 8.25, 79.69, None, 12.53, 102.82, 3.3, 833.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:39:02.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:39:02.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:39:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:38:59, diff=3.469391s, valid=True
2026-05-29T08:39:02.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:39:02.469 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:39:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:12, diff=-9.527213s, valid=True
2026-05-29T08:39:02.472 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:39:02.472 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:39:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:38:55, diff=7.480614s, valid=True
2026-05-29T08:39:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:39:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:39:02.480 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:39:02.480 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:39:02.481 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:39:02.481 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:39:02.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:12, diff=-9.515751s, valid=True
2026-05-29T08:39:02.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:39:02.484 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:39:02.484 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:39:02.485 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969384.485041s, valid=True
2026-05-29T08:39:02.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:39:02.486 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:39:02.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:39:02.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:39:02.487 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:39:02.553 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:39:02.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:39:02.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:39:02.574 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:39:02.631 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:39:02.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:39:02.726 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:39:02.775 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:39:02.819 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:39:03.044 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:39:03.435 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:39:03.551 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:39:03.551 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:39:03.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-29T08:39:03.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-29T08:39:03.804 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:39:03.805 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:39:33.817 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:39:33.817 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:39:33.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:39:34.037 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:39:34.050 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:39:34.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:39:34.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-29T08:39:34.259 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:39:34.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-29T08:39:34.268 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:39:34.268 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:39:34.273 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:39:34.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-29T08:39:36.861 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:39:36.862 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:39:36.869 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:39:36.870 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:39:36.870 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:39:36.880 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:39:36.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-29T08:39:36.895 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:39:36.896 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:39:36.896 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:39:36.896 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:39:36.897 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:39:36.903 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:39:37.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:39:37.029 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:39:37.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:39:37.118 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:39:37.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:39:37.161 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:39:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:39:37.202 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:39:37.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:39:37.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:39:37.206 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:39:37.267 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:39:30
2026-05-29T08:39:37.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71383, datetime.datetime(2026, 5, 29, 8, 39, 30), datetime.datetime(2026, 5, 29, 8, 39, 29), 'salt', 8.25, 79.72, None, 15.0, 95.5, 3.29, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:39:37.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:39:37.268 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:39:37.274 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:29, diff=8.274882s, valid=True
2026-05-29T08:39:37.275 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:39:37.275 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:39:37.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:12, diff=25.278184s, valid=True
2026-05-29T08:39:37.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:39:37.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:39:37.285 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:27, diff=10.285824s, valid=True
2026-05-29T08:39:37.285 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:39:37.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:39:37.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:39:37.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:39:37.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:39:37.286 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:39:37.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:12, diff=25.289352s, valid=True
2026-05-29T08:39:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:39:37.289 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:39:37.289 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:39:37.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969419.290111s, valid=True
2026-05-29T08:39:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:39:37.291 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:39:37.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:39:37.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:39:37.292 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:39:37.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:39:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:39:37.356 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:39:37.376 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:39:37.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:39:37.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:39:37.522 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:39:37.571 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:39:37.611 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:39:37.812 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:39:38.150 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:39:38.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:39:38.307 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:39:38.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-29T08:39:38.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-29T08:39:38.475 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:39:38.475 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:40:08.478 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:40:08.478 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:40:08.479 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:40:08.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:40:08.753 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:40:08.960 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:40:08.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-29T08:40:08.968 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:40:08.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-29T08:40:08.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:40:08.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:40:08.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:40:08.982 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:40:11.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-29T08:40:11.551 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:40:11.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:40:11.555 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:40:11.555 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:40:11.564 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:40:11.576 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:40:11.577 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:40:11.577 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:40:11.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:40:11.577 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:40:11.578 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:40:11.583 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:40:11.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:40:11.707 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:40:11.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:40:11.800 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:40:11.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:40:11.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:40:11.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:40:11.884 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:40:11.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:40:11.888 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:40:11.889 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:40:11.952 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:40:00
2026-05-29T08:40:11.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71384, datetime.datetime(2026, 5, 29, 8, 40), datetime.datetime(2026, 5, 29, 8, 40), 'salt', 8.15, 79.65, None, 15.14, 95.19, 3.3, 833.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:40:11.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:40:11.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:40:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:00, diff=11.959577s, valid=True
2026-05-29T08:40:11.959 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:40:11.959 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:40:11.962 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:12, diff=-0.037047s, valid=True
2026-05-29T08:40:11.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:40:11.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:40:11.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:39:58, diff=13.970894s, valid=True
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:40:11.971 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:40:11.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:12, diff=-0.025483s, valid=True
2026-05-29T08:40:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:40:11.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:40:11.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:40:11.975 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969453.97532s, valid=True
2026-05-29T08:40:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:40:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:40:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:40:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:40:11.977 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:40:12.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:40:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:40:12.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:40:12.061 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:40:12.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:40:12.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:40:12.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:40:12.256 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:40:12.296 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:40:12.498 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:40:12.830 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:40:12.929 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:40:12.929 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:40:12.929 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:40:12.929 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:40:13.179 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:40:13.179 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:40:43.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:40:43.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:40:43.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:40:43.598 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:40:43.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:40:43.827 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:40:43.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-29T08:40:43.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:40:43.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-29T08:40:43.848 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:40:43.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:40:43.854 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:40:43.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-29T08:40:46.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-29T08:40:46.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:40:46.728 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:40:46.729 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:40:46.729 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:40:46.739 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:40:46.752 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:40:46.753 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:40:46.753 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:40:46.753 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:40:46.754 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:40:46.754 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:40:46.760 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:40:46.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:40:46.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:40:46.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:40:46.985 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:40:47.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:40:47.028 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:40:47.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:40:47.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:40:47.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:40:47.073 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:40:47.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:40:47.133 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:40:31
2026-05-29T08:40:47.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71385, datetime.datetime(2026, 5, 29, 8, 40, 31), datetime.datetime(2026, 5, 29, 8, 40, 30), 'salt', 8.15, 79.15, None, 15.7, 92.89, 3.39, 833.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:40:47.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:40:47.133 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:40:47.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:30, diff=17.140405s, valid=True
2026-05-29T08:40:47.140 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:40:47.140 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:40:47.143 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:12, diff=35.143826s, valid=True
2026-05-29T08:40:47.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:40:47.144 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:40:47.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:30, diff=17.151693s, valid=True
2026-05-29T08:40:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:40:47.151 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:40:47.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:40:47.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:40:47.152 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:40:47.152 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:40:47.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:12, diff=35.155307s, valid=True
2026-05-29T08:40:47.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:40:47.155 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:40:47.155 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:40:47.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969489.15609s, valid=True
2026-05-29T08:40:47.157 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:40:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:40:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:40:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:40:47.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:40:47.225 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:40:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:40:47.226 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:40:47.246 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:40:47.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:40:47.358 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:40:47.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:40:47.442 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:40:47.482 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:40:47.756 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:40:48.092 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:40:48.193 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:40:48.193 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:40:48.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-29T08:40:48.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-29T08:40:48.355 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:40:48.355 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:41:18.358 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:41:18.358 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:41:18.359 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:41:18.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:41:18.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:41:18.818 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:41:18.818 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:41:18.828 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:41:18.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-29T08:41:18.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:41:18.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:41:18.843 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:41:18.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-29T08:41:21.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:41:21.532 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:41:21.540 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:41:21.541 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:41:21.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:41:21.552 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:41:21.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-29T08:41:21.565 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:41:21.566 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:41:21.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:41:21.566 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:41:21.567 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:41:21.573 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:41:21.698 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:41:21.699 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:41:21.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:41:21.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:41:21.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:41:21.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:41:21.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:41:21.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:41:21.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:41:21.895 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:41:21.896 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:41:21.962 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:41:01
2026-05-29T08:41:21.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71386, datetime.datetime(2026, 5, 29, 8, 41, 1), datetime.datetime(2026, 5, 29, 8, 41, 1), 'salt', 8.21, 78.92, None, 15.24, 95.73, 3.43, 833.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:41:21.963 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:41:21.963 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:41:21.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:01, diff=20.970457s, valid=True
2026-05-29T08:41:21.970 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:41:21.970 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:41:21.973 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:12, diff=9.973969s, valid=True
2026-05-29T08:41:21.974 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:41:21.974 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:40:56, diff=25.982086s, valid=True
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:41:21.982 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:41:21.985 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:12, diff=9.985837s, valid=True
2026-05-29T08:41:21.985 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:41:21.986 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:41:21.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:41:21.986 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969523.986654s, valid=True
2026-05-29T08:41:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:41:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:41:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:41:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:41:21.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:41:22.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:41:22.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:41:22.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:41:22.072 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:41:22.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:41:22.185 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:41:22.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:41:22.267 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:41:22.307 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:41:22.525 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:41:22.856 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:41:22.955 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:41:22.955 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:41:22.955 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:41:22.956 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:41:23.131 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:41:23.131 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:41:53.161 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:41:53.162 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:41:53.162 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:41:53.565 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:41:53.585 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:41:53.801 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:41:53.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-29T08:41:53.812 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:41:53.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:41:53.821 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:41:53.822 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:41:53.829 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:41:53.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-29T08:41:56.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-29T08:41:56.487 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:41:56.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:41:56.495 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:41:56.496 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:41:56.505 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:41:56.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-29T08:41:56.519 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:41:56.519 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:41:56.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:41:56.520 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:41:56.520 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:41:56.525 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:41:56.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:41:56.649 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:41:56.743 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:41:56.744 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:41:56.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:41:56.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:41:56.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:41:56.832 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:41:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:41:56.838 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:41:56.838 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:41:56.902 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:41:31
2026-05-29T08:41:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71387, datetime.datetime(2026, 5, 29, 8, 41, 31), datetime.datetime(2026, 5, 29, 8, 41, 31), 'salt', 8.28, 78.59, None, 14.57, 96.98, 3.49, 833.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:41:56.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:41:56.903 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:41:56.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:31, diff=25.910251s, valid=True
2026-05-29T08:41:56.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:41:56.910 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:41:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:12, diff=44.913637s, valid=True
2026-05-29T08:41:56.913 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:41:56.913 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:41:56.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:26, diff=30.921587s, valid=True
2026-05-29T08:41:56.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:41:56.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:41:56.921 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:41:56.921 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:41:56.922 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:41:56.922 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:41:56.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:12, diff=44.925243s, valid=True
2026-05-29T08:41:56.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:41:56.925 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:41:56.925 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:41:56.926 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969558.926032s, valid=True
2026-05-29T08:41:56.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:41:56.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:41:56.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:41:56.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:41:56.928 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:41:56.991 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:41:56.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:41:56.992 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:41:57.012 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:41:57.064 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:41:57.125 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:41:57.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:41:57.207 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:41:57.316 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:41:57.517 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:41:57.848 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:41:57.948 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:41:57.948 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:41:57.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-29T08:41:57.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-29T08:41:58.119 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:41:58.119 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:42:28.143 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:42:28.143 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:42:28.144 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:42:28.389 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:42:28.406 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:42:28.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:42:28.617 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:42:28.627 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:42:28.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-29T08:42:28.637 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:42:28.637 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:42:28.645 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:42:28.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-29T08:42:31.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-29T08:42:31.158 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:42:31.164 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:42:31.165 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:42:31.165 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:42:31.173 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:42: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-29T08:42:31.187 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:42:31.188 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:42:31.188 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:42:31.188 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:42:31.188 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:42:31.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:42:31.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:42:31.316 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:42:31.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:42:31.411 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:42:31.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:42:31.455 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:42:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 666 rows from lcogt
2026-05-29T08:42:31.495 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:42:31.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:42:31.500 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:42:31.500 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:42:31.559 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:42:01
2026-05-29T08:42:31.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71388, datetime.datetime(2026, 5, 29, 8, 42, 1), datetime.datetime(2026, 5, 29, 8, 42, 1), 'salt', 8.25, 78.39, None, 15.07, 91.74, 3.53, 833.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:42:31.559 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:42:31.559 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:42:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:01, diff=30.56677s, valid=True
2026-05-29T08:42:31.566 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:42:31.566 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:42:31.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=19.57023s, valid=True
2026-05-29T08:42:31.570 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:42:31.570 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:41:56, diff=35.57837s, valid=True
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:42:31.578 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 666 rows. Structure expected: 10 fields
2026-05-29T08:42:31.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=19.582066s, valid=True
2026-05-29T08:42:31.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:42:31.582 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:42:31.582 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:42:31.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969593.583263s, valid=True
2026-05-29T08:42:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:42:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:42:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:42:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:42:31.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:42:31.648 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:42:31.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:42:31.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:42:31.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:42:31.722 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:42:31.783 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:42:31.815 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:42:31.864 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:42:31.904 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:42:32.105 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:42:32.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:42:32.537 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:42:32.537 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:42:32.537 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:42:32.537 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:42:32.701 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:42:32.701 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:43:02.706 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:43:02.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:43: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-29T08:43:03.257 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:43:03.277 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:43:03.492 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:43:03.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-29T08:43:03.501 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:43:03.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-29T08:43:03.511 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:43:03.511 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:43:03.516 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:43:03.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-29T08:43:05.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-29T08:43:05.885 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:43:05.892 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:43:05.893 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:43:05.893 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:43:05.904 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:43:05.917 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:43:05.918 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:43:05.918 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:43:05.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:43:05.919 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:43:05.919 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:43:05.925 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:43:06.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:43:06.052 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:43:06.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:43:06.147 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:43:06.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:43:06.192 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:43:06.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:43:06.233 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:43:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:43:06.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:43:06.238 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:43:06.298 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:43:02
2026-05-29T08:43:06.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71390, datetime.datetime(2026, 5, 29, 8, 43, 2), datetime.datetime(2026, 5, 29, 8, 43, 1), 'salt', 8.31, 77.86, None, 16.16, 105.24, 3.63, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:43:06.298 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:43:06.299 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:43:06.305 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:43:01, diff=5.305824s, valid=True
2026-05-29T08:43:06.305 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:43:06.306 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:43:06.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=54.309224s, valid=True
2026-05-29T08:43:06.309 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:43:06.309 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:57, diff=9.317132s, valid=True
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:43:06.317 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:43:06.320 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=54.320808s, valid=True
2026-05-29T08:43:06.320 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:43:06.321 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:43:06.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:43:06.321 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969628.321612s, valid=True
2026-05-29T08:43:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:43:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:43:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:43:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:43:06.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:43:06.386 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:43:06.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:43:06.387 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:43:06.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:43:06.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:43:06.521 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:43:06.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:43:06.670 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:43:06.710 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:43:06.911 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:43:07.245 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:43:07.344 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:43:07.344 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:43:07.344 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:43:07.344 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:43:07.504 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:43:07.504 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:43:37.514 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:43:37.514 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:43:37.515 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:43:37.747 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:43:37.767 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:43:37.972 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:43: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-29T08:43:37.982 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:43:37.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-29T08:43:37.991 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:43:37.991 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:43:37.995 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:43:37.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-29T08:43:40.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-29T08:43:40.394 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:43:40.402 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:43:40.403 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:43:40.403 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:43:40.414 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:43:40.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-29T08:43:40.421 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:43:40.421 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:43:40.422 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:43:40.422 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:43:40.422 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:43:40.427 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:43:40.554 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:43:40.555 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:43:40.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:43:40.651 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:43:40.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:43:40.695 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:43:40.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 665 rows from lcogt
2026-05-29T08:43:40.736 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:43:40.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:43:40.741 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:43:40.741 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:43:40.803 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:43:32
2026-05-29T08:43:40.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71391, datetime.datetime(2026, 5, 29, 8, 43, 32), datetime.datetime(2026, 5, 29, 8, 43, 32), 'salt', 8.28, 77.66, None, 13.23, 100.78, 3.66, 833.21, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:43:40.803 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:43:40.803 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:43:40.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:43:32, diff=8.810372s, valid=True
2026-05-29T08:43:40.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:43:40.810 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:43:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=88.813715s, valid=True
2026-05-29T08:43:40.813 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:43:40.813 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:43:28, diff=12.821498s, valid=True
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:43:40.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:43:40.822 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 665 rows. Structure expected: 10 fields
2026-05-29T08:43:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=88.825067s, valid=True
2026-05-29T08:43:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:43:40.825 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:43:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:43:40.825 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969662.825864s, valid=True
2026-05-29T08:43:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:43:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:43:40.827 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:43:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:43:40.828 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:43:40.890 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:43:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:43:40.891 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:43:40.911 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:43:40.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:43:41.025 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:43:41.058 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:43:41.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:43:41.147 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:43:41.351 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:43:41.685 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:43:41.784 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:43:41.784 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:43:41.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-29T08:43:41.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-29T08:43:41.949 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:43:41.949 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:44:11.979 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:44:11.979 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:44:11.979 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:44:12.356 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:44:12.373 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:44:12.577 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:44:12.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-29T08:44:12.585 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:44:12.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-29T08:44:12.593 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:44:12.593 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:44:12.597 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:44:12.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-29T08:44:15.074 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:44:15.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:44:15.082 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:44:15.083 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:44:15.083 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:44:15.094 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:44:15.107 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:44:15.108 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:44:15.108 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:44:15.108 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:44:15.109 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:44:15.109 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:44:15.116 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:44:15.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:44:15.238 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:44:15.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:44:15.333 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:44:15.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:44:15.376 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:44:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:44:15.416 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:44:15.420 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:44:15.421 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:44:15.421 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:44:15.488 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:44:02
2026-05-29T08:44:15.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71392, datetime.datetime(2026, 5, 29, 8, 44, 2), datetime.datetime(2026, 5, 29, 8, 44, 2), 'salt', 8.21, 77.66, None, 13.76, 94.98, 3.66, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:44:15.488 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:44:15.488 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:44:15.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:44:02, diff=13.495323s, valid=True
2026-05-29T08:44:15.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:44:15.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:44:15.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=123.498584s, valid=True
2026-05-29T08:44:15.498 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:44:15.498 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:43:59, diff=16.506202s, valid=True
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:44:15.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:44:15.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=123.509714s, valid=True
2026-05-29T08:44:15.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:44:15.509 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:44:15.509 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:44:15.510 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969697.510465s, valid=True
2026-05-29T08:44:15.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:44:15.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:44:15.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:44:15.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:44:15.512 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:44:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:44:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:44:15.575 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:44:15.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:44:15.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:44:15.777 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:44:15.810 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:44:15.859 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:44:15.899 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:44:16.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:44:16.436 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:44:16.536 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:44:16.536 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:44:16.536 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:44:16.536 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:44:16.785 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:44:16.785 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:44:46.812 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:44:46.812 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:44:46.812 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:44:47.019 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:44:47.031 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:44:47.229 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:44:47.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-29T08:44:47.238 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:44:47.238 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:44:47.246 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:44:47.246 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:44:47.250 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:44:47.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-29T08:44:49.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-29T08:44:49.739 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:44:49.746 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:44:49.747 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:44:49.748 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:44:49.758 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:44:49.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-29T08:44:49.771 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:44:49.772 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:44:49.772 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:44:49.772 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:44:49.773 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:44:49.779 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:44:49.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:44:49.874 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:44:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:44:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:44:50.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:44:50.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:44:50.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 664 rows from lcogt
2026-05-29T08:44:50.069 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:44:50.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:44:50.074 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:44:50.074 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:44:50.135 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:44:33
2026-05-29T08:44:50.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71393, datetime.datetime(2026, 5, 29, 8, 44, 33), datetime.datetime(2026, 5, 29, 8, 44, 32), 'salt', 8.21, 78.16, None, 12.21, 98.24, 3.57, 833.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:44:50.136 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:44:50.136 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:44:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:44:32, diff=18.14247s, valid=True
2026-05-29T08:44:50.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:44:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:44:50.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=158.145755s, valid=True
2026-05-29T08:44:50.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:44:50.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:44:31, diff=19.153067s, valid=True
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:44:50.153 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 664 rows. Structure expected: 10 fields
2026-05-29T08:44:50.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=158.156414s, valid=True
2026-05-29T08:44:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:44:50.156 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:44:50.156 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:44:50.157 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969732.157158s, valid=True
2026-05-29T08:44:50.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:44:50.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:44:50.158 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:44:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:44:50.159 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:44:50.218 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:44:50.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:44:50.219 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:44:50.240 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:44:50.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:44:50.355 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:44:50.388 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:44:50.438 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:44:50.478 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:44:50.683 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:44:51.022 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:44:51.122 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:44:51.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:44:51.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-29T08:44:51.123 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:44:51.947 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:44:51.947 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:45:21.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:45:21.978 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:45:21.978 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:45:22.378 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:45:22.398 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:45:22.674 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:45:22.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-29T08:45:22.683 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:45:22.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-29T08:45:22.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:45:22.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:45:22.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:45:22.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-29T08:45:25.106 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:45:25.107 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:45:25.115 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:45:25.116 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:45:25.116 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:45:25.127 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:45:25.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-29T08:45:25.140 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:45:25.141 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:45:25.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:45:25.141 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:45:25.142 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:45:25.148 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:45:25.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:45:25.283 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:45:25.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:45:25.379 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:45:25.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:45:25.424 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:45:25.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:45:25.467 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:45:25.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:45:25.472 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:45:25.473 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:45:25.533 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:45:03
2026-05-29T08:45:25.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71394, datetime.datetime(2026, 5, 29, 8, 45, 3), datetime.datetime(2026, 5, 29, 8, 45, 3), 'salt', 8.15, 78.46, None, 12.56, 98.62, 3.52, 833.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:45:25.533 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:45:25.533 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:45:25.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:45:03, diff=22.54041s, valid=True
2026-05-29T08:45:25.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:45:25.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:45:25.543 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=193.54395s, valid=True
2026-05-29T08:45:25.544 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:45:25.544 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:45:02, diff=23.552055s, valid=True
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:45:25.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:45:25.555 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=193.555916s, valid=True
2026-05-29T08:45:25.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:45:25.556 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:45:25.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:45:25.556 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969767.556739s, valid=True
2026-05-29T08:45:25.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:45:25.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:45:25.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:45:25.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:45:25.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:45:25.621 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:45:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:45:25.622 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:45:25.642 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:45:25.694 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:45:25.755 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:45:25.788 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:45:25.837 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:45:25.877 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:45:26.079 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:45:26.412 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:45:26.512 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:45:26.512 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:45:26.512 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:45:26.512 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:45:26.674 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:45:26.674 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:45:56.685 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:45:56.685 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:45:56.685 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:45:57.100 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:45:57.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:45:57.337 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:45:57.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-29T08:45:57.346 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:45:57.346 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SALT marked all-sky image from http://skycam.salt.saao.ac.za/AllSkyCurrentImageMarked.JPG
2026-05-29T08:45:57.355 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:45:57.356 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:45:57.364 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:45:57.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-29T08:45:59.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-29T08:45:59.734 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:45:59.742 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:45:59.743 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:45:59.743 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:45:59.753 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:45:59.766 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:45:59.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:45:59.768 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:45:59.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:45:59.768 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:45:59.769 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:45:59.774 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:45:59.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:45:59.869 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:45:59.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:45:59.961 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:46:00.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:46:00.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:46:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:46:00.055 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:46:00.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:46:00.060 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:46:00.060 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:46:00.122 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:45:33
2026-05-29T08:46:00.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71395, datetime.datetime(2026, 5, 29, 8, 45, 33), datetime.datetime(2026, 5, 29, 8, 45, 33), 'salt', 8.11, 79.02, None, 12.46, 94.09, 3.41, 833.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:46:00.122 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:46:00.122 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:46:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:45:33, diff=27.128318s, valid=True
2026-05-29T08:46:00.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:46:00.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:46:00.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=228.131267s, valid=True
2026-05-29T08:46:00.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:46:00.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:45:28, diff=32.13798s, valid=True
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:46:00.138 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:46:00.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:42:12, diff=228.141171s, valid=True
2026-05-29T08:46:00.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:46:00.141 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:46:00.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:46:00.141 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969802.141847s, valid=True
2026-05-29T08:46:00.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:46:00.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:46:00.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:46:00.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:46:00.143 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:46:00.203 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:46:00.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:46:00.204 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:46:00.224 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:46:00.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:46:00.337 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:46:00.370 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:46:00.419 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:46:00.459 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:46:00.673 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:46:01.005 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:46:01.161 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:46:01.161 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:46:01.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-29T08:46:01.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-29T08:46:01.418 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:46:01.418 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:46:31.448 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:46:31.448 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:46:31.448 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:46:31.715 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:46:31.730 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:46:31.933 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:46:31.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-29T08:46:31.943 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:46:31.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-29T08:46:31.953 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:46:31.953 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:46:31.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:46:31.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-29T08:46:34.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-29T08:46:34.413 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:46:34.422 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:46:34.423 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:46:34.423 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:46:34.432 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:46:34.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-29T08:46:34.445 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:46:34.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:46:34.445 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:46:34.446 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:46:34.446 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:46:34.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:46:34.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:46:34.549 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:46:34.635 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:46:34.636 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:46:34.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:46:34.679 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:46:34.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:46:34.718 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:46:34.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:46:34.722 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:46:34.722 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:46:34.785 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:46:34
2026-05-29T08:46:34.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71397, datetime.datetime(2026, 5, 29, 8, 46, 34), datetime.datetime(2026, 5, 29, 8, 46, 33), 'salt', 8.08, 79.59, None, 12.53, 88.78, 3.31, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:46:34.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:46:34.785 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:46:34.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:46:33, diff=1.792176s, valid=True
2026-05-29T08:46:34.792 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:46:34.792 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:46:34.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:12, diff=-37.204766s, valid=True
2026-05-29T08:46:34.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:46:34.795 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:46:29, diff=5.802419s, valid=True
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:46:34.802 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:46:34.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:12, diff=-37.194344s, valid=True
2026-05-29T08:46:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:46:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:46:34.805 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:46:34.806 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969836.806356s, valid=True
2026-05-29T08:46:34.807 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:46:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:46:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:46:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:46:34.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:46:34.868 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:46:34.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:46:34.869 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:46:34.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:46:34.942 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:46:35.002 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:46:35.035 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:46:35.084 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:46:35.125 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:46:35.327 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:46:35.660 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:46:35.759 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:46:35.759 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:46:35.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-29T08:46:35.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-29T08:46:35.953 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:46:35.954 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:47:05.984 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:47:05.984 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:47:05.984 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:47:06.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:47:06.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:47:06.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:47:06.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-29T08:47:06.830 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:47:06.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-29T08:47:06.838 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:47:06.838 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:47:06.842 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:47:06.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:47:09.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-29T08:47:09.235 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:47:09.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:47:09.243 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:47:09.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:47:09.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:47:09.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-29T08:47:09.267 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:47:09.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:47:09.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:47:09.268 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:47:09.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:47:09.274 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:47:09.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:47:09.403 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:47:09.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:47:09.496 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:47:09.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:47:09.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:47:09.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:47:09.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:47:09.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:47:09.587 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:47:09.587 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:47:09.647 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:47:04
2026-05-29T08:47:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71398, datetime.datetime(2026, 5, 29, 8, 47, 4), datetime.datetime(2026, 5, 29, 8, 47, 4), 'salt', 8.05, 79.42, None, 11.82, 96.04, 3.34, 833.09, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:47:09.647 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:47:09.647 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:47:09.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:04, diff=5.654736s, valid=True
2026-05-29T08:47:09.654 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:47:09.654 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:47:09.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:12, diff=-2.341873s, valid=True
2026-05-29T08:47:09.658 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:47:09.658 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:46:59, diff=10.666094s, valid=True
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:47:09.666 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:47:09.669 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:12, diff=-2.330258s, valid=True
2026-05-29T08:47:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:47:09.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:47:09.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:47:09.670 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969871.67054s, valid=True
2026-05-29T08:47:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:47:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:47:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:47:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:47:09.672 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:47:09.735 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:47:09.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:47:09.736 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:47:09.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:47:09.808 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:47:09.874 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:47:09.910 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:47:09.964 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:47:10.007 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:47:10.290 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:47:10.621 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:47:10.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:47:10.720 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:47:10.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-29T08:47:10.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-29T08:47:10.886 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:47:10.886 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:47:40.912 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:47:40.912 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:47:40.912 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:47:41.149 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:47:41.166 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:47:41.372 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:47:41.372 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:47:41.383 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:47:41.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-29T08:47:41.393 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:47:41.393 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:47:41.396 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:47:41.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-29T08:47:43.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-29T08:47:43.874 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:47:43.882 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:47:43.883 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:47:43.883 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:47:43.894 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:47:43.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-29T08:47:43.907 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:47:43.908 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:47:43.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:47:43.908 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:47:43.909 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:47:43.915 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:47:44.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:47:44.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:47:44.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:47:44.145 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:47:44.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:47:44.194 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:47:44.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:47:44.235 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:47:44.239 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:47:44.240 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:47:44.240 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:47:44.303 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:47:34
2026-05-29T08:47:44.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71399, datetime.datetime(2026, 5, 29, 8, 47, 34), datetime.datetime(2026, 5, 29, 8, 47, 34), 'salt', 8.11, 78.95, None, 12.35, 85.33, 3.42, 833.03, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:47:44.303 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:47:44.303 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:47:44.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:34, diff=10.310615s, valid=True
2026-05-29T08:47:44.310 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:47:44.310 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:47:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:12, diff=-27.685966s, valid=True
2026-05-29T08:47:44.314 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:47:44.314 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:47:29, diff=15.321992s, valid=True
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:47:44.322 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:47:44.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:12, diff=-27.674334s, valid=True
2026-05-29T08:47:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:47:44.325 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:47:44.325 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:47:44.326 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969906.326465s, valid=True
2026-05-29T08:47:44.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:47:44.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:47:44.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:47:44.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:47:44.328 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:47:44.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:47:44.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:47:44.392 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:47:44.412 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:47:44.465 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:47:44.526 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:47:44.558 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:47:44.607 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:47:44.647 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:47:44.849 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:47:45.181 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:47:45.281 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:47:45.281 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:47:45.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-29T08:47:45.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-29T08:47:45.444 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:47:45.444 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:48:15.450 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:48:15.450 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:48:15.451 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:48:15.706 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:48:15.721 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:48:15.924 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:48:15.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-29T08:48:15.931 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:48:15.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-29T08:48:15.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:48:15.941 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:48:15.946 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:48:15.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-29T08:48:18.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-29T08:48:18.459 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:48:18.467 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:48:18.468 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:48:18.468 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:48:18.481 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:48:18.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-29T08:48:18.494 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:48:18.495 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:48:18.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:48:18.496 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:48:18.496 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:48:18.502 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:48:18.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:48:18.630 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:48:18.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:48:18.726 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:48:18.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:48:18.771 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:48:18.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:48:18.813 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:48:18.818 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:48:18.819 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:48:18.819 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:48:18.878 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:48:04
2026-05-29T08:48:18.878 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71400, datetime.datetime(2026, 5, 29, 8, 48, 4), datetime.datetime(2026, 5, 29, 8, 48, 4), 'salt', 8.05, 79.02, None, 15.6, 88.99, 3.41, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:48:18.879 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:48:18.879 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:48:18.885 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:04, diff=14.885898s, valid=True
2026-05-29T08:48:18.886 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:48:18.886 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:48:18.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:12, diff=6.889343s, valid=True
2026-05-29T08:48:18.889 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:48:18.889 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:00, diff=18.897321s, valid=True
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:48:18.897 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:48:18.900 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:12, diff=6.90095s, valid=True
2026-05-29T08:48:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:48:18.901 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:48:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:48:18.901 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969940.901753s, valid=True
2026-05-29T08:48:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:48:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:48:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:48:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:48:18.903 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:48:18.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:48:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:48:18.968 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:48:18.988 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:48:19.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:48:19.102 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:48:19.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:48:19.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:48:19.295 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:48:19.496 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:48:19.831 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:48:19.937 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:48:19.937 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:48: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-29T08:48: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-29T08:48:20.099 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:48:20.099 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:48:50.129 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:48:50.129 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:48:50.129 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:48:50.537 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:48:50.556 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:48:50.769 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:48:50.769 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:48:50.778 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:48:50.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-29T08:48:50.787 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:48:50.787 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:48:50.791 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:48:50.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-29T08:48:53.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-29T08:48:53.493 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:48:53.501 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:48:53.502 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:48:53.502 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:48:53.513 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:48:53.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-29T08:48:53.526 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:48:53.527 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:48:53.527 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:48:53.527 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:48:53.527 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:48:53.533 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:48:53.662 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:48:53.663 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:48:53.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:48:53.758 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:48:53.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:48:53.803 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:48:53.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:48:53.844 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:48:53.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:48:53.849 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:48:53.849 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:48:53.908 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:48:35
2026-05-29T08:48:53.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71401, datetime.datetime(2026, 5, 29, 8, 48, 35), datetime.datetime(2026, 5, 29, 8, 48, 34), 'salt', 8.31, 78.46, None, 14.5, 95.82, 3.52, 833.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:48:53.908 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:48:53.909 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:48:53.915 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:34, diff=19.915909s, valid=True
2026-05-29T08:48:53.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:48:53.916 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:48:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:12, diff=-18.080569s, valid=True
2026-05-29T08:48:53.919 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:48:53.919 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:48:32, diff=21.927485s, valid=True
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:48:53.927 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:48:53.928 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:48:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:12, diff=-18.068856s, valid=True
2026-05-29T08:48:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:48:53.931 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:48:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:48:53.931 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=969975.931944s, valid=True
2026-05-29T08:48:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:48:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:48:53.933 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:48:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:48:53.934 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:48:53.997 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:48:53.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:48:53.998 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:48:54.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:48:54.071 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:48:54.135 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:48:54.169 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:48:54.238 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:48:54.279 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:48:54.481 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:48:54.814 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:48:54.913 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:48:54.913 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:48:54.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-29T08:48:54.914 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:48:57.089 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:48:57.090 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:49:27.120 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:49:27.120 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:49:27.120 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:49:27.512 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:49:27.529 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:49:27.733 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:49:27.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-29T08:49:27.743 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:49:27.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-29T08:49:27.752 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:49:27.752 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:49:27.759 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:49:27.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-29T08:49:30.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-29T08:49:30.291 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:49:30.298 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:49:30.299 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:49:30.299 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:49:30.309 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:49:30.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-29T08:49:30.322 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:49:30.322 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:49:30.323 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:49:30.323 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:49:30.323 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:49:30.329 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:49:30.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:49:30.458 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:49:30.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:49:30.542 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:49:30.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:49:30.584 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:49:30.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:49:30.622 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:49:30.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:49:30.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:49:30.626 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:49:30.688 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:49:05
2026-05-29T08:49:30.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71402, datetime.datetime(2026, 5, 29, 8, 49, 5), datetime.datetime(2026, 5, 29, 8, 49, 5), 'salt', 8.18, 77.89, None, 13.45, 85.75, 3.62, 833.27, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:49:30.689 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:49:30.689 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:49:30.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:05, diff=25.695119s, valid=True
2026-05-29T08:49:30.695 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:49:30.695 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:49:30.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:12, diff=18.697983s, valid=True
2026-05-29T08:49:30.698 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:49:30.698 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:49:30.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:03, diff=27.704699s, valid=True
2026-05-29T08:49:30.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:49:30.704 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:49:30.704 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:49:30.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:49:30.705 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:49:30.705 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:49:30.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:12, diff=18.707745s, valid=True
2026-05-29T08:49:30.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:49:30.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:49:30.707 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:49:30.708 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970012.708425s, valid=True
2026-05-29T08:49:30.709 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:49:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:49:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:49:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:49:30.710 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:49:30.768 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:49:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:49:30.769 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:49:30.789 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:49:30.843 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:49:30.906 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:49:31.007 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:49:31.076 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:49:31.118 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:49:31.346 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:49:31.691 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:49:31.791 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:49:31.791 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:49:31.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-29T08:49:31.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-29T08:49:32.066 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:49:32.066 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:50:02.070 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:50:02.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:50:02.070 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:50:02.560 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:50:02.572 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:50:02.771 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:50:02.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-29T08:50:02.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:50:02.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-29T08:50:02.788 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:50:02.788 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:50:02.792 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:50:02.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-29T08:50:05.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-29T08:50:05.114 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:50:05.122 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:50:05.123 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:50:05.123 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:50:05.133 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:50:05.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-29T08:50:05.147 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:50:05.147 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:50:05.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:50:05.148 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:50:05.148 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:50:05.152 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:50:05.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:50:05.277 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:50:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:50:05.373 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:50:05.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:50:05.418 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:50:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:50:05.459 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:50:05.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:50:05.464 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:50:05.464 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:50:05.529 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:49:35
2026-05-29T08:50:05.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71403, datetime.datetime(2026, 5, 29, 8, 49, 35), datetime.datetime(2026, 5, 29, 8, 49, 35), 'salt', 8.28, 78.03, None, 14.15, 93.08, 3.6, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:50:05.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:50:05.530 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:50:05.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:35, diff=30.537041s, valid=True
2026-05-29T08:50:05.537 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:50:05.537 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:50:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:50:12, diff=-6.459568s, valid=True
2026-05-29T08:50:05.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:50:05.540 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:49:35, diff=30.548318s, valid=True
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:50:05.548 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:50:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:50:12, diff=-6.447973s, valid=True
2026-05-29T08:50:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:50:05.552 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:50:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:50:05.552 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970047.552848s, valid=True
2026-05-29T08:50:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:50:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:50:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:50:05.554 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:50:05.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:50:05.618 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:50:05.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:50:05.619 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:50:05.638 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:50:05.692 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:50:05.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:50:05.785 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:50:05.834 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:50:05.873 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:50:06.083 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:50:06.424 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:50:06.523 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:50:06.524 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:50:06.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-29T08:50:06.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-29T08:50:06.725 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:50:06.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:50:36.755 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:50:36.755 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:50:36.755 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:50:37.404 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:50:37.411 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:50:37.592 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:50:37.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-29T08:50:37.602 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:50:37.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-29T08:50:37.612 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:50:37.612 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:50:37.617 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:50:37.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-29T08:50: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-29T08:50:40.011 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:50:40.015 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:50:40.015 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:50:40.015 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:50:40.024 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:50:40.036 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Night info retrieved: ('2026-05-29', '07:28', '17:40', '16:08', '06:40', 98, '19:06', '06:01')
2026-05-29T08:50:40.036 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:50:40.037 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:50:40.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:50:40.037 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:50:40.037 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:50:40.042 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:50:40.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:50:40.137 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:50:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:50:40.230 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:50:40.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:50:40.272 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:50:40.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:50:40.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:50:40.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:50:40.315 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:50:40.315 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:50:40.383 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:50:36
2026-05-29T08:50:40.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71405, datetime.datetime(2026, 5, 29, 8, 50, 36), datetime.datetime(2026, 5, 29, 8, 50, 35), 'salt', 8.18, 79.19, None, 12.07, 99.65, 3.38, 833.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:50:40.383 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:50:40.384 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:50:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:50:35, diff=5.390554s, valid=True
2026-05-29T08:50:40.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:50:40.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:50:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:12, diff=-31.606212s, valid=True
2026-05-29T08:50:40.393 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:50:40.393 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:50:31, diff=9.401174s, valid=True
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:50:40.401 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:50:40.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:12, diff=-31.595459s, valid=True
2026-05-29T08:50:40.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:50:40.404 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:50:40.404 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:50:40.405 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970082.405282s, valid=True
2026-05-29T08:50:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:50:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:50:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:50:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:50:40.407 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:50:40.469 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:50:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:50:40.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:50:40.489 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:50:40.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:50:40.669 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:50:40.702 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:50:40.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:50:40.790 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:50:41.001 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:50:41.344 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:50:41.444 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:50:41.445 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:50: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-29T08:50: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-29T08:50:41.708 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:50:41.709 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:51:11.710 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:51:11.710 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:51:11.711 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:51:12.098 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:51:12.115 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:51:12.320 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:51:12.320 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:51:12.329 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:51:12.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-29T08:51:12.338 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:51:12.338 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:51:12.342 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:51:12.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-29T08:51:14.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-29T08:51:14.699 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:51:14.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:51:14.707 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:51:14.708 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:51:14.718 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:51:14.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-29T08:51:14.738 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:51:14.739 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:51:14.739 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:51:14.739 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:51:14.740 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:51:14.746 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:51:14.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:51:14.873 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:51:14.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:51:14.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:51:15.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:51:15.005 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:51:15.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:51:15.045 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:51:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:51:15.049 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:51:15.049 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:51:15.109 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:51:06
2026-05-29T08:51:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71406, datetime.datetime(2026, 5, 29, 8, 51, 6), datetime.datetime(2026, 5, 29, 8, 51, 6), 'salt', 8.34, 79.85, None, 15.74, 91.36, 3.26, 833.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:51:15.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:51:15.109 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:51:15.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:06, diff=9.116426s, valid=True
2026-05-29T08:51:15.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:51:15.116 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:51:15.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:12, diff=3.119729s, valid=True
2026-05-29T08:51:15.119 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:51:15.119 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:01, diff=14.127517s, valid=True
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:51:15.127 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:51:15.128 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:51:15.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:12, diff=3.131026s, valid=True
2026-05-29T08:51:15.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:51:15.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:51:15.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:51:15.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970117.131798s, valid=True
2026-05-29T08:51:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:51:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:51:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:51:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:51:15.133 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:51:15.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:51:15.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:51:15.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:51:15.217 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:51:15.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:51:15.332 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:51:15.365 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:51:15.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:51:15.455 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:51:15.668 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:51:16.009 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:51:16.111 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:51:16.111 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:51:16.111 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:51:16.111 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:51:16.282 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:51:16.334 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:51:46.354 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:51:46.354 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:51:46.354 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:51:46.833 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:51:46.843 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:51:47.105 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:51:47.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-29T08:51:47.114 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:51:47.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-29T08:51:47.122 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:51:47.122 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:51:47.126 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:51:47.126 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:51:49.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-29T08:51:49.758 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:51:49.766 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:51:49.767 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:51:49.767 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:51:49.775 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:51:49.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-29T08:51:49.789 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:51:49.789 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:51:49.790 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:51:49.790 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:51:49.790 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:51:49.796 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:51:49.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:51:49.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:51:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:51:49.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:51:50.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:51:50.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:51:50.053 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:51:50.054 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:51:50.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:51:50.058 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:51:50.058 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:51:50.116 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:51:36
2026-05-29T08:51:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71407, datetime.datetime(2026, 5, 29, 8, 51, 36), datetime.datetime(2026, 5, 29, 8, 51, 36), 'salt', 8.31, 79.22, None, 14.79, 102.14, 3.38, 833.15, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:51:50.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:51:50.117 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:51:50.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:36, diff=14.131551s, valid=True
2026-05-29T08:51:50.131 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:51:50.131 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:51:50.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:12, diff=-21.865205s, valid=True
2026-05-29T08:51:50.134 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:51:50.134 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:51:31, diff=19.142268s, valid=True
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:51:50.142 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:51:50.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:12, diff=-21.854313s, valid=True
2026-05-29T08:51:50.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:51:50.145 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:51:50.145 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:51:50.146 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970152.146379s, valid=True
2026-05-29T08:51:50.147 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:51:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:51:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:51:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:51:50.148 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:51:50.208 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:51:50.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:51:50.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:51:50.228 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:51:50.281 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:51:50.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:51:50.375 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:51:50.424 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:51:50.464 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:51:50.674 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:51:51.012 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:51:51.110 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:51:51.110 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:51:51.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-29T08:51:51.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-29T08:51:51.370 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:51:51.370 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:52:21.385 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:52:21.385 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:52:21.385 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:52:21.780 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:52:21.797 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:52:22.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:52:22.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-29T08:52:22.014 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:52:22.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-29T08:52:22.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:52:22.023 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:52:22.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:52:22.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-29T08:52:24.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-29T08:52:24.522 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:52:24.530 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:52:24.530 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:52:24.531 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:52:24.541 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:52:24.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-29T08:52:24.554 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:52:24.555 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:52:24.555 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:52:24.556 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:52:24.556 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:52:24.561 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:52:24.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:52:24.687 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:52:24.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:52:24.781 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:52:24.824 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:52:24.825 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:52:24.865 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:52:24.866 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:52:24.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:52:24.870 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:52:24.870 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:52:24.930 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:52:07
2026-05-29T08:52:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71408, datetime.datetime(2026, 5, 29, 8, 52, 7), datetime.datetime(2026, 5, 29, 8, 52, 6), 'salt', 8.28, 78.52, None, 13.97, 112.66, 3.51, 833.08, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:52:24.930 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:52:24.930 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:52:24.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:06, diff=18.937327s, valid=True
2026-05-29T08:52:24.937 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:52:24.937 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:52:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:12, diff=12.940753s, valid=True
2026-05-29T08:52:24.940 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:52:24.940 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:52:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:02, diff=22.948634s, valid=True
2026-05-29T08:52:24.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:52:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:52:24.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:52:24.948 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:52:24.949 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:52:24.949 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:52:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:12, diff=12.952251s, valid=True
2026-05-29T08:52:24.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:52:24.952 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:52:24.952 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:52:24.953 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970186.953049s, valid=True
2026-05-29T08:52:24.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:52:24.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:52:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:52:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:52:24.955 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:52:25.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:52:25.018 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:52:25.019 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:52:25.038 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:52:25.091 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:52:25.151 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:52:25.184 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:52:25.233 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:52:25.274 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:52:25.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:52:25.839 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:52:25.997 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:52:25.997 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:52:25.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-29T08:52:25.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-29T08:52:26.163 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:52:26.163 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:52:56.187 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:52:56.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:52:56.188 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:52:56.660 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:52:56.680 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:52:56.895 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:52:56.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-29T08:52:56.905 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:52:56.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-29T08:52:56.914 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:52:56.914 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:52:56.918 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:52:56.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-29T08:52:59.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-29T08:52:59.618 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:52:59.626 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:52:59.628 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:52:59.628 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:52:59.639 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:52:59.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-29T08:52:59.652 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:52:59.653 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:52:59.653 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:52:59.654 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:52:59.654 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:52:59.660 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:52:59.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:52:59.788 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:52:59.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:52:59.879 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:52:59.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:52:59.923 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:52:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:52:59.963 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:52:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:52:59.968 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:52:59.968 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:53:00.030 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:52:37
2026-05-29T08:53:00.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71409, datetime.datetime(2026, 5, 29, 8, 52, 37), datetime.datetime(2026, 5, 29, 8, 52, 36), 'salt', 8.31, 78.79, None, 14.57, 106.04, 3.46, 833.33, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:53:00.030 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:53:00.030 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:53:00.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:36, diff=24.037308s, valid=True
2026-05-29T08:53:00.037 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:53:00.037 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:53:00.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:12, diff=-11.959525s, valid=True
2026-05-29T08:53:00.040 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:53:00.040 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:52:33, diff=27.047263s, valid=True
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:53:00.047 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:53:00.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:12, diff=-11.949627s, valid=True
2026-05-29T08:53:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:53:00.050 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:53:00.050 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:53:00.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970222.051185s, valid=True
2026-05-29T08:53:00.052 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:53:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:53:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:53:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:53:00.053 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:53:00.116 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:53:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:53:00.117 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:53:00.138 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:53:00.192 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:53:00.252 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:53:00.286 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:53:00.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:53:00.375 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:53:00.585 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:53:00.929 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:53:01.029 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:53:01.029 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:53:01.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-29T08:53:01.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-29T08:53:01.196 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:53:01.196 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:53:31.203 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:53:31.203 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:53:31.203 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:53:31.595 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:53:31.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:53:31.822 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:53:31.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-29T08:53:31.832 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:53:31.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-29T08:53:31.840 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:53:31.840 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:53:31.844 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:53:31.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-29T08:53:34.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:53:34.236 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:53:34.243 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:53:34.244 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:53:34.244 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:53:34.254 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:53:34.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-29T08:53:34.268 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:53:34.268 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:53:34.268 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:53:34.269 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:53:34.269 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:53:34.273 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:53:34.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:53:34.399 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:53:34.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:53:34.493 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:53:34.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:53:34.538 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:53:34.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:53:34.578 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:53:34.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:53:34.582 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:53:34.582 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:53:34.641 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:53:07
2026-05-29T08:53:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71410, datetime.datetime(2026, 5, 29, 8, 53, 7), datetime.datetime(2026, 5, 29, 8, 53, 7), 'salt', 8.31, 78.99, None, 14.05, 107.54, 3.42, 833.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:53:34.641 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:53:34.642 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:53:34.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:07, diff=27.649027s, valid=True
2026-05-29T08:53:34.649 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:53:34.649 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:53:34.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:12, diff=22.652433s, valid=True
2026-05-29T08:53:34.652 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:53:34.652 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:53:34.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:04, diff=30.660679s, valid=True
2026-05-29T08:53:34.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:53:34.660 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:53:34.660 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:53:34.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:53:34.661 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:53:34.661 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:53:34.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:53:12, diff=22.664696s, valid=True
2026-05-29T08:53:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:53:34.664 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:53:34.664 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:53:34.665 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970256.665517s, valid=True
2026-05-29T08:53:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:53:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:53:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:53:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:53:34.667 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:53:34.731 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:53:34.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:53:34.732 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:53:34.752 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:53:34.805 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:53:34.866 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:53:34.899 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:53:34.948 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:53:34.987 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:53:35.195 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:53:35.608 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:53:35.707 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:53:35.707 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:53:35.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-29T08:53:35.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-29T08:53:35.874 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:53:35.875 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:54:05.890 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:54:05.890 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:54:05.890 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:54:06.317 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:54:06.337 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:54:06.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:54:06.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-29T08:54:06.566 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:54:06.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-29T08:54:06.576 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:54:06.576 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:54:06.580 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:54:06.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-29T08:54:09.075 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:54:09.075 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:54:09.081 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:54:09.081 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:54:09.081 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:54:09.091 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:54:09.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-29T08:54:09.104 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:54:09.104 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:54:09.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:54:09.104 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:54:09.105 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:54:09.109 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:54:09.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:54:09.236 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:54:09.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:54:09.332 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:54:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:54:09.386 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:54:09.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:54:09.428 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:54:09.432 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:54:09.433 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:54:09.433 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:54:09.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:54:08
2026-05-29T08:54:09.494 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71412, datetime.datetime(2026, 5, 29, 8, 54, 8), datetime.datetime(2026, 5, 29, 8, 54, 7), 'salt', 8.21, 78.79, None, 14.72, 80.61, 3.46, 833.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:54:09.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:54:09.495 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:54:09.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:07, diff=2.502163s, valid=True
2026-05-29T08:54:09.502 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:54:09.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:54:09.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:12, diff=-2.494355s, valid=True
2026-05-29T08:54:09.505 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:54:09.505 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:54:09.513 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:07, diff=2.5138s, valid=True
2026-05-29T08:54:09.513 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:54:09.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:54:09.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:54:09.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:54:09.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:54:09.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:54:09.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:12, diff=-2.482464s, valid=True
2026-05-29T08:54:09.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:54:09.517 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:54:09.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:54:09.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970291.518369s, valid=True
2026-05-29T08:54:09.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:54:09.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:54:09.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:54:09.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:54:09.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:54:09.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:54:09.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:54:09.584 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:54:09.604 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:54:09.657 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:54:09.717 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:54:09.750 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:54:09.800 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:54:09.841 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:54:10.070 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:54:10.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:54:10.520 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:54:10.520 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:54:10.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-29T08:54:10.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-29T08:54:10.913 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:54:10.913 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:54:40.922 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:54:40.922 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:54:40.922 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:54:41.313 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:54:41.330 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:54:41.535 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:54:41.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-29T08:54:41.545 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:54:41.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-29T08:54:41.555 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:54:41.555 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:54:41.559 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:54:41.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-29T08:54:44.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-29T08:54:44.037 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:54:44.045 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:54:44.046 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:54:44.046 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:54:44.056 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:54:44.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-29T08:54:44.069 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:54:44.070 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:54:44.070 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:54:44.070 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:54:44.070 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:54:44.076 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:54:44.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:54:44.206 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:54:44.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:54:44.303 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:54:44.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:54:44.347 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:54:44.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:54:44.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:54:44.392 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:54:44.393 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:54:44.393 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:54:44.451 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:54:38
2026-05-29T08:54:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71413, datetime.datetime(2026, 5, 29, 8, 54, 38), datetime.datetime(2026, 5, 29, 8, 54, 37), 'salt', 8.08, 78.42, None, 14.75, 97.04, 3.52, 833.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:54:44.452 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:54:44.452 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:54:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:37, diff=7.459088s, valid=True
2026-05-29T08:54:44.459 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:54:44.459 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:54:44.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:12, diff=-27.537542s, valid=True
2026-05-29T08:54:44.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:54:44.462 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:54:33, diff=11.470407s, valid=True
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:54:44.470 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:54:44.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:12, diff=-27.525979s, valid=True
2026-05-29T08:54:44.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:54:44.474 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:54:44.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:54:44.474 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970326.474814s, valid=True
2026-05-29T08:54:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:54:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:54:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:54:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:54:44.476 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:54:44.539 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:54:44.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:54:44.540 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:54:44.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:54:44.613 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:54:44.673 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:54:44.707 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:54:44.756 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:54:44.869 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:54:45.078 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:54:45.419 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:54:45.518 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:54:45.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:54:45.518 [INFO] [MainThread] [clean.py] [copy_files()] Copying files from /home/io/development/weatherplots/weatherplots/images to /home/io/development/saaoweather-web/static
2026-05-29T08:54:45.518 [DEBUG] [MainThread] [clean.py] [copy_files()] Executing command: rsync -av /home/io/development/weatherplots/weatherplots/images/ /home/io/development/saaoweather-web/static
2026-05-29T08:54:45.694 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:54:45.694 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:55:15.725 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:55:15.725 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:55:15.725 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:55:16.049 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:55:16.067 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:55:16.281 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:55:16.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-29T08:55:16.289 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:55:16.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-29T08:55:16.299 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:55:16.299 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:55:16.304 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:55:16.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-29T08:55:18.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-29T08:55:18.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:55:18.856 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:55:18.857 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:55:18.857 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:55:18.867 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:55:18.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-29T08:55:18.881 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:55:18.881 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:55:18.882 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:55:18.882 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:55:18.882 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:55:18.887 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:55:19.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:55:19.016 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:55:19.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:55:19.113 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:55:19.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:55:19.167 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:55:19.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:55:19.208 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:55:19.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:55:19.212 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:55:19.212 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:55:19.270 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:55:08
2026-05-29T08:55:19.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71414, datetime.datetime(2026, 5, 29, 8, 55, 8), datetime.datetime(2026, 5, 29, 8, 55, 8), 'salt', 8.04, 78.59, None, 13.83, 94.93, 3.48, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:55:19.271 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:55:19.271 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:55:19.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:08, diff=11.278379s, valid=True
2026-05-29T08:55:19.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:55:19.278 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:55:19.281 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:12, diff=7.2819s, valid=True
2026-05-29T08:55:19.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:55:19.282 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:03, diff=16.290155s, valid=True
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:55:19.290 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:55:19.293 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:12, diff=7.293877s, valid=True
2026-05-29T08:55:19.293 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:55:19.294 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:55:19.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:55:19.294 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970361.294697s, valid=True
2026-05-29T08:55:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:55:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:55:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:55:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:55:19.296 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:55:19.361 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:55:19.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:55:19.362 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:55:19.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:55:19.435 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:55:19.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:55:19.530 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:55:19.585 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:55:19.627 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:55:19.844 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:55:20.222 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:55:20.319 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:55:20.319 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:55:20.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-29T08:55:20.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-29T08:55:20.488 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:55:20.488 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:55:50.518 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:55:50.518 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:55:50.518 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:55:50.901 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:55:50.919 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:55:51.129 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:55:51.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-29T08:55:51.138 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:55:51.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-29T08:55:51.147 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:55:51.147 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:55:51.151 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:55:51.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-29T08:55:54.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-29T08:55:54.138 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:55:54.145 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:55:54.146 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:55:54.146 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:55:54.156 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:55:54.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-29T08:55:54.170 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:55:54.170 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:55:54.171 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:55:54.171 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:55:54.171 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:55:54.177 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:55:54.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:55:54.309 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:55:54.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:55:54.406 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:55:54.449 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:55:54.450 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:55:54.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:55:54.489 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:55:54.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:55:54.494 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:55:54.494 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:55:54.560 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:55:38
2026-05-29T08:55:54.560 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71415, datetime.datetime(2026, 5, 29, 8, 55, 38), datetime.datetime(2026, 5, 29, 8, 55, 38), 'salt', 8.11, 79.12, None, 14.4, 95.75, 3.39, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:55:54.561 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:55:54.561 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:55:54.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:38, diff=16.577533s, valid=True
2026-05-29T08:55:54.577 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:55:54.577 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:55:54.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:12, diff=-17.416712s, valid=True
2026-05-29T08:55:54.583 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:55:54.583 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:55:34, diff=20.591426s, valid=True
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:55:54.591 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:55:54.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:12, diff=-17.404792s, valid=True
2026-05-29T08:55:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:55:54.595 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:55:54.595 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:55:54.596 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970396.596017s, valid=True
2026-05-29T08:55:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:55:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:55:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:55:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:55:54.598 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:55:54.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:55:54.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:55:54.663 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:55:54.684 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:55:54.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:55:54.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:55:54.904 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:55:54.954 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:55:54.996 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:55:55.221 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:55:55.564 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:55:55.664 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:55:55.664 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:55:55.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-29T08:55:55.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-29T08:55:55.837 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:55:55.837 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:56:25.847 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:56:25.847 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:56:25.848 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:56:26.004 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:56:26.016 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:56:26.211 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:56:26.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-29T08:56:26.220 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:56:26.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-29T08:56:26.231 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:56:26.231 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:56:26.235 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:56:26.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-29T08:56:28.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-29T08:56:28.762 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:56:28.769 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:56:28.770 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:56:28.770 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:56:28.780 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:56:28.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-29T08:56:28.794 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:56:28.794 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:56:28.795 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:56:28.795 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:56:28.795 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:56:28.804 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:56:28.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:56:28.932 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:56:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:56:29.034 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:56:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:56:29.079 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:56:29.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:56:29.120 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:56:29.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:56:29.125 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:56:29.125 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:56:29.187 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:56:09
2026-05-29T08:56:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71416, datetime.datetime(2026, 5, 29, 8, 56, 9), datetime.datetime(2026, 5, 29, 8, 56, 8), 'salt', 8.21, 79.75, None, 13.16, 100.59, 3.28, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:56:29.187 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:56:29.187 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:56:29.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:08, diff=21.194766s, valid=True
2026-05-29T08:56:29.194 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:56:29.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:56:29.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:12, diff=17.198184s, valid=True
2026-05-29T08:56:29.198 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:56:29.198 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:04, diff=25.206052s, valid=True
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:56:29.206 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:56:29.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:12, diff=17.209679s, valid=True
2026-05-29T08:56:29.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:56:29.209 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:56:29.209 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:56:29.210 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970431.21046s, valid=True
2026-05-29T08:56:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:56:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:56:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:56:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:56:29.212 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:56:29.277 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:56:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:56:29.278 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:56:29.299 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:56:29.352 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:56:29.414 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:56:29.446 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:56:29.496 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:56:29.535 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:56:29.744 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:56:30.101 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:56:30.202 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:56:30.202 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:56:30.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-29T08:56:30.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-29T08:56:30.451 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:56:30.452 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:57:00.482 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:57:00.482 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:57:00.482 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:57:00.941 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:57:00.952 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:57:01.135 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:57:01.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-29T08:57:01.142 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:57:01.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-29T08:57:01.152 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:57:01.152 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:57:01.160 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:57:01.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-29T08:57:04.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-29T08:57:04.331 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:57:04.338 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:57:04.339 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:57:04.339 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:57:04.350 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:57:04.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-29T08:57:04.363 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:57:04.364 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:57:04.364 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:57:04.364 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:57:04.365 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:57:04.372 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:57:04.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:57:04.481 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:57:04.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:57:04.579 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:57:04.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:57:04.626 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:57:04.669 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:57:04.670 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:57:04.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:57:04.675 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:57:04.675 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:57:04.740 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:56:39
2026-05-29T08:57:04.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71417, datetime.datetime(2026, 5, 29, 8, 56, 39), datetime.datetime(2026, 5, 29, 8, 56, 38), 'salt', 8.24, 79.88, None, 12.49, 92.11, 3.26, 833.32, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:57:04.740 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:57:04.740 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:57:04.747 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:38, diff=26.747892s, valid=True
2026-05-29T08:57:04.748 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:57:04.748 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:57:04.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:12, diff=-7.248684s, valid=True
2026-05-29T08:57:04.751 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:57:04.751 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:56:34, diff=30.7593s, valid=True
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:57:04.759 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:57:04.762 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:12, diff=-7.237064s, valid=True
2026-05-29T08:57:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:57:04.763 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:57:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:57:04.763 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970466.763756s, valid=True
2026-05-29T08:57:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:57:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:57:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:57:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:57:04.765 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:57:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:57:04.829 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:57:04.830 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:57:04.916 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:57:04.969 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:57:05.029 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:57:05.062 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:57:05.112 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:57:05.152 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:57:05.361 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:57:05.702 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:57:05.802 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:57:05.802 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:57:05.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-29T08:57:05.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-29T08:57:05.977 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:57:05.977 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:57:36.007 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:57:36.007 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:57:36.007 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:57:36.322 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:57:36.332 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:57:36.531 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:57:36.531 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching SAAO all-sky image from http://skycam.suth.saao.ac.za/skycam/Data/AllSkyCurrentImage.JPG
2026-05-29T08:57:36.541 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:57:36.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-29T08:57:36.549 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:57:36.549 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:57:36.558 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:57:36.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-29T08:57:38.935 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Renaming /home/io/development/weatherplots/weatherplots/images/lastsnap.jpg to /home/io/development/weatherplots/weatherplots/images/allskybw.jpg
2026-05-29T08:57:38.935 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:57:38.943 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:57:38.944 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:57:38.944 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:57:38.953 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:57:38.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-29T08:57:38.966 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:57:38.967 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:57:38.967 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:57:38.967 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:57:38.967 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:57:38.973 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:57:39.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from salt
2026-05-29T08:57:39.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:57:39.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1428 rows from monet
2026-05-29T08:57:39.218 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:57:39.264 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:57:39.265 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:57:39.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:57:39.306 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:57:39.310 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:57:39.311 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:57:39.311 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:57:39.371 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:57:09
2026-05-29T08:57:39.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71418, datetime.datetime(2026, 5, 29, 8, 57, 9), datetime.datetime(2026, 5, 29, 8, 57, 8), 'salt', 8.31, 79.42, None, 14.05, 87.04, 3.35, 833.14, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:57:39.371 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:57:39.371 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 10 fields
2026-05-29T08:57:39.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:08, diff=31.37871s, valid=True
2026-05-29T08:57:39.378 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:57:39.378 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:57:39.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:12, diff=27.382293s, valid=True
2026-05-29T08:57:39.382 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:57:39.382 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1428 rows. Structure expected: 11 fields
2026-05-29T08:57:39.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:05, diff=34.390496s, valid=True
2026-05-29T08:57:39.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:57:39.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:57:39.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:57:39.390 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:57:39.391 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:57:39.391 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:57:39.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:57:12, diff=27.394358s, valid=True
2026-05-29T08:57:39.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:57:39.394 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:57:39.394 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:57:39.395 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970501.395185s, valid=True
2026-05-29T08:57:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:57:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:57:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:57:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:57:39.397 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:57:39.461 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:57:39.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:57:39.462 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:57:39.483 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:57:39.535 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:57:39.596 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:57:39.630 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:57:39.680 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:57:39.720 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:57:39.937 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:57:40.287 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:57:40.388 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:57:40.388 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:57:40.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-29T08:57:40.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-29T08:57:40.560 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:57:40.560 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:58:10.561 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:58:10.561 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:58:10.561 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:58:10.980 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:58:10.998 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:58:11.267 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:58:11.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-29T08:58:11.275 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:58:11.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-29T08:58:11.285 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:58:11.285 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:58:11.290 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:58:11.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-29T08:58:13.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-29T08:58:13.616 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:58:13.625 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:58:13.626 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:58:13.626 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:58:13.637 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:58:13.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-29T08:58:13.650 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:58:13.651 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:58:13.651 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:58:13.651 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:58:13.651 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:58:13.657 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:58:13.790 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:58:13.791 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:58:13.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:58:13.890 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:58:13.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:58:13.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:58:13.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:58:13.976 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:58:13.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:58:13.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:58:13.981 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:58:14.040 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:58:10
2026-05-29T08:58:14.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71420, datetime.datetime(2026, 5, 29, 8, 58, 10), datetime.datetime(2026, 5, 29, 8, 58, 9), 'salt', 8.44, 78.49, None, 13.66, 90.56, 3.52, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:58:14.041 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:58:14.041 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:58:14.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:09, diff=5.048219s, valid=True
2026-05-29T08:58:14.048 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:58:14.048 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:58:14.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:12, diff=2.051614s, valid=True
2026-05-29T08:58:14.051 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:58:14.051 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:08, diff=6.059445s, valid=True
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:58:14.059 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:58:14.060 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:58:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:12, diff=2.063063s, valid=True
2026-05-29T08:58:14.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:58:14.063 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:58:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:58:14.063 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970536.063929s, valid=True
2026-05-29T08:58:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:58:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:58:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:58:14.065 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:58:14.066 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:58:14.128 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:58:14.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:58:14.129 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:58:14.149 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:58:14.202 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:58:14.264 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:58:14.297 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:58:14.346 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:58:14.386 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:58:14.598 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:58:14.939 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:58:15.038 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:58:15.039 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:58:15.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-29T08:58:15.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-29T08:58:15.205 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:58:15.205 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:58:45.227 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:58:45.227 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:58: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-29T08:58:45.453 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:58:45.470 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:58:45.676 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:58:45.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-29T08:58:45.685 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:58: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-29T08:58:45.693 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:58:45.693 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:58:45.700 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:58:45.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-29T08:58:49.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-29T08:58:49.083 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:58:49.090 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:58:49.091 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:58:49.092 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:58:49.100 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:58:49.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-29T08:58:49.113 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:58:49.114 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:58:49.114 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:58:49.115 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:58:49.115 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:58:49.121 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:58:49.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:58:49.247 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:58:49.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:58:49.341 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:58:49.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:58:49.388 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:58:49.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:58:49.429 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:58:49.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:58:49.434 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:58:49.434 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:58:49.495 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:58:40
2026-05-29T08:58:49.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71421, datetime.datetime(2026, 5, 29, 8, 58, 40), datetime.datetime(2026, 5, 29, 8, 58, 40), 'salt', 8.41, 77.95, None, 13.41, 87.25, 3.62, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:58:49.495 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:58:49.496 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:58:49.502 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:40, diff=9.502871s, valid=True
2026-05-29T08:58:49.503 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:58:49.503 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:58:49.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:12, diff=-22.493618s, valid=True
2026-05-29T08:58:49.506 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:58:49.506 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:58:40, diff=9.514269s, valid=True
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:58:49.514 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T08:58:49.517 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:12, diff=-22.482101s, valid=True
2026-05-29T08:58:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:58:49.518 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:58:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:58:49.518 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970571.518705s, valid=True
2026-05-29T08:58:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:58:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:58:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:58:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:58:49.520 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:58:49.588 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:58:49.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:58:49.589 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:58:49.609 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:58:49.662 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:58:49.738 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:58:49.771 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:58:49.821 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:58:49.871 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:58:50.096 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:58:50.500 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:58:50.599 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:58:50.600 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:58:50.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-29T08:58:50.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-29T08:58:51.479 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:58:51.479 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:59:21.489 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:59:21.490 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:59:21.490 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:59:21.740 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:59:21.754 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:59:21.957 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:59:21.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-29T08:59:21.967 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:59:21.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-29T08:59:21.977 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:59:21.977 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:59:21.981 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:59:21.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-29T08:59:24.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-29T08:59:24.765 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:59:24.773 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:59:24.774 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:59:24.774 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:59:24.785 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:59:24.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-29T08:59:24.799 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:59:24.799 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:59:24.799 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:59:24.800 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:59:24.800 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:59:24.807 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:59:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:59:24.931 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:59:25.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:59:25.027 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:59:25.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:59:25.065 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:59:25.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 662 rows from lcogt
2026-05-29T08:59:25.106 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T08:59:25.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T08:59:25.112 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T08:59:25.112 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T08:59:25.172 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:59:10
2026-05-29T08:59:25.172 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71422, datetime.datetime(2026, 5, 29, 8, 59, 10), datetime.datetime(2026, 5, 29, 8, 59, 10), 'salt', 8.41, 77.39, None, 12.85, 82.98, 3.72, 833.2, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T08:59:25.173 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T08:59:25.173 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T08:59:25.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:10, diff=15.180057s, valid=True
2026-05-29T08:59:25.180 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T08:59:25.180 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:59:25.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:12, diff=13.183428s, valid=True
2026-05-29T08:59:25.183 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T08:59:25.183 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:05, diff=20.19132s, valid=True
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T08:59:25.191 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 662 rows. Structure expected: 10 fields
2026-05-29T08:59:25.194 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:12, diff=13.194948s, valid=True
2026-05-29T08:59:25.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T08:59:25.195 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T08:59:25.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T08:59:25.195 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970607.195754s, valid=True
2026-05-29T08:59:25.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T08:59:25.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T08:59:25.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T08:59:25.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T08:59:25.197 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T08:59:25.261 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T08:59:25.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T08:59:25.262 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T08:59:25.282 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T08:59:25.335 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T08:59:25.396 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T08:59:25.429 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T08:59:25.479 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T08:59:25.519 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T08:59:25.746 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:59:26.087 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T08:59:26.187 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T08:59:26.187 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T08:59:26.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-29T08:59:26.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-29T08:59:26.357 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T08:59:26.357 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
2026-05-29T08:59:56.387 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Iteration started
2026-05-29T08:59:56.387 [INFO] [MainThread] [run_weather_plot.py] [run()] Fetching web images and data
2026-05-29T08:59:56.388 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching meteogram from https://www.yr.no/en/content/2-949303/meteogram.svg
2026-05-29T08:59:56.779 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saving SVG to /home/io/development/weatherplots/weatherplots/images/meteogram.svg
2026-05-29T08:59:56.796 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Converting meteogram to PNG
2026-05-29T08:59:57.003 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] PNG saved to /home/io/development/weatherplots/weatherplots/images/meteogram_final.png
2026-05-29T08:59:57.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-29T08:59:57.013 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImage.JPG
2026-05-29T08:59:57.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-29T08:59:57.022 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/AllSkyCurrentImageMarked.JPG
2026-05-29T08:59:57.022 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching seeing.txt from http://timdimm.suth/seeing/seeing.txt
2026-05-29T08:59:57.028 [DEBUG] [MainThread] [fetch_web_files.py] [fetch_images()] Saved to /home/io/development/weatherplots/weatherplots/images/seeing.txt
2026-05-29T08:59:57.028 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Fetching LCO all-sky image from https://lco.global/camera/data/cpt/allsky/lastsnap.jpg
2026-05-29T08:59:59.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-29T08:59:59.679 [INFO] [MainThread] [fetch_web_files.py] [fetch_images()] Successfully processed LCO all-sky image
2026-05-29T08:59:59.687 [INFO] [MainThread] [run_weather_plot.py] [run()] Getting night info
2026-05-29T08:59:59.687 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Retrieving night info for 2026-05-29
2026-05-29T08:59:59.687 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Connecting to SDB at sdb.salt
2026-05-29T08:59:59.698 [DEBUG] [MainThread] [fetch_web_files.py] [get_night_info()] Executing query for date 2026-05-29
2026-05-29T08:59:59.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-29T08:59:59.711 [INFO] [MainThread] [fetch_web_files.py] [get_night_info()] Successfully updated /home/io/development/weatherplots/weatherplots/images/night_info.dat
2026-05-29T08:59:59.712 [INFO] [MainThread] [run_weather_plot.py] [run()] Creating weatherplots
2026-05-29T08:59:59.712 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Fetching all weather
2026-05-29T08:59:59.712 [INFO] [MainThread] [database_utils.py] [fetch_all_weather_data()] Bulk fetching weather data for interval: 43200s
2026-05-29T08:59:59.713 [DEBUG] [MainThread] [database_utils.py] [get_db_connection()] Connecting to database at 10.2.100.54 (user=suthweather, db=suthweatherdb)
2026-05-29T08:59:59.720 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from salt for last 43200s
2026-05-29T08:59:59.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from salt
2026-05-29T08:59:59.841 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from monet for last 43200s
2026-05-29T08:59:59.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 1429 rows from monet
2026-05-29T08:59:59.935 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T08:59:59.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T08:59:59.981 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from lcogt for last 43200s
2026-05-29T09:00:00.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 663 rows from lcogt
2026-05-29T09:00:00.020 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Fetching data from seeing for last 43200s
2026-05-29T09:00:00.024 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Got seeing data - should be 100 records
2026-05-29T09:00:00.025 [DEBUG] [MainThread] [database_utils.py] [get_station_weather()] Retrieved 100 rows from seeing
2026-05-29T09:00:00.025 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Fetching latest current_ranked_weather record
2026-05-29T09:00:00.087 [DEBUG] [MainThread] [database_utils.py] [get_current_avg_weather()] Found current_ranked_weather record from 2026-05-29 08:59:40
2026-05-29T09:00:00.087 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] [(71423, datetime.datetime(2026, 5, 29, 8, 59, 40), datetime.datetime(2026, 5, 29, 8, 59, 40), 'salt', 8.37, 77.36, None, 11.89, 96.45, 3.72, 833.26, 'DRY', 0, None, 0, 0, 0, 0)]
2026-05-29T09:00:00.088 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SALT data
2026-05-29T09:00:00.088 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 10 fields
2026-05-29T09:00:00.093 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:40, diff=20.093872s, valid=True
2026-05-29T09:00:00.094 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCO data
2026-05-29T09:00:00.094 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:00:00.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:12, diff=-11.90298s, valid=True
2026-05-29T09:00:00.097 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing MONET data
2026-05-29T09:00:00.097 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 1429 rows. Structure expected: 11 fields
2026-05-29T09:00:00.103 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 08:59:36, diff=24.103961s, valid=True
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing WASP data
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SCM1 data
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] No data available, creating dummy record
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing LCOGT_CM data
2026-05-29T09:00:00.104 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 663 rows. Structure expected: 10 fields
2026-05-29T09:00:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-29 09:00:12, diff=-11.89288s, valid=True
2026-05-29T09:00:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Processing SEEING data
2026-05-29T09:00:00.107 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] The seeing data IS available
2026-05-29T09:00:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Processing data with 100 rows. Structure expected: 4 fields
2026-05-29T09:00:00.107 [DEBUG] [MainThread] [data_processing.py] [process_station_data()] Data validation: last_time=2026-05-18 03:22:38, diff=970642.107805s, valid=True
2026-05-29T09:00:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Looking at seeing times
2026-05-29T09:00:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing first time = 2026-05-18 02:24:28
2026-05-29T09:00:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing last time = 2026-05-18 03:22:38
2026-05-29T09:00:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Seeing timediff = 0:58:10
2026-05-29T09:00:00.109 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Calculating datetime arrays for plotting
2026-05-29T09:00:00.174 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Setting up Matplotlib figure and gridspec
2026-05-29T09:00:00.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Mapping current_avg_weather values
2026-05-29T09:00:00.175 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Error and Warning Area
2026-05-29T09:00:00.196 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Relative Humidity
2026-05-29T09:00:00.248 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Temperature and Dew Point
2026-05-29T09:00:00.308 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Cloud Cover
2026-05-29T09:00:00.341 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed and Direction (Polar)
2026-05-29T09:00:00.390 [DEBUG] [MainThread] [weather_plots.py] [create_weatherplots()] Plotting Wind Speed instead of Seeing
2026-05-29T09:00:00.432 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] Saving final image to /home/io/development/weatherplots/weatherplots/images/image.png
2026-05-29T09:00:00.715 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:00:01.066 [DEBUG] [MainThread] [_base.py] [_update_title_position()] title position was updated manually, not adjusting
2026-05-29T09:00:01.171 [INFO] [MainThread] [weather_plots.py] [create_weatherplots()] image.png successfuly saved
2026-05-29T09:00:01.171 [INFO] [MainThread] [run_weather_plot.py] [run()] Copying files to distribution directory
2026-05-29T09:00:01.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:00:01.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:00:01.415 [INFO] [MainThread] [clean.py] [copy_files()] Successfully uploaded images and files to /home/io/development/saaoweather-web/static
2026-05-29T09:00:01.415 [DEBUG] [MainThread] [run_weather_plot.py] [run()] Sleeping for 30 seconds...
